当系统磁盘响应变慢时,仅仅查看整体 I/O 吞吐量往往不够,你还需要知道 到底是哪个进程在占用磁盘资源。传统工具如 iostat 提供设备级统计,但只告诉你哪块盘忙,却不告诉你谁在读写这块盘。这时候就需要用到 iotop。
iotop 是一个类似于 top 的交互式命令行工具,专门用来按进程显示 I/O 使用情况。它利用 Linux 内核的进程 I/O 记账功能,实时输出每个进程的磁盘读写速率、I/O 总量以及 I/O 优先级等信息,并默认按当前磁盘写入或读取速率降序排列。输出直观,一眼就能发现“捣乱”的进程。
基本用法
最简单的启动方式是直接以 root 权限运行:
sudo iotop
按下回车后,屏幕会周期性地刷新,显示类似以下的表格:
Total DISK READ: 0.00 B/s | Total DISK WRITE: 32.45 M/s
Current DISK READ: 0.00 B/s | Current DISK WRITE: 25.18 M/s
PID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
1245 be/3 root 0.00 B/s 25.18 M/s 0.00 % 97.23 % mysqld
3678 be/4 user 0.00 B/s 2.13 M/s 0.00 % 32.45 % python script.py
顶部的两行分别显示自 iotop 启动以来和当前采样周期内的总读写速率,下方则列出每个有磁盘 I/O 活动的进程。
常用选项
-o或--only:只显示真正有 I/O 活动的进程,忽略那些虽然运行但未进行任何磁盘读写的进程,使输出更清爽。-b或--batch:非交互模式,适用于将输出保存到文件或进行脚本处理。-d SEC:设置刷新间隔(秒),默认是 1 秒。例如sudo iotop -d 3每 3 秒刷新一次。-p PID:只监控指定的一个或多个进程。例如sudo iotop -p 1245可以紧密跟踪 mysqld 的 I/O 行为。-a或--accumulated:显示累计 I/O 量,而不是当前速率。配合-o使用可以快速排出“自系统启动以来读写最多的进程”。-q或--quiet:减少表头打印次数,在非交互模式下比较有用。
输出字段解释
- DISK READ / DISK WRITE:该进程在当前采样周期内的平均磁盘读取/写入速率。
- SWAPIN:进程当前是否有页面被从交换空间换入,百分比越高说明内存压力越大,频繁 swap 会引发严重的 I/O 抖动。
- IO:进程等待 I/O 完成的时间占 CPU 时间的百分比。该值很高意味着进程的主要瓶颈在磁盘,而非 CPU。
- PRIO:进程的 I/O 调度优先级。
be/3表示“Best-effort”类别、优先级为 3(0-7,数字越小优先级越高)。rt代表实时类。调整 I/O 优先级可以用ionice命令。
实践场景举例
- 数据库服务器突然变慢
运行 sudo iotop -o,发现 mysqld 的磁盘写入速率持续在 200 MB/s,占满磁盘带宽。进一步结合 iostat 确认设备使用率 100%,即可快速定位是数据库的批量写入操作导致。
- 备份脚本拖慢业务
夜间备份时,Web 服务响应迟缓。用 iotop -o 找到备份进程(如 tar 或 rsync)正以极高速率读取数据,立即决定调整其 I/O 优先级(ionice -c 2 -n 7 -p <PID>)或限制速度。
- 定位内存不足引发的 I/O 风暴
看到进程 SWAPIN 数值较高且 IO 很大,说明内存不足,进程被频繁换入换出。此时应立即查看内存使用(free -h),并考虑增加内存或优化应用。
补充提示
iotop依赖内核的TASK_IO_ACCOUNTING功能,绝大多数现代发行版的内核都已开启。如果无法运行,请检查/boot/config-$(uname -r)中CONFIG_TASK_IO_ACCOUNTING=y是否存在。- 在容器环境中,
iotop通常只能从宿主机上观察到容器进程的 I/O,且需要确保内核版本和运行权限正确。 - 如果只是临时想了解某个进程已经读写了多少数据,可以直接查看
/proc/<PID>/io文件,里面包含读取和写入的字节总数,无需额外安装工具。
总之,iotop 填补了 iostat 无法回答的“谁在读写”的问题,是每个运维人员和开发者调试磁盘 I/O 瓶颈时的必备武器。