iostat -dx 1 是唯一能反映真实设备级读写速率的命令;r_ios/w_ios 统计内核提交到 block queue 的请求数,rkb/s/wkb/s 表示绕过 page cache 的真实吞吐,但需结合 /sys/block/*/stat 验证物理介质完成量。

直接看 iostat -dx 1,这是唯一能反映真实设备级读写速率的命令;其他工具要么带缓存干扰,要么只统计逻辑请求,容易误判。
为什么不能只用 iostat -d 或默认 iostat
默认 iostat 或加 -d 参数输出的 r/s 和 w/s 是上层合并后的逻辑请求数,不是真实下发到磁盘的 I/O 次数。在 NVMe、virtio、多路径或开启 IO 调度器的场景下,这个值可能比实际 r_ios 低一个数量级。
-
r/s可能显示 200,但r_ios实际是 8000 —— 因为内核把多个小请求合并成一个提交给设备 -
rkB/s和wkB/s是绕过 page cache 的真实吞吐(单位 KB/s),但注意:它不等于物理磁盘读写量,中间还经过 block layer 重排和队列缓冲 - 如果你关心“每秒多少次 4K 随机读”,必须盯
r_ios字段,而不是rkB/s ÷ 4的粗略换算
如何用 iotop 看进程级实时读写速率
iotop 显示的是带缓存的速率(即进程调用 read(2)/write(2) 的数据量),不是块设备真实读写,但它能快速定位“谁在刷盘”。
- 必须以 root 运行:
sudo iotop -o -d 1(-o只显示有 I/O 的进程,-d 1每秒刷新) - 注意列名:
DISK READ和DISK WRITE是带缓存的速率,单位自动缩放(B/s、K/s、M/s),但底层仍来自/proc/[pid]/io的rchar/wchar,不是read_bytes/write_bytes - 想看真实磁盘读写归属,得结合
pidstat -d 1,它的rkB/s和wkB/s列基于read_bytes/write_bytes计算,更接近物理层
别被 vmstat 的 bi/bo 欺骗
vmstat 1 输出的 bi(block in)和 bo(block out)看似是块设备读写量,但它统计的是整个系统的汇总值,且单位是“块”(通常是 512 字节),不是字节或 KB,还包含 swap I/O,无法区分具体设备或进程。
-
bi值为 200 表示每秒 200 个 512 字节块 → 实际约 100 KB/s,但你不知道是 sda 还是 nvme0n1 在干活 - 它不反映请求频率(IOPS),也不区分读写来源,纯属宏观快照,适合看趋势,不适合定位问题
- 当
wa(CPU 等待 I/O 时间)持续 >5%,再配合iostat -x的await和avgqu-sz才能判断是否真有 I/O 瓶颈
真正容易被忽略的是:iostat -dx 1 中的 r_ios 和 w_ios 是内核提交到 block queue 的请求数,但它们仍可能被设备驱动进一步合并(比如 NVMe 多队列中一个 request 可含多个 cmd)。要验证是否真发到了物理介质,得看 /sys/block/*/stat 的第 1/5 列(reads completed / writes completed),那是设备层确认完成的计数。











