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