sudo iotop -o -p 是定位真实磁盘i/o消耗进程的黄金组合:-o 过滤仅显示当前有实际读写行为的进程,-p 仅显示进程不展开线程,避免干扰,界面中重点关注 io>(i/o等待占比)和 disk read/write(带宽)两列。

直接用 sudo iotop -o -P 就能看到真正吃磁盘的用户进程,不用猜、不翻日志、不重启服务。
确保能跑起来:权限和内核支持是前提
iotop 必须由 root 或具备 CAP_SYS_ADMIN 权限的用户运行。普通用户即使加 sudo,也可能因 capability 未授予而失败。
- 检查内核是否启用 taskstats:
zcat /proc/config.gz 2>/dev/null | grep -i taskstats,无输出说明不支持 - 最小化安装的 CentOS/RHEL/AlmaLinux 常默认关闭该功能,需重编译内核或换发行版
- 执行
sudo iotop后界面全为 0.00B/s 或提示 “Kernel thread not supported”,基本就是权限或内核问题
最实用的启动方式:-o 和 -P 组合
sudo iotop -o -P 是日常排查的黄金组合,它过滤掉干扰项,聚焦真实 I/O 活动。
-
-o:只显示当前有实际读写行为的进程,静默状态(如刚写完日志正空闲)不会出现 -
-P:只显示进程(不展开线程),避免同一服务多个线程分散注意力 - 界面中重点关注两列:IO>(I/O 等待时间占比,反映阻塞程度)和 DISK READ/WRITE(带宽,反映吞吐量)
- 按 Shift+P 可切换按 IO> 排序,对高频小文件刷盘类问题更敏感(比如日志轮转、数据库 WAL 写入)
非交互场景:用 -b 批量模式抓快照
在脚本、远程终端或容器里无法交互时,-b(batch mode)是刚需。
- 命令示例:
sudo iotop -b -n 1 -o -P,采集一次即退出,防止卡住 - 配合
awk提取关键字段:sudo iotop -b -n 1 -o -P | awk '$11 ~ /^[0-9]/ && $11 > 5 {print $1, $11, $12}',筛选 IO> 超过 5% 的进程 - 注意列偏移可能随版本变化:用
iotop --version查版本,iotop -h看当前列顺序;新版本(如 1.3+)IO> 多在第 11 列,老版本可能在第 10 列
当 iotop 显示异常时的替代方案
如果 iotop 数据缺失、空白或不准,别硬等,立刻切到互补工具定位。
- 用
iostat -dx 1 5看设备级 I/O 性能(await、svctm、%util),确认是不是底层磁盘瓶颈 - 用
pidstat -d 1 5查看各进程的累计读写字节数,不依赖 taskstats,兼容性更强 - 两者结合可交叉验证:比如 iotop 显示某进程 IO> 高但带宽低,pidstat 却没看到大量读写,可能是短时密集元数据操作(如大量 open/close)











