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,重点观察延迟分位而非平均值