首先先说P99的定义,它的意思是“第99百分位的XXX”(同理,P95就是第95百分位的XXX)。举个例子:
1 | P99 RT = 所有请求中,第99百分位的响应时间,即99%的请求都快于或等于这个值 |
假如P99 CPU使用率 = 80%,意思是:99%的时间里,CPU使用率都低于80%。假设一个小时(3600秒),只有1%的时间,也就是36秒,CPU使用率会超过80%,剩下99%的时间(3564秒)都感受良好,1%是极端情况,但是如果极端情况很长久,也会影响SLI。
同理,P99 CPU使用率 = 60%,说明“99%的时间里CPU使用率都低于60%”,有40%的缓冲空间应对突发流量,系统很轻松,用户体验好。
再举一个例子,场景:CPU使用率数据 = [10%, 20%, 30%, 40%, 100%]
- AVG(平均值)= (10+20+30+40+100)/5 = 40%
- P99 ≈ 100%(因为只有1个值超过其他值)
结论: - AVG说:平均40%,看起来还好
- P99说:有20%的时间(1/5)CPU飙到100%,用户体验差!
所以说,看P99是为了,了解用户体验,跟SLI相关。而看AVG更多了解资源利用率,了解一个大盘情况。

从这个图可以看出,平时负载确实不重:平均CPU只有46%,但有严重突发问题:1%的时间CPU冲到96.6%以上,甚至偶尔会”卡到几乎死机”!这1%可能影响用户体验,比如用户刚好在这1%的时间访问,就会卡顿。说明这个系统有稳定性风险(1%的时间接近满载),需要优化这1%的异常情况。
这里可能有人理解有偏差,假设我的这个系统集群有100个容器,此时我看“12:00:30这一秒的p99 cpu是75%“,意思就是”这一秒有100个容器上报cpu,然后99个CPU都小于75%。“那么假设只有3个容器,只有3个容器上报,凑不出来p99呀。
这里说明一下,”样本” ≠ “容器数量”,样本是时间序列数据点,不是容器实例。
监控系统每秒采集多次CPU使用率,比如:每秒采集10次(每100ms一次),那么3个容器 × 每秒10次 = 30个样本/秒。时间窗口是1分钟的话,1分钟样本数 = 30 × 60 = 1800个样本。对这1800个样本排序,取第1782个样本值(1800 × 0.99),这个值 = 75%。
时间窗口怎么看?那就是看你X轴也就是时间轴,每一个点与点之间的空隙,可能是30秒,可能是1分钟。我这个例子就是30秒。