首页/系统/Linux 内核与性能调优速查/pidstat -d 进程 IO 统计

pidstat -d 进程 IO 统计

sysstat 的 pidstat -d 输出每进程读写 KB/s 与 IO 等待,适合定位“哪几个进程在打盘”。

pidstat -d 是什么

pidstat -d 是 sysstat 套件提供的进程级 IO 统计,按固定间隔输出每个进程的读写 KB/s 与 IO 等待时间。相比交互式的 iotop,它的输出稳定、可直接解析,适合放进监控采集管道与工单留证。

基本信息

适用平台Linux(sysstat 包)
基本用法pidstat -d 1 5:每 1 秒采一次共 5 次
指定进程pidstat -d -p 12345 1 5,多个 PID 用逗号分隔
关键列UID、PID、kB_rd/s、kB_wr/s、iodelay
常用扩展-h 单行输出便于脚本解析;-t 关联线程名

典型使用场景

  • 定位打盘进程:设备 await 升高时确认是哪几个进程在持续读写
  • 量化 IO 阻塞:iodelay 反映进程被 IO 阻塞的时间,比吞吐更贴近业务卡顿
  • 监控采集:定时执行并解析输出,形成进程级 IO 趋势曲线
  • 版本对比:同一服务迭代前后压测,比较读写量是否异常增长
  • 容器与虚拟机核对:与宿主 iostat 互证,确认瓶颈归属

常用命令

常用命令
pidstat -d 1 5                 # 全系统进程 IO,1 秒一次共 5 次
pidstat -d -p 12345 1 5        # 只看指定 PID
pidstat -dh 1 5 | tail -5      # 单行格式输出,便于脚本解析
pidstat -dl 1 5                # 附带命令名,确认进程身份

输出逐列读法

列含义判读
UID进程属主用于识别服务账号
PID进程号配合 ps -p 定位命令行
kB_rd/s每秒读取 KB突增通常对应回源读取或全表扫描
kB_wr/s每秒写入 KB日志落盘与数据库刷盘的主要证据
iodelay被 IO 阻塞的累计时钟周期与速率无关,直接反映等待时间
iodelay 的单位是时钟周期而非毫秒,需要按系统时钟频率换算成秒。读写量不大但 iodelay 高的进程,通常是在等盘而不是在压盘,这才是业务卡顿的直接原因。

配套观测

配套观测
iostat -dxm 1 5              # 设备级:确认盘本身是否饱和
pidstat -d -p $(pgrep -d, -f mysqld) 1 5   # 一次观察一组同服务进程
cat /proc/12345/io           # 交叉核对:该进程的累计读写字节数

选用建议

  • 现场交互排障用 iotop,留档与告警采集用 pidstat -d
  • 需要进程身份时加 -l 显示命令名,避免对错进程动手
  • 容器内采集要把宿主与容器两端数据一起看
  • 把 iodelay 与业务响应时间对照,才能判断阻塞是否已影响用户
在容器与虚拟机中,/proc 的可见范围有限,pidstat 可能采集不到真实写入的进程;定位磁盘异常时以宿主视角的数据为准。

易错点

  • 把 iodelay 当毫秒读:它是时钟周期,需按系统时钟频率换算
  • 容器内数据不完整就下结论,必须与宿主视角的 iostat 互证
  • 只看读写速率不看 iodelay,会漏掉阻塞最多的那个进程
  • 采样间隔过短导致差值抖动,进程 IO 统计建议 1 秒以上间隔
  • 把读写速率低当成没问题的证据,忽略了同步写盘或小 IO 带来的高延迟

数据来源与参考

  • sysstat 文档 pidstat(1)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌