测试不同块大小对磁盘吞吐的影响需控制变量,用direct=1和裸设备排除缓存与文件系统干扰,固定iodepth、numjobs等参数仅变bs,顺序读写更准确,典型bs为4K、64K、1M,结果重点对比bw值变化趋势。

测试不同块大小对磁盘吞吐的影响,关键在于控制变量、合理设置 bs(block size)并保持其他参数稳定。Fio 不会自动遍历多个块大小,需手动调整或通过脚本批量执行。
明确测试目标:吞吐量 vs 块大小的关系
吞吐量(单位:MB/s 或 MiB/s)反映的是单位时间内传输的数据总量。它通常随块大小增大而上升,尤其在顺序读写中更明显;但到一定阈值后会趋于平稳甚至下降(受控制器、总线或驱动限制)。测试时应避开缓存干扰,聚焦真实设备能力:
-
用
direct=1绕过页缓存,确保数据直通磁盘 -
用裸设备(如
/dev/sdb)而非文件系统路径,排除文件系统开销和元数据影响 -
固定
iodepth、numjobs、runtime和rw模式,只让bs变化 -
顺序读写更适合测吞吐,推荐
rw=read或rw=write,避免随机模式引入寻址开销
常用块大小组合与对应命令示例
典型块大小覆盖常见场景:4K(小文件IOPS)、64K(数据库日志)、1M(大文件备份/视频流)。以下为顺序读测试,可依需替换 rw=write:
-
4K 块大小(侧重IOPS,吞吐通常较低):
fio -name=thr-4k -filename=/dev/sdb -rw=read -bs=4k -direct=1 -iodepth=64 -numjobs=4 -runtime=60 -group_reporting -
64K 块大小(平衡型,常见于OLTP):
fio -name=thr-64k -filename=/dev/sdb -rw=read -bs=64k -direct=1 -iodepth=64 -numjobs=4 -runtime=60 -group_reporting -
1M 块大小(最大化吞吐,接近理论带宽):
fio -name=thr-1m -filename=/dev/sdb -rw=read -bs=1M -direct=1 -iodepth=64 -numjobs=4 -runtime=60 -group_reporting
结果解读重点看吞吐行和稳定性
Fio 输出中,关注每组测试末尾类似这样的字段:
-
bw=xxxKiB/s或bw=xxMiB/s是核心吞吐指标,直接对比不同bs下的数值变化趋势 -
观察
runt是否接近设定的runtime,若显著偏短,说明 I/O 提前完成,可能size不足(建议加-size=10G或更大,避免因空间耗尽中断) -
延迟(lat)值在此类吞吐测试中次要,但若
clat平均值突然跳升(如从几百微秒飙到毫秒级),可能提示设备在大块下响应异常,需检查硬件或队列深度是否过高
进阶建议:用配置文件或循环脚本批量跑
手动改命令易出错,推荐用简单 Bash 循环统一管理:
for bs in 4k 64k 1M; do
echo "=== Testing bs=$bs ==="
fio -name="thr-$bs" -filename=/dev/sdb -rw=read -bs=$bs -direct=1 \
-iodepth=64 -numjobs=4 -size=10G -runtime=60 -group_reporting
done
或写成 Fio 配置文件(如 throughput.fio),用 [global] 统一基础参数,再为每个块大小建独立 job 段,便于复现和归档。











