平均值为什么不够
平均延迟会被长尾掩盖:九十九个快请求加一个超慢请求,平均值依然好看,而那一个请求才是用户投诉的来源。延迟观测应使用分位并明确统计窗口,同时给出超阈值请求占比,让慢的规模也可见。
分位不能直接平均
两个实例各自的 P99 求平均,得不到整体的 P99,必须先聚合可加的分桶数据再计算。窗口选择也有讲究:过长的窗口会把历史峰值与当前状态混在一起,告警应使用较短的窗口。
基本信息
| P50 | 一半请求快于该值,代表普遍体验 |
|---|---|
| P95 与 P99 | 尾部体验,更接近投诉对应的信号 |
| 关键约束 | 必须先聚合原始分布,再计算分位 |
| 补充指标 | 超阈值请求占比更适合直接用于告警 |
典型使用场景
- 体验评估:用中位数反映多数用户的感受
- 尾部治理:用高分位识别少数极慢请求
- 阈值告警:用超阈值占比代替分位比较
- 发布对比:比较分位曲线判断是否引入长尾
- SLO 度量:延迟目标通常以分位或占比表达
分位与超阈值占比
分位与超阈值占比
# P50 / P95 / P99:先聚合桶再计算
histogram_quantile(0.50, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
histogram_quantile(0.95, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
histogram_quantile(0.99, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
# 超过 1 秒的请求占比:用桶相减得到
(sum(rate(http_request_duration_seconds_bucket{le="+Inf"}[5m]))
- sum(rate(http_request_duration_seconds_bucket{le="1.0"}[5m])))
/ sum(rate(http_request_duration_seconds_bucket{le="+Inf"}[5m]))指标与用途
| 指标 | 含义 | 用途 |
|---|---|---|
| 平均值 | 整体水平 | 容易被长尾掩盖 |
| 中位数 | 多数请求的水平 | 反映普遍体验 |
| 高分位 | 尾部最差的请求 | 对应投诉信号 |
| 超阈值占比 | 超过阈值的请求比例 | 直接用于阈值告警 |
观测时的约定
- 明确窗口长度:不同窗口的分位不可直接比较
- 成功与失败分开统计:快速失败会拉低耗时
- 平均值与分位一起看:整体变慢与仅尾部变差,处置方式不同
分位适合看趋势与目标,桶相减得到的超阈值占比更适合直接做阈值告警,两者配合使用效果最好。
把各实例的分位求平均得到的不是整体分位:必须先聚合原始分布再计算,否则结论会系统性偏乐观。