pidstat 是什么
pidstat 属于 sysstat 套件,把「按进程取数」这件事做得比 top 更规整:它按固定间隔采样并输出区间均值,-u 看 CPU、-r 看内存与缺页、-d 看磁盘 IO、-w 看上下文切换,再加 -t 可以下钻到线程粒度。排查结论要落到「哪个进程、哪个线程、哪个维度」时,它给的是可复现的数字,而不是一闪而过的瞬时值。
基本信息
| 用途 | 按进程或线程输出 CPU、内存、IO、上下文切换统计 |
|---|---|
| 语法 | pidstat [-u|-r|-d|-w] [-t] [-p PID] [间隔秒] [次数] |
| 所属软件包 | sysstat(Debian/Ubuntu 与 RHEL 系同名包) |
| 权限说明 | 看其它用户进程的 IO、内存明细通常需要 root;不加 -p 时统计所有活动进程 |
典型使用场景
- 定位 CPU 消耗者:top 看到某进程高,用 pidstat -u 观察它的均值与波动
- 判断是否在等 IO:-d 看读写速率与延迟,配合 iostat 区分是设备慢还是进程狠
- 内存问题归因:-r 看 RSS 与主缺页速率,主缺页多说明在等磁盘换入
- 锁竞争排查:-w -t 看线程级非自愿切换,锁争用常表现为 nvcswch 异常高
- 脚本采样:按固定间隔输出到文件,配合绘图或告警做趋势分析
常用示例
常用示例
pidstat -u 1 5 # 每 1 秒采一次,共 5 次(不指定 -p 统计全部进程)
pidstat -u -p 1234 1 10 # 盯住单个进程的 CPU
pidstat -r -p 1234 1 5 # 内存:VSZ/RSS 与缺页速率
pidstat -d 1 5 # 磁盘 IO(需内核支持进程级 IO 统计)
pidstat -w -t -p 1234 1 5 # 线程级上下文切换,看锁竞争
pidstat -u -t -p 1234 1 5 | sort -k8 -rn | head # 按 CPU 占用挑出最热的线程输出逐列读法
| 列 | 含义 | 怎么看 |
|---|---|---|
| %usr / %system | 用户态与内核态占用比例 | 内核态高说明在频繁系统调用或中断 |
| %CPU | 该进程(线程)合计占用 | 多线程可超过 100%,是「几核之和」的口径 |
| CPU | 采样时所在的 CPU 编号 | 持续落在同一核且该核饱和,考虑绑核与中断分布 |
| minflt/s | 次缺页速率 | 数量大但影响小,多为正常的内存分配 |
| majflt/s | 主缺页速率 | 非零且持续说明在等磁盘换页,是性能问题的信号 |
| VSZ / RSS | 虚拟内存与常驻内存大小 | 关注 RSS 的长期趋势而不是单点值 |
| cswch/s | 自愿上下文切换 | 进程主动让出,通常是等 IO 或锁 |
| nvcswch/s | 非自愿上下文切换 | 被抢占导致,高意味着 CPU 争抢激烈 |
-d 的 iodelay 列需要较新的内核才提供,输出里没有这一列并不是命令有问题。若进程级 IO 统计没打开,pidstat -d 会提示不可用,这时改用 iostat 从设备侧观察。
pidstat -p 依赖 PID 在采样期间一直存活。对被监控进程做过重启、蓝绿切换的服务,PID 会变,采样数据会断档,脚本里应先按进程名解析 PID 并处理重启场景。