人人都会AI编程

pidstat:进程级 CPU 统计

更新时间:2026-07-12

pidstat 是 sysstat 工具集中的一员,专门用来实时查看单个进程或线程的 CPU、内存、I/O 等资源消耗情况。在对系统性能进行细粒度排查时,它比 topps 更适合持续观察某个进程的行为,因为它可以按固定间隔采样,并自动计算每次采样的平均值,有助于捕捉瞬时的性能波动。

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 问题时的必会工具。