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