5 分钟上手 pidstat
本页承诺:5 分钟内学会用 pidstat 把"某个进程的 CPU 到底耗在哪"拆明白——用户态还是内核态、哪个线程在烧、是不是在频繁做 IO 或被频繁抢占切换。top 看到某进程 CPU 高时,就轮到 pidstat 下钻。
阅读时间约 4 分钟 + 动手 3 条命令。完整版见 pidstat 使用教程。
第 1 步:装好 pidstat
bash
yum install -y sysstat # CentOS/RHEL
apt install -y sysstat # Debian/Ubuntu
pidstat -V # 能输出版本号 = 装好了pidstat 属于
sysstat套件,top 的高频下钻搭档就是它。
第 2 步:造一个"进程 CPU 高"的靶子
用本仓库自带演示程序(场景 1 是用户态热循环,最适合练手):
bash
cd <本仓库路径>/demos/cpu-demo
make && ./cpu_demo # 选场景 1(用户态 CPU 高),让它一直跑另开一个终端做第 3 步。先把它的 PID 记下来(下例用 <PID> 代替)。
第 3 步:三连跑通
① 拆 CPU:用户态 vs 内核态(最核心)
bash
pidstat -u -p <PID> 1看 %usr 和 %system 两列:谁大,瓶颈就在哪一侧。场景 1 典型输出:
bash
Linux 5.15.0 (host) 08/29/2026 _x86_64_ (8 CPU)
11:20:01 UID PID %usr %system %guest %wait %CPU CPU Command
11:20:02 1000 12345 99.00 0.00 0.00 0.00 99.00 3 cpu_demo→ %usr 接近 100、%system 几乎为 0,说明热点在用户态代码(算法/循环),下一步就该上 perf 看函数。
② 下钻到线程:多线程里谁在烧
bash
pidstat -ut -p <PID> 1多了一列 TID,逐个线程拆 CPU。定位到具体线程后,配合 perf record -t <TID> 即可精准采样那一缕。
③ 看切换与 IO:是不是被"挤"慢的
bash
pidstat -w -p <PID> 1 # 上下文切换
pidstat -d -p <PID> 1 # 磁盘读写cswch/s(自愿切换)高 → 在等锁/IO/资源;nvcswch/s(非自愿切换)高 → 时间片被抢,CPU 竞争激烈。kB_wr/s、iodelay高 → 进程在频繁写盘,慢的根源在磁盘不在 CPU。
常见坑(3 秒自查)
| 现象 | 原因 | 解决 |
|---|---|---|
| 数字都是 0 或很小 | 没带间隔参数:只读一次 pidstat -u -p <PID> 是开机平均值,没实时意义 | 一定加间隔,如 pidstat -u -p <PID> 1 |
| 看不到线程列 | 没加 -t | pidstat -ut -p <PID> 1 才展开 TID |
| 列名和教程对不上 | sysstat 版本差异 | pidstat -V 看版本,新版本多了 %wait 等列 |
| 想看历史趋势 | 单次观察看不全 | pidstat -u 1 > pid.log 落盘,配合 sar 看更长窗口 |
深度入口
- pidstat 使用教程—— 全部参数、数据来源
/proc解析、IO/内存/切换全维度 - 5 分钟上手 top—— 先发现"哪个进程 CPU 高"
- 5 分钟上手 perf—— 拆出用户态热点后定位函数
- 5 分钟上手系列
一句话总结:pidstat 三步 = pidstat -u -p <PID> 1 拆用户态/内核态 → -ut 下钻到烧 CPU 的线程 → -w/-d 看切换与 IO 是否才是元凶;记住永远带间隔参数,否则看到的是开机平均值。