iotop 是定位 I/O 瓶颈最直观的工具,需 root 权限运行,实时显示进程真实读写速率(KB/s/MB/s)和 I/O 等待占比(IO%),配合 o/p/方向键/a 键筛选排序,结合顶部 Total 与 Actual 指标预判磁盘压力趋势。

直接用 iotop 查看具体进程的磁盘读写开销,是定位 I/O 瓶颈最直观的方式。它不依赖猜测,而是实时抓取内核 taskstats 接口数据,显示每个进程/线程真实的读写速率和等待占比。
启动 iotop 并确保权限正确
iotop 必须以 root 权限运行,否则无法读取 /proc/*/io 和延迟统计:
- 执行
sudo iotop启动交互界面 - 若提示 "Unable to initialize threads library",说明缺少 Python 线程支持,可加
-P参数只看进程(跳过线程) - 部分容器或老内核可能报 "Kernel does not support process I/O accounting",此时需换用
ps+/proc/PID/io手动查
重点关注输出中的关键字段
界面分两部分:顶部汇总 + 进程列表。真正反映“谁在消耗磁盘”的是下面的表格列:
- DISK READ / DISK WRITE:单位 KB/s 或 MB/s,表示该进程当前每秒实际读/写块设备的数据量(绕过缓存的真 IO)
- IO%:进程处于 I/O 等待状态的时间占比。数值高(如 >80%)说明它频繁被阻塞,不一定写得多,但很可能卡在磁盘响应上
-
COMMAND:带完整参数的命令行,能区分同名进程(比如多个
java实例) - USER:帮助判断是否为业务用户或系统服务,便于权责定位
用快捷键聚焦问题进程
默认按 IO% 降序排列,但你往往需要更精准筛选:
- 按
o键:只显示当前有 IO 活动的进程(排除空闲进程干扰) - 按
p键:切换进程/线程视图——线程级可发现某个 Java 进程里某条 GC 线程在疯狂刷日志 - 左右方向键:切换排序字段,比如切到 DISK WRITE 列,快速找出写吞吐最大的进程
- 按
a键:切换为累计模式,适合观察长时间运行的服务(如数据库)总写入量
结合顶部指标判断压力性质
顶部两行数据揭示系统级 I/O 行为本质:
- Total DISK READ/WRITE:真实落盘速率(物理层),数值小但 IO% 高 → 可能是随机小 IO 导致延迟堆积
- Actual DISK READ/WRITE:含页缓存的逻辑读写量。若 Actual 远大于 Total(例如 Actual WRITE 是 Total 的 20 倍),说明大量脏页积压在内存,内核即将触发集中刷盘,接下来几秒 iostat 就会看到 await 爆升
不需要背参数,记住这四步:sudo 启动 → 按 o 聚焦活跃进程 → 看 DISK WRITE 和 IO% 两列 → 对照顶部 Actual/Total 关系预判趋势。定位到进程后,再查它的配置、日志或磁盘路径,优化就有的放矢了。

















