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