P99 延迟是什么?为什么比平均值重要?
更新时间:2026-09-19。短答页。延迟监控里最常被引用、也最容易被误解的指标。
一句话回答
P99(第 99 百分位)= 把一段时间所有请求按耗时排序,99% 的请求比它快、最慢的 1% 比它慢。 它盯住的是体验最差的那批用户(长尾),而平均值会把少数极慢请求「摊平」,掩盖问题。
直观例子
bash
100 个请求:99 个耗时 10ms,1 个耗时 9010ms
平均值 = 100ms(看起来还行)
P99 ≈ 9010ms(有 1% 用户等了 9 秒!)| 指标 | 含义 | 代表 |
|---|---|---|
| P50 | 一半请求快于它 | 典型/中位体验 |
| P95 | 95% 请求快于它 | 多数用户的上限 |
| P99 | 99% 请求快于它 | 长尾、弱网/GC 停顿/慢查询影响的用户 |
平均 50ms 也可能是「一半 5ms、一半 95ms」,只看均值完全发现不了。
为什么 P99 尤其关键
- 长尾往往由系统性事件造成:GC 停顿、Full GC、缓存失效、慢查询、调度排队、网络重传,这些周期性抖动主要砸在尾部用户身上。
- 微服务放大尾延迟:一个请求串行调 10 个下游,只要其中 1 个在 P99,整链就慢;所以即使每个服务 P99 都达标,聚合后仍可能很差。
- SLO 用分位承诺:对用户的延迟承诺通常写成「P99 ≤ 300ms」,而不是「平均多快」。
为什么不能把多台机器的 P99 再平均
分位数不可加。两台实例各 P99=200ms/300ms,平均 250ms 并不等于集群 P99——全局 P99 要在两个分布合并后重新取第 99% 位置。正确做法是上报直方图桶、先聚合桶再算,见分位数为什么用直方图。
坑
- 只看均值和 P50,长尾用户长期受苦却无感知。
- 把单机 P99 平均当集群 P99,系统性低估尾延迟。
- 直方图桶边界不覆盖 SLO 阈值(如目标 300ms 却没有 0.3 附近的桶),P99 不准。
总结
P99 表示 99% 的请求不超过的延迟、刻画最差 1% 用户的真实体验,平均值和 P50 会被大量快请求稀释从而掩盖 GC、慢查询、排队等长尾问题,在多跳微服务中尾延迟还会被逐级放大;监控时应同时看 P50/P95/P99 并基于可跨实例相加的直方图桶聚合计算集群分位,而不是把各机 P99 简单平均。