pidstat 进程资源监控实战:Linux 系统 CPU、内存、IO 与上下文切换的逐进程观测指南

原创2026-10-01 23:53:451,880 阅读
文章标签:文档知识库教程CLI

pidstat 进程资源监控实战:Linux 系统 CPU、内存、IO 与上下文切换的逐进程观测指南

pidstat 是 sysstat 工具包中面向进程级观测的核心命令,能够按进程(甚至线程)维度统计 CPU、内存、设备 IO 与上下文切换等资源占用情况,弥补了 sar、mpstat、iostat 仅能给出系统整体或设备级指标的短板。本文基于 command/pidstat.md 的完整手册内容,结合本仓库收录的 command/sar.md、command/mpstat.md、command/iostat.md、command/vmstat.md 等 sysstat 家族文档,系统讲解 pidstat 的语法、全部选项、输出字段含义与四类典型实战场景,帮助你快速定位"到底是哪个进程在消耗资源"。

pidstat 是什么

pidstat 是 sysstat 工具的一个命令,用于监控全部或指定进程的 CPU、内存、线程、设备 IO 等系统资源的占用情况。

它区别于其它性能工具的核心特点有两个:

  • 进程级粒度:不再只给出 all 的整体平均值,而是按 PID 逐行列出每个进程/线程的占用数据,适合做故障定位与容量分析的"第二层"手段——先用 vmstat、sar、mpstat 判断整体是否存在瓶颈,再用 pidstat 揪出具体元凶进程。
  • 增量统计语义:pidstat 首次运行时显示自系统启动开始的各项统计信息,之后运行 pidstat 将显示自上次运行该命令以后的统计信息。因此两次运行之间的差值才是它最有效的观测口径,用户可以通过指定统计的次数和时间间隔来获得所需的周期统计。

从 sysstat 家族的分工看:mpstat 关注多 CPU 环境下的每个 CPU 状态(command/mpstat.md),iostat 关注磁盘设备与分区(command/iostat.md),sar 可以连续采样并落盘(command/sar.md),而 pidstat 则把视角收敛到单个 task 或线程,四者配合可以构成一套完整的性能分析链路。

安装与语法

安装 sysstat

pidstat 包含在 sysstat 包内,需要先安装该软件包。根据 command/iostat.md 的安装说明:

在 RedHat / CentOS / Fedora:

yum install sysstat

在 Debian / Ubuntu / Linux Mint:

sudo apt-get install sysstat

安装完成后可用 pidstat -V 查看版本号验证是否就绪。

语法

pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
  • <时间间隔>:每次统计输出之间的间隔秒数;
  • <次数>:一共输出多少份统计报告;
  • 若不给任何参数直接运行 pidstat,默认等效于 -u(CPU 统计)。

典型的周期采样写法:

# 每 2 秒输出一次,共输出 5 次 CPU 统计
pidstat -u 2 5

# 每 3 秒输出一次内存统计,持续输出(Ctrl+C 结束)
pidstat -r 3

选项详解

选项 含义
-u 默认参数,显示各个进程的 CPU 使用统计
-r 显示各个进程的内存使用统计
-d 显示各个进程的 IO 使用情况
-w 显示每个进程的上下文切换情况
-t 显示到线程的统计信息
-p 指定进程号(可指定单个 PID,或用 ALL 表示全部进程)
-T { TASK | CHILD | ALL } 指定 pidstat 监控的统计对象:TASK 报告独立的 task;CHILD 报告进程下所有线程统计信息;ALL 报告独立的 task 和 task 下面的所有线程
-V 显示版本号
-h 在一行上显示所有活动,方便其它程序解析
-I 在 SMP(对称多处理器)环境下,表示任务的 CPU 使用率除以内核数量
-l 显示命令名和所有参数

关于 -T 选项,文档特别提醒:task 和子线程的全局统计信息与 pidstat 选项无关,这些统计信息不会对应到当前的统计间隔,只有在子线程被 kill 或者完成的时候才会被收集。也就是说,CHILD/ALL 模式下的线程汇总数据属于"生命周期累计"性质,与周期采样的瞬时增量语义不同,解读时需要区分。

实战一:查看所有进程的 CPU 使用情况

# pidstat -u -p ALL
11:04:06 AM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
11:04:06 AM     0         1    0.03    0.05    0.00    0.08    20  systemd
11:04:06 AM     0         2    0.00    0.00    0.00    0.00    28  kthreadd
11:04:06 AM     0         3    0.00    0.00    0.00    0.00     0  rcu_gp
11:04:06 AM     0         4    0.00    0.00    0.00    0.00     0  rcu_par_gp
11:04:06 AM     0         6    0.00    0.00    0.00    0.00     0  kworker/0:0H-kblockd
11:04:06 AM     0         9    0.00    0.00    0.00    0.00    38  mm_percpu_wq
11:04:06 AM     0        10    0.00    0.01    0.00    0.01     0  ksoftirqd/0
11:04:06 AM     0        11    0.00    0.23    0.00    0.23    15  rcu_sched
11:04:06 AM     0        12    0.00    0.00    0.00    0.00     0  migration/0
11:04:06 AM     0        14    0.00    0.00    0.00    0.00     0  cpuhp/0
11:04:06 AM     0        15    0.00    0.00    0.00    0.00     1  cpuhp/1
...

表头字段说明

  • PID:进程 ID;
  • %usr:进程在用户空间占用 CPU 的百分比;
  • %system:进程在内核空间占用 CPU 的百分比;
  • %guest:进程在虚拟机中占用 CPU 的百分比;
  • %CPU:进程占用 CPU 的总百分比;
  • CPU:处理该进程的 CPU 编号(多核环境下用于观察进程是否被调度到不同核心);
  • Command:当前进程对应的命令。

使用建议:单独看某一次的 %CPU 意义有限(尤其首次输出是开机以来的平均值),应配合时间间隔连续采样,重点观察两次采样之间的增量波动。结合 -l 选项可以展开命令的完整参数,区分同名进程的不同实例;结合 -I 可以在 SMP 环境把 CPU 使用率归一化到内核数量,更公平地比较单线程与多线程进程。

实战二:查看所有进程的内存使用情况

# pidstat -r
11:10:35 AM   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
11:10:35 AM     0         1      7.24      0.05  191312   4208   0.01  systemd
11:10:35 AM     0      1407      2.02      0.09   39316   9016   0.03  systemd-journal
11:10:35 AM     0      1442      0.03      0.00  190380   1080   0.00  lvmetad
11:10:35 AM     0      1457      0.46      0.00   46252   1560   0.00  systemd-udevd
11:10:35 AM     0      2429      0.11      0.00  163620   9472   0.03  sshd
11:10:35 AM   992      2446      0.02      0.00    8588    996   0.00  lsmd
11:10:35 AM     0      2447      0.05      0.00   90572   1468   0.00  rngd
11:10:35 AM     0      2448      0.15      0.02  451272   3520   0.01  udisksd
11:10:35 AM     0      2449      0.18      0.02  396488   1948   0.01  accounts-daemon
11:10:35 AM     0      2454      0.02      0.02  201336   1464   0.00  gssproxy
...

表头字段说明

  • PID:进程标识符;
  • Minflt/s:任务每秒发生的次要错误(minor fault)次数,即不需要从磁盘中加载内存页即可满足的缺页;
  • Majflt/s:任务每秒发生的主要错误(major fault)次数,需要从磁盘中加载内存页;
  • VSZ:虚拟地址大小,即虚拟内存的使用量,单位 KB;
  • RSS:常驻集合大小,即非交换区物理内存使用量,单位 KB;
  • Command:task 的命令名。

使用建议:minflt/s 与 majflt/s 的比值值得重点关注——major fault 频繁说明进程频繁触发磁盘换页,往往伴随明显的 IO 等待;RSS 是判断进程真实物理内存占用的第一指标,而 VSZ 偏大通常只是虚拟地址空间(如 mmap 映射、JVM 堆预留)较大,不能直接等同于物理内存压力。排查内存泄漏时,可周期性记录各进程 RSS 是否持续单调上涨。

实战三:查看所有进程的 IO 使用情况

# pidstat -d
11:12:30 AM   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
11:12:30 AM     0         1    250.05     11.57      2.13  systemd
11:12:30 AM     0       224      1.21      0.00      0.00  khugepaged
11:12:30 AM     0       290      0.03      0.00      0.00  kswapd0
11:12:30 AM     0       291      0.02      0.00      0.00  kswapd1
11:12:30 AM     0      1312      1.03      0.00      0.00  xfsaild/dm-0
11:12:30 AM     0      1407      1.31      0.00      0.00  systemd-journal
11:12:30 AM     0      1442      0.01      0.00      0.00  lvmetad
11:12:30 AM     0      1457      1.77      0.00      0.00  systemd-udevd
11:12:30 AM   992      2446      0.79      0.00      0.00  lsmd
11:12:30 AM     0      2447      0.07      0.00      0.00  rngd
11:12:30 AM     0      2448      0.46      0.00      0.00  udisksd
...

表头字段说明

  • PID:进程 ID;
  • kB_rd/s:每秒从磁盘读取的 KB 数;
  • kB_wr/s:每秒写入磁盘的 KB 数;
  • kB_ccwr/s:任务取消的写入磁盘的 KB 数,当任务截断脏的 pagecache 时会发生;
  • Command:task 的命令名。

使用建议:-d 与 command/iostat.md 的分工互补——iostat 回答"哪块磁盘繁忙",pidstat -d 回答"哪个进程在读写这块磁盘"。注意 kB_ccwr/s 反映的是写入被取消(如进程写入了 pagecache 后又在刷盘前被截断)的量,数值持续偏高通常意味着进程存在大量临时文件写入或重复写入行为,值得结合应用逻辑排查。

实战四:查看进程的上下文切换情况

# pidstat -w
11:15:52 AM   UID       PID   cswch/s nvcswch/s  Command
11:15:52 AM     0         1      3.15      0.03  systemd
11:15:52 AM     0         2      0.13      0.00  kthreadd
11:15:52 AM     0         3      0.00      0.00  rcu_gp
11:15:52 AM     0         4      0.00      0.00  rcu_par_gp
11:15:52 AM     0         6      0.00      0.00  kworker/0:0H-kblockd
11:15:52 AM     0         9      0.00      0.00  mm_percpu_wq
11:15:52 AM     0        10      1.99      0.00  ksoftirqd/0
...

表头字段含义

  • PID:进程 ID;
  • Cswch/s:每秒主动任务上下文切换数量(voluntary context switches),通常是进程主动让出 CPU,如等待 IO、锁、sleep 等;
  • Nvcswch/s:每秒被动任务上下文切换数量(non-voluntary context switches),通常是进程被调度器抢占或时间片耗尽;
  • Command:命令名。

使用建议:nvcswch/s 持续偏高往往意味着进程在抢 CPU 时间片(例如线程数超过核数的密集计算);cswch/s 偏高则常见于锁竞争、频繁 IO 等待或过度并发。结合 -t 选项把统计下探到线程级,可以进一步定位是哪个线程在制造切换开销,与系统整体的上下文切换指标(见 command/vmstat.md 中的 cs 字段)形成对照。

深入技巧:把 pidstat 用进排查流程

组合选项:进程 + 线程 + 全参数

# 查看 PID 1234 的全部线程的 CPU 统计,并显示完整命令行参数
pidstat -t -p 1234 -l

# 报告独立 task 与其所有子线程的统计信息
pidstat -T ALL -u

# 指定进程号与周期采样:每 2 秒一次,共 10 次
pidstat -p 1234 2 10

输出解析友好化

需要被脚本或监控系统解析时,可组合使用 -h(单行输出所有活动,便于程序解析)与 -l(展开命令参数),例如:

pidstat -h -u -p ALL 1

与 sysstat 家族配合的完整链路

  1. 系统整体判断:用 command/vmstat.md 看运行队列 r、上下文切换 cs、IO 等待 wa 是否异常;
  2. CPU 分布判断:用 command/mpstat.md 的 mpstat -P ALL 看是否存在单核打满而整体空闲的不均衡;
  3. 磁盘设备判断:用 command/iostat.md 的 -x 扩展指标看 %util、r_await/w_await 是否接近瓶颈;
  4. 进程定位:用 pidstat -u/-r/-d/-w 按进程逐项排查,必要时叠加 -t 下探到线程,找到真正消耗资源的对象。

小结

pidstat 的价值在于把"系统级"观测转化为"进程级"甚至"线程级"证据,是 Linux 性能排查中从宏观到微观的关键一环。掌握 -u/-r/-d/-w 四个核心维度、-p/-t/-T 三个对象控制选项,以及"首次输出为累计值、后续输出为增量值"的统计语义,你就能基于本仓库 command/pidstat.md 提供的手册,配合 command/sar.md、command/mpstat.md、command/iostat.md、command/vmstat.md 完成一次完整的系统资源排查。该文档亦遵循本仓库 CONTRIBUTING.md 约定的命令文档格式(语法、选项、参数、实例结构),可作为后续扩充其它命令手册的参照。

登录后查看全文
linux-command