fio 基准测试入门

fio 用参数化 job 描述负载:rw 指定读写模式、bs 块大小、iodepth 队列深度、numjobs 并发、direct=1 绕过缓存。

fio 基准测试入门

fio 用参数化 job 描述 I/O 负载:rw 指定读写模式(read、write、randread、randwrite、randrw),bs 指定块大小,iodepth 指定队列深度,numjobs 指定并发任务数,direct=1 绕过页缓存直接打到设备,runtime 与 time_based 控制测试时长。它既能测顺序带宽也能测随机 IOPS,是磁盘性能基线与调优验证的常用工具。测试文件要放在被测设备或目录上,并在结束后清理。

基本信息

核心参数--rw、--bs、--iodepth、--numjobs、--runtime
绕过缓存--direct=1
结果汇总--group_reporting
常用引擎libaio 或 io_uring
注意测试文件会真实占用磁盘空间

典型使用场景

  • 新盘或云盘交付验收,建立 IOPS 与带宽基线
  • 调优前后对比:调度器、队列深度、文件系统参数
  • 模拟数据库的随机读写负载
  • 验证多队列与高并发下的扩展性
  • 判断应用 I/O 慢是否已受设备能力限制

随机读与顺序写示例

随机读与顺序写示例
fio --name=randread --ioengine=libaio --rw=randread --bs=4k \
    --iodepth=32 --size=1G --runtime=60 --time_based --direct=1 --group_reporting
fio --name=seqwrite --ioengine=libaio --rw=write --bs=1M \
    --iodepth=8 --size=2G --runtime=30 --direct=1 --group_reporting
fio --name=mix --rw=randrw --rwmixread=70 --bs=8k --iodepth=16 --filename=/data/fio.test
ls -l /data/fio.test        # 确认测试文件位置,便于测试结束后清理

结果字段读法

字段含义关注点
iops每秒 I/O 次数随机小块测试的核心指标
bw带宽顺序大块测试的核心指标
clat完成延迟区分提交与完成两个阶段
slat提交延迟与调度器和队列深度相关
lat 分位值延迟的 P99 与 P99.9判断延迟抖动与长尾
不经 direct 的测试会命中页缓存,结果偏高失真,测出来的是内存速度而不是设备能力。
测试文件会占用真实磁盘空间,务必显式指定被测目录并在结束后清理,避免污染生产数据或占满磁盘。

建立可比基线的做法

  • 固定测试文件位置、大小与 I/O 引擎,保证多轮测试条件一致
  • 每次只改一个变量(调度器、队列深度或块大小),便于把差异归因
  • 同时记录 IOPS、带宽与延迟分位,只看其中一项容易得出错误结论
  • 使用 direct 或在测试间清理缓存,避免上一轮结果污染下一轮

常用变体

  • 顺序读带宽:rw=read 配较大的 bs 与较高 iodepth
  • 混合负载:rw=randrw 并用 rwmixread 指定读写比例
  • 延迟敏感评估:降低 iodepth,重点观察延迟分位而非平均值

易错点

  • 不指定 filename:文件落在当前目录,可能写到系统盘上
  • 忘记 direct=1:测到的是页缓存速度,设备能力被严重高估
  • 测试文件过大或未清理:占满磁盘并影响业务
  • 单线程测多队列设备:压不出设备真实上限,结论偏保守
  • 把一次结果当设备标称值:文件系统、阵列与云盘共享都会影响结果

数据来源与参考

  • fio 官方文档 HOWTO
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌