当 Linux 服务器磁盘读写带宽占满导致系统响应变慢时,最直接的排查手段是使用 iotop 工具查看实时占用磁盘 I/O 的进程,确认是否为异常写入或备份任务。
先说结论:iotop 是定位磁盘 I/O 占用进程的首选工具,但需要 root 权限且内核支持任务记账功能。
- 先定位:使用 sudo iotop -oPa 命令筛选出实际产生 I/O 的进程。
- 先做:确认进程身份,区分正常业务高峰与异常死循环写入。
- 再处置:优先使用 ionice 限制权重,必要时 kill -15 优雅终止。
- 后验证:结合 iostat 观察整体磁盘利用率是否随干预下降。
前置检查与内核配置
iotop 依赖内核的任务记账功能(Task Accounting)。如果运行时报错 Error accessing task IO accounting information 或显示空白,说明内核未开启相关功能。
1. 检查内核参数:
sysctl kernel.task_delayacct
如果返回 kernel.task_delayacct = 0,尝试临时开启:
sudo sysctl -w kernel.task_delayacct=1
2. 永久生效配置:
若临时开启成功,需写入配置文件防止重启失效:
echo 'kernel.task_delayacct=1' | sudo tee -a /etc/sysctl.conf
注意:若上述命令无效,说明当前内核编译时未包含 CONFIG_TASK_DELAY_ACCT,需更换内核或使用替代方案。
命令速用版
如果已经安装了 iotop 且内核支持,直接运行以下命令即可看到实时占用最高的进程:
sudo iotop -oPa
参数说明:-o 仅显示有 I/O 操作的进程,-P 仅显示进程不显示线程,-a 显示累计 I/O 量。
安全处置进程
定位到高 I/O 进程 PID 后,切勿直接强制杀死,以免数据不一致或服务中断。
1. 限制 I/O 权重(推荐):
如果是业务进程但不能立即停止,可先降低其 I/O 优先级,让出磁盘资源:
sudo ionice -c2 -n7 -p <PID>
说明:-c2 表示 Best-effort 类别,-n7 表示最低优先级。
2. 优雅终止进程:
确认进程可停止后,先发送 SIGTERM 信号:
sudo kill -15 <PID>
观察进程是否退出,若无响应且确认为异常进程,再考虑强制终止:
sudo kill -9 <PID>
验证与替代方案
1. 验证效果:
在另一个终端窗口运行 iostat -x 1,观察磁盘的 %util 指标。当占用高的进程被限制或终止后,%util 数值应明显下降,系统响应恢复。
2. iotop 不可用时的替代:
若内核不支持 iotop,可通过 /proc 文件系统查看特定进程 I/O:
cat /proc/<PID>/io
关注 write_bytes 和 read_bytes 字段的变化,配合 watch 命令监控:
watch -n 1 'cat /proc/<PID>/io | grep bytes'
常见坑
- 权限不足:iotop 必须使用 root 权限运行,否则无法读取其他进程的 I/O 信息。
- 线程干扰:默认情况下 iotop 可能显示线程,使用 -P 参数可以聚合到进程级别,更方便识别。
- 缓存误导:有时看到写入高可能是页面缓存回写,结合 iostat 的 writesection 确认是否为物理磁盘写入。
- 容器环境:在 Docker 容器中运行 iotop 可能无法看到宿主机或其他容器的进程,需在宿主机排查。
参考来源
- iotop Project Page, GitHub Repository, https://github.com/ionutbalosin/iotop
- Linux Man Pages, iotop(8), https://man7.org/linux/man-pages/man8/iotop.8.html
原文链接:https://www.zjcp.cc/ask/10868.html
