人人都会AI编程

iotop:进程级 IO 占用排行

更新时间:2026-07-12

当系统磁盘响应变慢时,仅仅查看整体 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 命令。

实践场景举例

  1. 数据库服务器突然变慢

运行 sudo iotop -o,发现 mysqld 的磁盘写入速率持续在 200 MB/s,占满磁盘带宽。进一步结合 iostat 确认设备使用率 100%,即可快速定位是数据库的批量写入操作导致。

  1. 备份脚本拖慢业务

夜间备份时,Web 服务响应迟缓。用 iotop -o 找到备份进程(如 tarrsync)正以极高速率读取数据,立即决定调整其 I/O 优先级(ionice -c 2 -n 7 -p <PID>)或限制速度。

  1. 定位内存不足引发的 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 瓶颈时的必备武器。