pidstat是Linux中可按进程/线程维度对齐CPU、内存、I/O、上下文切换四类指标进行实时分析的精准监控工具,支持多选项组合(如-u -r -d -w -t)同步采集,配合pgrep、jstack等工具实现高负载、I/O阻塞、锁竞争等问题的快速定位。

pidstat 是 Linux 中真正能“按进程切片”看资源的工具,不是泛泛而谈的 top,而是能同时把 CPU、内存、I/O、上下文切换这四类关键指标对齐到同一时间窗口里分析。用得好,一次命令就能定位是 CPU 算力瓶颈、内存抖动、磁盘卡顿,还是线程调度失衡。
CPU + 线程级联合诊断
高 CPU 占用不等于程序写得差,得先分清是用户态忙(%usr)、内核态卡(%system)还是虚拟机开销(%guest)。加 -t 才能看到线程级分布:
- pidstat -u -t 1 5:每秒采样 5 次,展开所有活跃线程,观察哪些 TID 的 %usr 突出
- 若某 Java 进程多个线程 %usr 都超 80%,配合 jstack <PID> 查栈,大概率是死循环或密集计算
- 若 %system 显著高于 %usr(比如 40% vs 10%),说明频繁陷入内核——查是否在做大量文件操作、网络收发或锁等待
I/O 与内存缺页交叉验证
单看 kB_wr/s 高,可能只是大块日志写入;但若同时 majflt/s 也飙升,就指向更深层问题:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- pidstat -d -r -p 1234 2:持续监控指定进程的磁盘读写和缺页行为
- 如果 kB_rd/s 低但 majflt/s > 50,说明进程反复加载新页,物理内存可能不足,或 mmap 映射了太大文件
- 若 %iowait 持续 > 25% 且 kB_wr/s 不高,大概率是小块随机写(如数据库事务日志),需结合 iostat 看 await 和 util 是否同步拉高
上下文切换 + 内核态 CPU 关联排查
非自愿切换(nvcswch/s)和高 %system 往往是一对“搭档”,暗示调度或锁争用:
- pidstat -w -u -p 5678 1:同步捕获切换频次和 CPU 模式
- nvcswch/s > 1000 且 %system 同步升高 → 常见于多线程竞争同一 futex 锁、或 CPU 资源严重过载被迫频繁抢占
- cswch/s 高但 nvcswch/s 低 → 进程主动 sleep 或 wait,属正常行为;重点看它在等什么(如 read() 等磁盘、accept() 等连接)
精准过滤与生产环境实用技巧
真实系统里进程多、命名相似,靠 PID 手动找容易错。用好筛选和格式化:
- pidstat -l -u -C "nginx":-C 按命令名模糊匹配,-l 显示完整启动参数,区分不同 nginx 配置实例
- pidstat -u -r -d -p "$(pgrep -f 'python.*etl_job.py')":用 pgrep 动态取 PID,避免脚本中硬编码失效
- 容器场景下,宿主机 pidstat 显示的是容器内 PID(命名空间隔离后),若应用日志打的是容器内 PID,直接对应即可;若需看宿主机视角的真实 PID,得进容器 ns 或用 crictl ps

















