iostat本身不生成I/O,只统计实际发生的I/O行为;要评估不同块大小下的磁盘性能,需用dd或fio发起指定bs的负载,再通过iostat -xk 1观察avgrq-sz(换算为KB)、r/s、w/s、rkB/s、wkB/s、await和avgqu-sz等指标联动变化。

iostat 本身不直接控制或模拟不同块大小的 I/O 操作,它只负责统计和展示内核已发生的实际 I/O 行为。要观察“不同块大小下的磁盘性能表现”,必须配合底层读写工具(如 dd 或 fio)主动发起指定块大小的负载,再用 iostat 实时采集对应指标。
先确认 iostat 支持扩展统计并单位清晰
确保你使用的是 sysstat ≥ 10.0,并启用扩展模式和 KB 单位:
-
iostat -xk 1:每秒刷新一次,显示关键字段(rkB/s、wkB/s、r/s、w/s、avgrq-sz、await、avgqu-sz、%util) -
avgrq-sz是核心参考值——它以扇区(512 字节)为单位,数值 × 0.5 = 平均每次 I/O 请求的数据量(KB)。例如avgrq-sz=64→ 平均块大小 ≈ 32 KB;avgrq-sz=256→ ≈ 128 KB
用 dd 发起不同 bs 的负载,再用 iostat 观察响应
在测试前清空页缓存,避免缓存干扰真实磁盘表现:
echo 3 | sudo tee /proc/sys/vm/drop_caches
然后分别运行(以写为例,注意目标设备路径):
- 小块随机倾向(模拟日志、数据库事务):
dd if=/dev/zero of=/mnt/test/bs4k.dat bs=4K count=100000 oflag=direct conv=fdatasync - 中等块(常见文件服务):
dd if=/dev/zero of=/mnt/test/bs64k.dat bs=64K count=10000 oflag=direct conv=fdatasync - 大块顺序(备份、媒体流):
dd if=/dev/zero of=/mnt/test/bs1M.dat bs=1M count=1000 oflag=direct conv=fdatasync
执行任一命令期间,另开终端运行:iostat -xk 1 /dev/sdb(替换为你的目标设备),重点关注:
-
avgrq-sz是否接近你设定的bs(换算后) -
r/s或w/s:小块下该值高,大块下该值低 -
rkB/s或wkB/s:吞吐是否随块增大而提升?到某一点后是否趋于饱和? -
await和avgqu-sz:小块高 IOPS 场景下若await > 10ms(SSD)或> 15ms(HDD),说明队列开始积压
更精准:用 fio 模拟多场景 + iostat 联动
dd 只能测单一线性模式;fio 可精确控制块大小、队列深度、读写类型、随机/顺序比例:
- 安装:
sudo apt install fio(Ubuntu)或sudo yum install fio(RHEL) - 示例(4K 随机写,队列深度 32):
fio --name=randwrite --ioengine=libaio --iodepth=32 --rw=randwrite --bs=4k --direct=1 --size=2G --runtime=60 --time_based --group_reporting - 运行时同步执行:
iostat -xk 1 /dev/sdb,对比不同bs=参数(如 4k/64k/1M)下的await、%util、吞吐变化
看懂 iostat 输出中块大小相关字段的真实含义
不要只盯着 avgrq-sz 数值,要结合其他字段交叉验证:
-
avgrq-sz ≈ 8(即 4KB)+r/s 很高+await 稳定在 5~8ms→ 典型 OLTP 小块负载,设备尚可承受 -
avgrq-sz ≈ 128(64KB)+wkB/s 接近理论带宽+%util > 95%+await 仍 → 大块顺序写高效,无瓶颈 -
avgrq-sz 波动剧烈(如从 8 跳到 256)+rrqm/s 或 wrqm/s 很高→ 内核在合并请求,可能因应用未对齐或文件系统策略导致非最优 I/O 模式











