iotop —— 谁在读写磁盘

运维工具手册 01-系统监控与性能 3.4 KB 原文

iotop —— 谁在读写磁盘

分类:01 系统监控与性能 适用:Linux(需内核开启 CONFIG_TASK_IO_ACCOUNTING,主流发行版默认开启) 一句话:iostat 告诉你磁盘忙,iotop 告诉你是谁让它忙。

1. 它解决什么问题

磁盘 IO 打满时,从几十上百个进程里找出真正在读写的那几个。相比 pidstat -d,它实时刷新、可按累计量排序,更适合"现场抓凶手"。

2. 安装

apt install -y iotop
dnf install -y iotop          # 或 yum
apk add iotop

内核支持检查:

grep CONFIG_TASK_IO_ACCOUNTING /boot/config-$(uname -r)
# =y 可用;未开启需换内核,无法运行

3. 常用参数

iotop                      # 默认每 1 秒刷新,显示所有线程
iotop -o                  # 只显示实际有 IO 的进程(最常用)
iotop -oP                 # 按进程聚合,不显示线程
iotop -oa                 # 累计模式:显示自启动以来的总量,便于排序
iotop -ob                 # 批处理模式,配合 -n 输出到文件
iotop -on2                # 只显示有 IO 的,刷新 2 秒
iotop -d 5                # 5 秒刷新
iotop -u nginx            # 只看某用户
iotop -p 1234             # 只看某 PID
iotop -k                  # 以 KB/s 为单位(默认按人眼友好单位)
iotop -t                  # 加时间戳(批处理时有用)
iotop -q                  # 不显示头部(配合 -b 更干净)

留证:

iotop -obt -n 20 -d 1 > /tmp/iotop_$(date +%F_%H%M).log

4. 界面怎么读

Total DISK READ :      12.34 M/s | Total DISK WRITE :      98.76 M/s
Actual DISK READ:      12.34 M/s | Actual DISK WRITE:      64.21 M/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
 1234 be/4  mysql       0.00 B/s   45.20 M/s  0.00 %  62.31 %  mysqld
列 含义 判读
Total DISK READ/WRITE 进程层统计的 IO 速率 含缓存命中,可能大于真实磁盘
Actual DISK READ/WRITE 实际落到设备的速率 看这个才是真磁盘压力
TID 线程 ID(-P 时为 PID)
PRIO IO 优先级(be/4 = best-effort 4) 可用 ionice 调
DISK READ/WRITE 该进程速率 排序主依据
SWAPIN 换入占比 非 0 说明内存不足,进程在被换页
IO> 等待 IO 的时间占比 接近 100% 说明该进程被 IO 卡死
COMMAND 进程名

SWAPIN 非 0 是内存不足的强信号,比 free 更直接。

5. 交互键

键 作用
o 切换"只显示有 IO"
a 切换累计模式
p 切换进程/线程视图
左右方向键 切换排序列
r 反向排序
u 按用户过滤
i 调整 IO 优先级(ionice)
q 退出

6. 实战场景

6.1 三分钟定位 IO 大户

iostat -x 1 3            # 确认哪块盘、多严重
iotop -oPa               # 累计排序,一次看清总量排名

-a 累计模式下,跑了几小时的机器能直接看到"历史总写量第一"的进程,比瞬时值更可靠。

6.2 确认是不是 swap 导致的卡顿

iotop -o
# SWAPIN 列持续 >0 → 内存不足
free -h; vmstat 1 3      # 交叉验证 si/so

6.3 给备份任务降 IO 优先级

ionice -c2 -n7 -p $(pgrep -f backup.sh)   # best-effort 最低优先级
# 或启动时就限制
ionice -c3 tar -czf /backup/data.tar.gz /data     # idle 级

配合 cgroup v2 硬限速(更彻底):

# 创建 cgroup 并限制 sdb 读写为 50MB/s
mkdir /sys/fs/cgroup/backup
echo "8:16 rbps=52428800 wbps=52428800" > /sys/fs/cgroup/backup/io.max
echo $$ > /sys/fs/cgroup/backup/cgroup.procs

6.4 批处理采集用于工单

iotop -obtkk -n 10 -d 2 | grep -v '^$' > /tmp/io_evidence.txt

7. 常见坑

  1. 容器内看不到数据:/proc 隔离 + 缺少内核 accounting,容器里通常显示全 0,需在宿主机执行。
  2. 必须 root:普通用户报 Netlink error 或看不到其他进程。
  3. Total 与 Actual 差距大:说明大量 IO 被页缓存吸收,真实磁盘压力没那么大。
  4. 线程视图太碎:多线程程序(Java/Go)会刷屏,用 -P 聚合。
  5. 瞬时值抖得厉害:用 -a 累计模式或 -d 3 放慢刷新。
  6. iotop 本身有开销:高频刷新在大 IO 场景会加重负担。
  7. 只统计块设备 IO:NFS、Ceph、网络存储的 IO 不一定计入,需看存储侧监控。
  8. IO> 是相对值:不同内核统计口径有差异,只做横向比较。

8. 速查表

iotop -o                # 只看有 IO 的
iotop -oP               # 按进程聚合
iotop -oPa              # 累计排序(找总大户)
iotop -u <user>         # 按用户
iotop -p <pid>          # 单进程
iotop -obt -n 10 -d 2   # 批处理留证
iotop -k                # KB 单位

# 配套
ionice -c3 -p <PID>                       # 降 IO 优先级
pidstat -d 1                              # 非交互替代
cat /proc/<PID>/io                        # 单进程精确计数
iotop —— 谁在读写磁盘 - 知识库 - 起航社区