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 后统一显示为进程号 |
| PRIO | IO 调度优先级 | 默认 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」的错误结论,排障应在宿主视角执行。