首页/云/云平台与虚拟化速查/用 fio 建虚机存储基线
虚拟化操作94 条

用 fio 建虚机存储基线

评估虚拟磁盘与后端存储表现时用 fio 做可重复的读写压测:direct=1 绕过页缓存、固定 iodepth 与 block size,每次只改一个变量。

云平台与虚拟化速查云更新于 2026-10-13

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 三类指标,只看其一容易误判
  • 每次变更(换置备类型、改限速、升级存储)后复测并对比,形成趋势
  • 压测结束清理测试文件,避免占用存储空间影响后续业务

易错点

  • 用默认参数对比不同环境:口径不一致结论不可信
  • 不启用 --direct 直接测,页缓存让结果虚高,无法反映真实存储能力
  • 压测规模超出业务可用余量,把宿主或存储压到影响在线业务
  • 只测单一模型就下结论,忽略随机与顺序、读与写之间的巨大差异

数据来源与参考

  • fio HOWTO(fio 官方文档)
  • libaio 引擎说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌