首页/系统/Linux 内核与性能调优速查/fio 延迟与百分位解读

fio 延迟与百分位解读

fio 报告含 IOPS、带宽与 lat/clat 分布;关注 clat percentiles 的 P99/P99.9,均值会掩盖尾延迟问题。

为什么要看百分位

fio 的输出除了 IOPS 与带宽,还给出延迟分布:clat 是完成延迟(从提交到完成),lat 是包含排队等待的总延迟,percentiles 段落列出 P50、P99、P99.9 等分位值。评估存储对业务体感的影响时,尾部的 P99/P99.9 比均值更有意义——均值常被大量快请求稀释,掩盖周期性尖峰,而那些尖峰正是业务超时的主要来源。

基本信息

关键项clat percentiles(P50/P99/P99.9)、lat(含排队)、slat(提交延迟)
百分位开关--latency_percentiles=50,99,99.9
口径差异clat 为完成延迟,lat 含排队;iodepth 越大差距越明显
常用参数iodepth、numjobs、direct=1、runtime、group_reporting
前提绕过页缓存(direct=1)或先清缓存,避免测到内存速度
适用平台Linux(fio 通用,也可用于其他平台)

典型使用场景

  • 验证存储能否满足业务的尾延迟要求,例如 P99 是否在目标毫秒数以内
  • 对比不同队列深度下的延迟表现(iodepth=1 与 iodepth=32 反映不同场景)
  • 同规格多块盘的稳定性横向比较,识别个别性能异常的盘
  • 排查应用延迟尖峰是否来自存储:把测试时间与业务监控对齐
  • 选型与验收测试,给出可复核的分位延迟数据

带百分位输出

带百分位输出
fio --name=randread --ioengine=libaio --rw=randread --bs=4k --iodepth=32 \
    --numjobs=4 --size=2G --runtime=60 --direct=1 \
    --latency_percentiles=50,99,99.9 --group_reporting  # 高队列随机读,重点看 P99
fio --name=lowq --ioengine=libaio --rw=randread --bs=4k --iodepth=1 --size=1G --runtime=30 --direct=1  # 单请求延迟基线
lsblk -o NAME,SIZE,MOUNTPOINT  # 先确认测试目录落在目标设备上
iostat -x 1 5  # 测试期间同步观察设备侧指标,便于交叉验证
# 结果看点:clat percentiles 的尾部值,以及 lat 与 clat 的差值(排队占比)

输出项读法

输出项含义判读要点
clat完成延迟(不含排队)反映设备侧处理能力
lat总延迟(含排队)iodepth 高时明显大于 clat
clat percentilesP50/P99/P99.9 分位延迟尾部值决定业务体感
slat提交延迟偏大说明上层调度或驱动有开销
iops / bw吞吐能力与延迟一起看才能反映真实水位
iodepth=1 测得的是单请求延迟基线,高队列下的数字包含排队成分,两者不可互相推断。做选型或验收前先明确目标场景使用什么队列深度,并保持参数一致。
结果波动大时先排除干扰:设备上是否有其他负载、测试文件是否落在目标设备、是否绕过了页缓存、网络存储是否存在带宽竞争。参数不一致的两次测试没有可比性。

易错点

  • 只看平均延迟忽略尾部:业务超时通常由 P99/P99.9 决定,均值会掩盖尖峰
  • 用 iodepth=1 的结果推断高并发表现:排队延迟完全没被测量到
  • 不设 direct=1 或未清缓存:测到的是内存速度而不是存储性能
  • 测试文件建在错误的设备或挂载点上:结果反映的是另一块盘
  • 多个 job 争抢同一文件:相互干扰导致延迟分布失真,应按 job 规划独立文件或目录

数据来源与参考

  • fio 官方文档 HOWTO(延迟统计)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌