长尾延迟是什么
长尾延迟指大部分请求很快、少数请求异常慢的分布形态。均值会被少量极慢请求拉高或掩盖,因此存储侧判读要用分位数:P99 表示每 100 个请求里有 1 个慢于此值。排队理论给出的规律是,介质利用率接近饱和后,等待时间不是线性增长,而是急剧攀升,这也是高负载下延迟毛刺出现得格外频繁的原因。
基本信息
| 指标口径 | 均值 / 中位 / P95 / P99 / P99.9 / 最大值,用途各不相同 |
|---|---|
| 体验对应 | 中位代表典型请求,P99 代表明显的慢请求,P99.9 决定用户抱怨 |
| 队列关系 | 平均队列长度 = 到达率 × 平均等待时间(Little 定律);队列变长即延迟变长 |
| 放大来源 | 缓存未命中、校验收敛、重建、GC、快照元数据处理、链路重传 |
| 健康判读 | P99 与中位的比值越大,排队与长尾越明显 |
| 应用联动 | 应用与数据库超时应参照 P99.9 设置,而不是参照平均值 |
典型使用场景
- 与业务方约定存储 SLA 时,需要把「延迟」换算成分位数口径而不是平均延迟时
- 数据库偶发提交超时,用分位数证实是存储长尾而非锁等待时
- 对比两款存储或两套配置,用同一分位数口径比较优劣时
- 虚拟化平台集群心跳超时、虚拟机卡顿,评估是否由存储 P99.9 超标引发时
- 容量规划时判断当前利用率是否已经进入延迟非线性上升区间时
分位数采集与队列观察
分位数采集与队列观察
# 一次采集多个分位数,长尾在 99.9 以上才显形
fio --name=tail --rw=randread --bs=4k --iodepth=64 --runtime=60 \
--percentile_list=50:90:99:99.9:99.99
# 观察队列积压与设备利用率,判断是否已进入排队区
iostat -x 1 30
# 延迟按读、写分开看,两者长尾成因常常不同
sar -d 1 30
# 换算一次队列压力:队列长度与延迟应同向变化
# 具体工具字段以本机 sysstat 版本为准分位数逐列读法
| 指标 | 含义 | 异常信号 |
|---|---|---|
| 中位 | 半数请求快于此值,代表典型体验 | 持续高于历史基线说明整体变慢 |
| P95 | 每 20 个请求有 1 个慢于此值 | 与中位差距过大说明分布开始发散 |
| P99 | 每 100 个请求有 1 个慢于此值 | 业务慢请求投诉的直接来源 |
| P99.9 | 每 1000 个请求有 1 个慢于此值 | 超过应用超时阈值即引发报错 |
| 最大值 | 观测窗口内最差一次 | 单点极值常对应重传或切换事件 |
长尾是对比出来的:判断健康与否看 P99 与中位的比值以及趋势,而不是看某个固定毫秒数。同一数值在低负载与高负载下的含义完全不同。
应用超时阈值设得比存储 P99.9 还小,等于让存储的正常长尾直接变成业务报错;这类问题经常被误判为存储故障。