Linux iotop查看磁盘IO
服务器突然变卡、网站响应变慢,很多时候不是 CPU 跑满,而是某块磁盘被某个进程反复读写拖垮了。iotop 就是用来实时查看磁盘 IO 并定位高读写进程的工具,它能按进程显示读写速率,帮你快速找出“谁在疯狂读写磁盘”。
本文从安装到排查讲清楚,照着做就能用。
先搞清楚 iotop 能解决什么问题
top 看的是 CPU 和内存,iostat 看的是整块磁盘的吞吐,
但它们都很难直接告诉你是哪个进程在读写。iotop 按进程维度统计 IO,
输出里能看到每个进程的 DISK READ、DISK WRITE、SWAPIN 和 IO> 占比,
定位高读写进程非常直观。
它适合这些场景:
- 服务器负载不高但磁盘灯常亮、IO 等待高;
- 数据库、日志、备份任务导致磁盘被占满;
- 怀疑有进程异常刷盘或读写大文件。
需要注意:iotop 依赖内核的 IO 统计接口,普通用户默认看不到全部进程,排查时建议用 root。
安装前的准备与依赖检查
大多数发行版仓库里都有 iotop,直接用包管理器安装即可。
Debian/Ubuntu 系统:
sudo apt update
sudo apt install iotop -y
CentOS/RHEL 系统:
sudo yum install iotop -y
如果提示找不到包,先确认启用了对应仓库;
较新的系统也可以尝试 dnf install iotop。
安装完成后执行 iotop --version 能看到版本号,说明安装成功。
部分内核较老的系统,iotop 可能提示需要 CONFIG_TASK_IO_ACCOUNTING 支持,这种情况建议升级内核或改用 pidstat -d 作为替代。
具体以你系统实际输出为准。
用 iotop 定位高读写进程
最常用的方式是以 root 身份运行:
sudo iotop
进入界面后,默认会按 IO 排序,最上面通常就是当前读写最猛的进程。
几个关键列的含义:
- DISK READ / DISK WRITE:进程实际读写的磁盘速率;
- SWAPIN:进程因内存不足换入换出的比例;
- IO>:进程等待 IO 的时间占比,这个值高说明它被 IO 拖住了。
如果只想看真正有 IO 行为的进程,用 -o 参数过滤掉空闲进程:
sudo iotop -o
想累积统计而不是实时刷新,用 -a 看累计读写量:
sudo iotop -a
排查时还可以加上 -P 只显示进程而不是线程,输出更干净:
sudo iotop -oP
界面里按 r 可以反向排序,按 o 或 p 切换显示模式,按 q 退出。
找到高读写进程后,记下它的 PID,再用 ps -p PID -o pid,user,cmd 确认它到底是什么程序。
定位到进程后不要急着 kill,先判断它是正常业务(如数据库刷盘、日志切割)还是异常行为(如被入侵的挖矿程序、失控的备份脚本),再决定处理方式。
常见报错与避坑说明
- 提示
Operation not permitted:多半是没用 root,改用sudo或切到 root; - 界面里看不到任何进程:可能是系统 IO 确实很闲,或内核未开启统计支持;
- 只看到
Total DISK READ没有明细:尝试加-P或检查是否被容器隔离影响; - 在容器内运行看不到宿主机进程:
iotop受命名空间限制,需要在宿主机上排查; - 不要长期挂着
iotop当监控:它本身有开销,临时排查用即可,长期监控建议用atop、sar或专业监控系统。
验证是否真的定位到了问题
找到可疑进程后,可以用 pidstat -d 1 按进程持续观察磁盘读写,确认它的 IO 是否稳定偏高:
pidstat -d 1 5
同时用 iostat -x 1 看磁盘的 %util 和 await,如果某块盘 %util 接近 100%,说明它确实被打满了。
两边数据对得上,基本就能确认是高读写进程导致的卡顿。
处理完之后再跑一次 iotop -o,如果高读写进程消失、磁盘利用率回落,说明问题解决。
如果仍有个别进程反复出现,就要从它的业务逻辑、日志量或定时任务上找根因,而不是反复 kill。
几个容易被问到的问题
iotop 和 iostat 该用哪个?
iostat 看整块磁盘的吞吐和延迟,iotop 看具体是哪个进程,排查高读写进程优先用 iotop,确认磁盘整体压力时配合 iostat。
普通用户能用 iotop 吗?
默认只能看到自己的进程,想看全部进程需要 root 权限,这是内核统计机制决定的,不是 iotop 的 bug。
iotop 里 IO> 很高但读写速率不大是怎么回事?
说明进程在大量等待 IO,可能是小文件随机读写或磁盘本身响应慢,这时要结合 iostat 看磁盘延迟。
排查完记得及时退出 iotop,避免它本身占用终端和少量资源。
掌握这套流程后,再遇到服务器磁盘 IO 异常,你就能快速定位高读写进程并做出判断。