pidstat 说明
pidstat 用于监控进程和线程的系统资源使用情况(如CPU、内存、I/O等)。
pidstat 安装
yum -y install sysstat
pidstat 基础用法
pidstat [选项] [<间隔时间> [<统计次数>]] [-e <程序名> <参数>]
常用选项说明
| 选项 | 功能 | 
| -d | 监控进程的 I/O 使用情况(读/写速率) | 
| -H | 显示进程的 层次结构(父子进程关系) | 
| -h | 水平输出,所有数据在一行显示 | 
| -I | 在 SMP 系统中,汇总所有 CPU 的统计值(默认每 CPU 分开显示) | 
| -l | 显示进程的 完整命令行(而不仅是进程名) | 
| -R | 监控进程的 实时优先级 和 调度策略 | 
| -r | 监控进程的 内存使用情况(缺页、内存占用等) | 
| -s | 监控进程的 栈使用情况 | 
| -t | 显示与进程关联的 线程统计信息 | 
| -U [用户名] | 监控指定用户的进程(不指定用户名时显示所有用户) | 
| -u | 监控进程的 CPU 使用率(默认行为,可省略) | 
| -V | 显示 sysstat包的 版本信息 | 
| -v | 监控进程的 内核表使用情况(如打开文件数、线程数等) | 
| -w | 监控进程的 上下文切换次数(自愿/非自愿切换) | 
| -C <命令> | 仅监控 命令行中包含指定字符串 的进程(模糊匹配)(如 -C "python"会匹配python3 app.py) | 
| -G <进程名> | 仅监控 进程名中包含指定字符串 的进程(模糊匹配)(即 ps -e中显示的进程名) | 
| -p {PID列表} | 监控指定 PID 的进程(支持 SELF表示当前 shell,ALL表示所有进程) | 
| -T {TASK} | 监控 任务级别 的统计(默认) | 
| --dec={0/1/2} | 控制输出的小数位数(0=无小数,1=保留1位,2=保留2位) | 
| --human | 以 人类可读格式 显示数据(如 KB/MB/GB 代替字节数) | 
常用场景示例
监控所有进程的 CPU 使用率(默认)
pidstat 2 5      # 每 2 秒采样一次,共采样 5 次
Linux 4.19.90-2102.2.0.0062.ctl2.x86_64 (localhost.localdomain) 	04/23/2025 	_x86_64_	(4 CPU)
05:22:56 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
05:22:58 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
05:23:00 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
05:23:02 PM     0     18024    0.00    0.50    0.00    0.00    0.50     2  pidstat
05:23:02 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
05:23:04 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
Average:      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
Average:        0     18024    0.00    0.10    0.00    0.00    0.10     -  pidstat
UID 运行进程的用户ID(如 root 用户为 0)
PID 进程ID
%usr  进程在用户态消耗的 CPU 百分比(应用程序代码执行)
%system 进程在内核态消耗的 CPU 百分比(系统调用、中断处理等)
%guest  进程在虚拟机中消耗的 CPU 百分比(仅虚拟化环境有意义)
%wait 进程等待 CPU 资源的时间占比(高值可能表示 CPU 竞争激烈或 I/O 阻塞)
%CPU  进程总 CPU 使用率(= %usr + %system + %guest)
CPU 进程当前运行的CPU 核心编号(在多核系统中定位负载分布)
Command 进程名称或命令行(若使用 -l 选项显示完整命令)
监控指定进程的内存
pidstat -r -p 1021 1 3   # 监控 PID=1021 内存,每秒 1 次,共 3 次
Linux 4.19.90-2102.2.0.0062.ctl2.x86_64 (localhost.localdomain) 	04/23/2025 	_x86_64_	(4 CPU)
05:31:47 PM   UID       PID  minflt/s  majflt/s     VSZ     RSS   %MEM  Command
05:31:48 PM   992      1021      0.00      0.00 1242092   13768   0.39  vmselect-prod
05:31:49 PM   992      1021      0.00      0.00 1242092   13768   0.39  vmselect-prod
05:31:50 PM   992      1021      0.00      0.00 1242092   13768   0.39  vmselect-prod
Average:      992      1021      0.00      0.00 1242092   13768   0.39  vmselect-prod
minflt/s	每秒次缺页次数(Minor Faults):无需磁盘 I/O,通过空闲物理页或共享页解决。高值可能表示内存分配频繁(如 Java 应用)。
majflt/s	每秒主缺页次数(Major Faults):需从磁盘加载数据到内存,可能引发 I/O 延迟。持续高值表明物理内存不足。
VSZ	虚拟内存大小(Virtual Memory Size,单位 KB):进程申请的虚拟内存总量(包括未使用的预留内存)。
RSS	常驻内存大小(Resident Set Size,单位 KB):进程实际占用的物理内存(不包括交换分区)。
%MEM	物理内存占用百分比:RSS / 总物理内存 * 100。持续增长可能暗示内存泄漏。
分析场景
    内存泄漏:观察 RSS 和 %MEM 是否随时间持续增长。
    频繁缺页:majflt/s > 0 时需检查系统剩余内存(free -h)和交换分区使用(swapon -s)。
    虚拟内存膨胀:高 VSZ 但低 RSS 通常是正常现象(如预分配缓存)。
监控指定进程的 I/O 
pidstat -d -p 1021 1 3   # 监控 PID=1021 内存,每秒 1 次,共 3 次
Linux 4.19.90-2102.2.0.0062.ctl2.x86_64 (localhost.localdomain) 	04/23/2025 	_x86_64_	(4 CPU)
05:33:59 PM   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
05:34:00 PM   992      1021      0.00      0.00      0.00       0  vmselect-prod
05:34:01 PM   992      1021      0.00      0.00      0.00       0  vmselect-prod
05:34:02 PM   992      1021      0.00      0.00      0.00       0  vmselect-prod
Average:      992      1021      0.00      0.00      0.00       0  vmselect-prod
kB_rd/s	每秒读取数据量(KB):从磁盘读取的数据量。高值可能表示大量文件读取操作(如数据库查询)。
kB_wr/s	每秒写入数据量(KB):向磁盘写入的数据量。高值可能表示日志写入或数据持久化操作(如 Redis AOF)。
kB_ccwr/s	每秒取消的写入数据量(KB):因 I/O 合并或缓存策略取消的写入量。通常关注 kB_wr/s 即可。
iodelay	I/O 延迟(毫秒):进程因等待 I/O 完成而阻塞的时间。高值表明磁盘性能瓶颈(如机械硬盘过载或 SSD 排队)。
分析场景
    磁盘瓶颈:若 kB_rd/s 或 kB_wr/s 接近磁盘最大吞吐量(通过 iostat -dx 查看 MB/s),需升级磁盘或优化 I/O 模式。
    高延迟问题:iodelay > 100ms(机械硬盘)或 iodelay > 20ms(SSD)时,检查磁盘利用率(iostat -x 1 的 %util 列)。
    写入放大:kB_ccwr/s 显著高于 kB_wr/s 可能表示文件系统或应用层写入优化不足。
监控某用户的线程级 CPU 使用
pidstat -t -u -U root 1    # 监控 root 用户的所有线程,每秒 1 次
Linux 4.19.90-2102.2.0.0062.ctl2.x86_64 (localhost.localdomain) 	04/23/2025 	_x86_64_	(4 CPU)
05:39:07 PM     USER      TGID       TID    %usr %system  %guest   %wait    %CPU   CPU  Command
05:39:08 PM     root     18132         -    0.98    0.00    0.00    0.00    0.98     0  pidstat
05:39:08 PM     root         -     18132    0.98    0.98    0.00    0.00    1.96     0  |__pidstat
Average:        USER      TGID       TID    %usr %system  %guest   %wait    %CPU   CPU  Command
Average:        root     18132         -    0.98    0.00    0.00    0.00    0.98     -  pidstat
Average:        root         -     18132    0.98    0.98    0.00    0.00    1.96     -  |__pidstat
按命令名过滤进程
pidstat -C vmselect-prod -l 2      # 显示完整命令行,每 2 秒采样一次
Linux 4.19.90-2102.2.0.0062.ctl2.x86_64 (localhost.localdomain) 	04/23/2025 	_x86_64_	(4 CPU)
05:40:54 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
05:40:56 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
05:40:58 PM     0     18225    0.00    0.50    0.00    0.00    0.50     3  pidstat -C vmselect-p*** -l 2 2 
Average:      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
Average:        0     18225    0.00    0.25    0.00    0.00    0.25     -  pidstat -C vmselect-p*** -l 2 2 
以人类可读格式输出内存使用
pidstat -r --human 1       # 每秒显示内存使用(如 MB/GB)
Linux 4.19.90-2102.2.0.0062.ctl2.x86_64 (localhost.localdomain) 	04/23/2025 	_x86_64_	(4 CPU)
05:42:11 PM   UID       PID  minflt/s  majflt/s     VSZ     RSS   %MEM  Command
05:42:12 PM     0     18235    996.04      0.00  213.4M    5.5M   0.2%  pidstat
Average:      UID       PID  minflt/s  majflt/s     VSZ     RSS   %MEM  Command
Average:        0     18235    996.04      0.00  213.4M    5.5M   0.2%  pidstat