fio 基线是干什么的
fio 用来建立虚机存储性能基线:用固定口径(块大小、队列深度、读写模型、并发数、时长)分别测随机读与顺序写,得到可对比的 IOPS、带宽与延迟数据。基线要固定参数并双侧采样——同一时刻既看 guest 内的结果,也看宿主与存储侧的指标,才能判断瓶颈在虚机内部还是底层存储。
基本信息
| 随机读 | randread + bs=4k + iodepth=32 |
|---|---|
| 顺序写 | write + bs=1M + iodepth=8 |
| 关键参数 | --direct=1 绕过缓存、--time_based 固定时长 |
| 对比方式 | 同一时刻宿主与 guest 双侧采样 |
| 输出指标 | iops、bw(带宽)与 lat(延迟) |
典型使用场景
- 新存储或新宿主上线前建立性能基线
- 虚机磁盘换置备类型(thin 与 thick)前后做对比
- 排查应用慢:确认是否为存储 IOPS 或延迟受限
- 压测验证限速与 QoS 配置是否按预期生效
- 迁移前后对比存储性能,判断是否需要调优
两条基线命令
两条基线命令
fio --name=randread4k --ioengine=libaio --direct=1 --rw=randread --bs=4k \
--iodepth=32 --numjobs=4 --size=1G --runtime=60 --time_based --group_reporting
fio --name=seqwrite1m --ioengine=libaio --direct=1 --rw=write --bs=1M \
--iodepth=8 --numjobs=1 --size=4G --runtime=60 --time_based --group_reporting
fio --name=randwrite4k --ioengine=libaio --direct=1 --rw=randwrite --bs=4k \
--iodepth=32 --numjobs=4 --size=1G --runtime=60 --time_based --group_reporting参数读法
| 参数 | 作用 | 建议 |
|---|---|---|
| --rw | 读写模型(randread/randwrite/write) | 按业务真实访问模式选择 |
| --bs | 块大小 | 随机小 IO 用 4k,顺序大 IO 用 1M |
| --iodepth | 队列深度 | 数据库类业务看高队列深度的表现 |
| --numjobs | 并发任务数 | 模拟多线程或多进程访问 |
| --direct | 是否绕过页缓存 | 基线测试必须为 1,否则结果偏高 |
| --time_based | 按固定时长而非数据量运行 | 便于不同环境之间横向对比 |
压测文件占用宿主空间与 IO:避开业务高峰,结束后清理测试文件,避免剩余空间不足影响业务。
对比不同环境时必须使用同一套参数:块大小、队列深度与并发数任一项不同,结论都不可比,建议把命令固化到脚本里复用。
基线的使用方式
- 把三种模型(随机读、随机写、顺序写)都跑一遍,形成一组基线而非单个数字
- 记录测试时的宿主负载、存储类型与虚机规格,脱离上下文的数据没有意义
- 结果同时留档 iops、bw 与 lat 三类指标,只看其一容易误判
- 每次变更(换置备类型、改限速、升级存储)后复测并对比,形成趋势
- 压测结束清理测试文件,避免占用存储空间影响后续业务