百分位数值------P95、P99.9、P99.99
分类: 标签:
前段时间,在对系统进⾏改版后,经常会有⽤户投诉说页⾯响应较慢,我们看了看监控数据,发现从接⼝响应时间的平均值来看在500ms左右,也算符合要求,不⾄于像⽤户说的那么慢,岁很费解,后来观察其它的⼀些指标发现确实是有问题,这个指标就是P95,P99.9,我们发现虽然平均响应时间并不⾼,但P95和P99.9却达到了2s以上,说明我们的接⼝确实存在慢查询。于是捞取了⼀些慢查询的请求⽇志终于发现问题。那么P95、P99⼜代表什么意思呢?
通常,我们对服务响应时间的衡量指标有Min(最⼩响应时间)、Max(最⼤响应时间)、Avg(平均响应时间)等。
股价指数
1 平均值Avg
其中⽐较常⽤的值就是平均值,例如平均耗时为100ms,表⽰服务器当前请求的总耗时/请求总数量,通过该值,我们⼤体能知道服务运⾏情况。
但是使⽤平均值来衡量响应时间有个⾮常⼤的问题,举个例⼦:众所周知,我和Jack马和tony马的财富加起来⾜以撼动整个亚洲,我和姚明的平均⾝⾼有两⽶多......
平均值同样有这种问题,这个衡量指标的计算⽅式会把⼀些异常的值平均掉,进⽽会掩盖⼀些问题,我们只知道所有请求的平均响应时间是100ms,但是具体有多少个请求⽐100ms要⼤,⼜有多少个请求⽐100ms要⼩,⼤多少,是200ms,还是500ms,⼜或是1000ms,我们⽆从得知。组织处置
2 百分位数值
平均值并不能反映数据分布及极端异常值的问题,这时我们可以使⽤百分位数值。
百分位数值是⼀个统计学中的术语。
如果将⼀组数据从⼩到⼤排序,并计算相应的累计百分位,则某⼀百分位所对应数据的值就称为这⼀百分位的百分位数。可表⽰为:⼀组n个观测值按数值⼤⼩排列。如,处于p%位置的值称第p百分位数
⽤我们软件开发⾏业的例⼦通俗来讲就是,假设有100个请求,按照响应时间从⼩到⼤排列,位置为X的值,即为PX值。
P1就是响应时间最⼩的请求,P10就是排名第⼗的请求,P100就是响应时间最长的请求。
在真正使⽤过程中,最常⽤的主要有P50(中位数)、P95、P99。
P50: 即中位数值。100个请求按照响应时间从⼩到⼤排列,位置为50的值,即为P50值。如果响应时间的P50值为200ms,代表我们有半数的⽤户响应耗时在200ms之内,有半数的⽤户响应耗时⼤于200ms。如果你觉得中位数值不够精确,那么可以使⽤P95和P99.9
P95:响应耗时从⼩到⼤排列,顺序处于95%位置的值即为P95值。
还是采⽤上⾯那个例⼦,100个请求按照响应时间从⼩到⼤排列,位置为95的值,即为P95值。我们假设该值为200ms,那这个值⼜表⽰什么意思呢?
意思是说,我们对95%的⽤户的响应耗时在200ms之内,只有5%的⽤户的响应耗时⼤于200ms,据此,我们掌握了更精确的服务响应耗时信息。
P99.9:许多⼤型的互联⽹公司会采⽤P99.9值,也就是99.9%⽤户耗时作为指标,意思就是1000个⽤户⾥⾯,999个⽤户的耗时上限,通过测量与优化该值,就可保证绝⼤多数⽤户的使⽤体验。⾄于P99.99值,优化成本过⾼,⽽且服务响应由于⽹络波动、系统抖动等不能解决之情况,因此⼤多数时候都不考虑该指标。
下图是我从我们系统中随便拉的两个接⼝的性能监控数据,我们可以看到第⼀个均值在40ms,P95在82.5ms,看似还可以,但是P99.9却是1743ms。
⽽第⼆个接⼝均值在710ms,但是P95却是1592.7ms,这代表我们有将近5%的⽤户访问该接⼝的时间要⼤于1592.7ms。P99.9更是达到了2494.2ms。
以上两个接⼝如果单纯只看均值指标,并没有什么问题,但是P95和P99.9却反映了我们⼀些慢请求的情况。拿到这个指标数据,我们就知道我们的服务并⾮没有问题,就可以去优化这两个指标的值,以达到更好的⽤户体验。
3 如何计算百分位数值
平均值之所以会成为⼤多数⼈使⽤衡量指标,其原因主要在于他的计算⾮常简单。请求的总耗时/请求总数量就可以得到平均值。⽽P值的计算则相对⿇烦⼀些。
按照传统的⽅式,计算P值需要将响应耗时从⼩到⼤排序,然后取得对应百分位之值。
如果服务qps较低,例如:100/秒,我们计算这1s内的P值,就记录这100请求的耗时数据,然后排序,然后取得P分位值,并⾮难事。但如果我们要计算1h内的p值呢,就是要对360000的数据进⾏排序然后取得P分位值。⽽如果对于⼀些⽤户量更⼤的系统,例如:QPS 30万/秒,那么1h内的p值如果还是采⽤记录+排序的⽅式,就是要对⼗个多亿的数据进⾏排序,可想⽽知需要消耗多么⼤的内存与
计算资源。
那么有没有简单的计算⽅式呢?
可以采⽤分桶计算的⽅式,即⼀个耗时范围⼀个桶,该计算⽅式虽不是完全准确值,但精度⾮常⾼,误差较⼩。
⾸先需要界定每个桶的跨度,可以采⽤等分形式,例如对于耗时统计需求,我们可以假定⼀个耗时上界,然后等分成N个区间,如下图,如果响应耗时在30ms则落在0-50ms的桶内,如果响应时间在80ms则落在50-100ms的桶内,以此类推。
这样就避免了对全部数据进⾏排序,只需要根据各个桶中的数据数量,即可计算出95%位置位于哪个桶,例如需要计算95线时,就从最⼤的桶开始剔除,当数量超过5%的时候,那个桶的值就是95线。然后在桶的内部采⽤插值⽅法,也可以通过桶内平均的⽅式来计算出⼀个相对精确的P95值。
此外,考虑到数据分布特点,服务耗时异常数据应该只是少数,但是异常值跨度可能很⼤,⼤部分耗时数据均靠近正常值,如果采⽤桶等分的形式,可能会导致⼤量数据堆积在⼀个桶内中,⼜如何解决这个问题?
其实可以采⽤⾮等分的跨度划分⽅式,例如采⽤指数形式划分,耗时越低的区间,跨度越⼩,精度约⾼。
此外也可以采⽤美团点评的实时监控系统cat的桶跨度划分⽅式,代码如下:
Copy
public static int computeDuration(int duration) {
if (duration < 1) {
return 1;
} el if (duration < 20) {
return duration;
} el if (duration < 200) {
return duration - duration % 5;紫茉莉种子
} el if (duration < 500) {
return duration - duration % 20;
} el if (duration < 2000) {
return duration - duration % 50;
} el if (duration < 20000) {
return duration - duration % 500;
} el if (duration < 1000000) {
return duration - duration % 10000;
} el {游乐园有什么项目
int dk = 524288;
视觉传达专业
if (duration > 3600 * 1000) {
挽联横批dk = 3600 * 1000;
} el {
while (dk < duration) {
dk <<= 1;
}
}秋天的海
return dk;
}
一年级拼音测试卷}
即:⼩于20ms的时候1ms⼀个桶,⼤于20ms⼩于200ms的时候5ms⼀个桶,⼤于200ms⼩于500ms的时候20ms⼀个桶,以此类推!⽽桶的值也可以作为百分位数的近似值,⽽⽆需进⾏排序计算,这个时候约耗时越⼩的时候,精度越准确!
⼩结
百分位数值在互联⽹系统中有很⼤的意义。通过对百分位数值的监控与优化,我们可以将更多的⽤户纳⼊我们的监控体系中,让我们的服务能够对绝对⼤多数的⽤户提供更好的体验!在⼀些错误率、异常率上⾯我们也可以使⽤百分位数来进⾏系统可⽤性是否达到要求,甚⾄在⼀些新的产品特性或者AB测试上也可以⽤来统计分析⽤户对其的反响,以此来衡量该特性是否真正对⽤户有帮助......