pidstat 是 sysstat 工具集中的一员,专门用来实时查看单个进程或线程的 CPU、内存、I/O 等资源消耗情况。在对系统性能进行细粒度排查时,它比 top 或 ps 更适合持续观察某个进程的行为,因为它可以按固定间隔采样,并自动计算每次采样的平均值,有助于捕捉瞬时的性能波动。
1. 基本用法
最常用的命令格式是:
pidstat [选项] [间隔秒数] [次数]
例如,每隔 2 秒报告一次所有活跃进程的 CPU 使用情况,共报告 3 次:
pidstat 2 3
如果不指定次数,它会一直运行直到按 Ctrl+C 停止。
2. 查看进程级 CPU 使用(默认模式)
默认情况下,pidstat 显示以下关键列:
- UID:进程所有者的用户 ID。
- PID:进程 ID。
- %usr:用户态 CPU 使用占比(运行应用程序代码)。
- %system:内核态 CPU 使用占比(处理系统调用、内核任务)。
- %guest:(如果启用虚拟化)处理虚拟 CPU 的时间占比,通常为 0。
- %CPU:进程使用的总 CPU 百分比(在多核系统上可能超过 100%)。
- CPU:进程正在运行于哪个 CPU 核心。
- Command:进程的命令名称。
示例输出片段:
Linux 5.15.0 (hostname) 2024/12/01 _x86_64_
09:30:01 UID PID %usr %system %guest %CPU CPU Command
09:30:03 1000 1234 5.00 2.00 0.00 7.00 2 nginx
09:30:03 1000 1235 0.00 0.50 0.00 0.50 3 nginx
这表示每 2 秒采样一次,nginx 主进程 (1234) 使用了 7% 的 CPU,其中 5% 在用户态,2% 在内核态,且目前运行在 CPU 核心 2 上。
3. 深入线程级别统计
想查看进程中每个线程的 CPU 占用时,使用 -t 选项:
pidstat -t -p 1234 2
这会列出 PID 为 1234 的进程下的所有线程,每行对应一个线程的 TID(线程 ID)和线程名,帮助定位多线程程序中的热点线程。
4. 按时间戳捕获瞬时尖刺
当怀疑某个进程偶尔出现 CPU 尖刺时,可以用较短间隔(如 1 秒)连续采集并将输出重定向到日志文件:
pidstat 1 | tee cpu_spike.log
事后用 grep 筛选出 %CPU 超过阈值的行,或结合时间戳分析突发负载。
5. 显示更详细的信息
- 加上
-u(默认已包含,可省略)明确报告 CPU 统计。 - 使用
-r可同时输出内存使用(如 RSS、%MEM)。 - 使用
-d可显示 I/O 统计(如每 IO 的读写量)。 - 使用
-w可输出上下文切换次数(cswch/s 和 nvcswch/s,分别表示自愿和非自愿切换),用于评估锁竞争或调度开销。
比如,想同时观察某个 Java 应用的 CPU 和上下文切换:
pidstat -u -w -p 5678 2
6. 实用示例:快速找出 CPU 占用异常的进程
如果系统负载突然升高,可以通过以下命令采集 3 秒后自动停止,并筛选出 %CPU 大于 10 的进程:
pidstat 1 3 | awk '$NF > 10'
(注意:%CPU 是包含小数点的数值,需要适当调整判断方式,比如 $8+0 > 10 等,也可以直接用 grep 结合正则。)
7. 注意事项
pidstat输出的 CPU 百分比是基于全部逻辑 CPU 总数计算的,因此多线程进程的%CPU可以大于 100%(例如 200% 表示占满了 2 个核心)。- 默认只显示当时活跃的进程,如果某个进程在采样区间内没有使用 CPU,则不会出现在输出中。想看到所有指定进程(包括空闲的),可加上
-p ALL或指定 PID。 - sysstat 包通常默认没有安装,在 Debian/Ubuntu 上可通过
apt install sysstat安装,在 RHEL/CentOS 上用yum install sysstat。
pidstat 的专业之处在于它填补了 top 实时快照和事后分析之间的空白,给予进程级高时间分辨率的资源使用视图,是每个系统管理员和性能工程师排查 CPU 问题时的必会工具。