iotop 进程级 IO 观测

按进程显示读写速率与等待占比;-o 只看有活动的进程、-P 按进程而不是线程、-b -n 用于脚本采样。

iotop 是什么

iotop 按进程或线程实时展示读写速率与 IO 等待占比,用于回答「这台机器上是谁在打盘」。它通过内核 taskstats 接口采集,依赖 CONFIG_TASK_IO_ACCOUNTING(现代发行版默认开启)。属于现场观测工具,不是精确计费工具,需要 root 才能看到全部进程的数据。

基本信息

适用平台Linux(发行版仓库中的 iotop 包)
权限要求root;普通用户只能看到与自己相关的进程
常用参数-o 只看有活动的 / -P 按进程聚合 / -a 累计 / -b 批处理 / -n 次数 / -d 间隔
前提条件内核启用 IO 统计;容器内需可见宿主的 PID 命名空间
替代方案pidstat -d(可脚本化)、直接读 /proc/<pid>/io

典型使用场景

  • 定位磁盘热点:整机 IO 高但不知道谁在打盘,用 -oPa 直接看排名
  • 验证备份/同步行为:确认备份进程的写速率是否超出预期
  • 累计模式复盘:用 -a 观察长时间任务的累计读写量是否异常增长
  • 容器排障:在宿主视角按 PID 判断容器内进程的 IO 来源
  • 短时留档:iotop -obn 3 输出到文件,配合其他指标比对

常用命令

常用命令
sudo iotop -oPa                     # 只看有 IO 的进程,按进程聚合显示累计值
sudo iotop -obn 3 -d 1 | tail -30   # 批处理模式,1 秒一次采 3 次
sudo iotop -p 12345 -d 1            # 只观察指定 PID
cat /proc/12345/io                  # 无法交互时的替代:读该进程的 io 计数

输出逐列读法

列含义判读
TID/PID线程号或进程号加 -P 后统一显示为进程号
PRIOIO 调度优先级默认 be/4,配合 ionice 调整
USER进程属主定位到具体服务账号
DISK READ/WRITE间隔内读写速率与设备吞吐对照可识别主要来源
SWAPIN换入内存占比长期非零说明在换页,内存不足
IO>等待 IO 的时间占比接近 100% 说明该进程几乎全在等盘
iotop 自身存在采样开销,长时间前台运行会干扰被观测环境;脚本化采集优先用 pidstat -d,或直接读 /proc/<pid>/io 的累计值做差值。

与相邻工具的分工

要回答的问题用哪个原因
此刻谁在打盘iotop -oPa实时按进程排名,带累计量
某进程累计读写多少/proc/<pid>/io内核给出的累计字节数,最准
整机是否被 IO 拖住vmstat 的 b 与 wa先确认整体口径再下钻
设备是否饱和iostat -dxm设备视角,避免只看单进程
容器里运行 iotop 只覆盖当前 PID 命名空间:容器外进程的 IO 不可见,容易得出「整机没有 IO」的错误结论,排障应在宿主视角执行。

易错点

  • 在容器内直接跑 iotop 只能看到本命名空间,容易误判为没有 IO,应在宿主视角观测
  • 把 SWAPIN 非零当常态:持续换页会连带拖慢机器上所有进程,属于内存告急信号
  • 用 iotop 前台长开做值守,采样开销在高 IO 场景会放大观测误差
  • 把实时速率当精确计量:它来自内核增量统计,受采样间隔与进程调度影响
  • 把 -a 累计值与间隔值混看:-a 显示的是历史累计,判断瞬时压力要用默认模式

数据来源与参考

  • iotop 官方文档
  • Linux 内核 Documentation/accounting/taskstats.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌