服务响应时间的重要衡量指标——百分位数值P90/P95/P99.9
做性能测试之前需要设置性能阈值来判断服务性能是否符合预期。通常,对服务相应时间的衡量指标有Min(最小响应时间)、Max(最大响应时间)、Avg(平均响应时间)等。
其中比较常用的就是平均值,但是平均值的计算方式会把一些异常的值平均掉,进而会掩盖一些问题,
百分位数值
如果将一组数据按从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。
简单来说:假设有100个请求,按照响应时间从小到大排列,位置为50%的值,称为P50百分位数。 P1就是响应时间最小的请求,P100就是响应时间最长的请求。
P90:表示数据中90%以下的值都小于或等于这个数值,只有10%高于这个值。衡量大部分用户的体验,适合评估系统的整体性能。
P95:表示数据中95%以下的值都小于或等于这个数值,只有5%高于这个值。衡量少数用户的体验,适合发现性能瓶颈。
P99.9:许多大型互联网公司会采用P99.9值,即99.9%用户耗时作为指标。通过测量与优化该值,就可保证绝大多数用户的使用体验。但是,缺点是:优化成本过高,而且服务响应由于网络波动、系统抖动等不能解决的情况。适用于衡量极端情况下的响应时间,评估系统的稳定性。
问题
平均值之所以会成为大多数人使用的衡量指标,主要在于他的计算简单,而P值的计算相对复杂,尤其是在系统的qps(吞吐量)很大的时候。例如:QPS 30万/秒,那么1h的数据就达到了十几亿,需要消耗极大的内存与计算资源。
解决方案
分桶计算
将一个耗时范围归类到一个桶里面去,首先需要界定每个桶的跨度,可以采用等分形式,确定一个耗时上界,然后等分成N个区间。这样就避免了对所有数据进行排序,只需从范围最大的桶内剔除,直到达到5%的数量,那个桶的值就是P95值。如需精确计算可采用桶内平均的方式。如下图所示。这种计算方法虽然不是完全准确,但是精度比较高。
考虑到数据分布的特点,异常数据应该只占少数,而跨度可能很大,等分的方法,可能导致大量数据堆积在一个桶内。针对这个问题,可以采用非等分的方法。
参考:美团点评的实时监控系统的桶跨度划分方式,代码如下:
public static int computeDuration(int duration) {
if (duration < 1) {
return 1;
} else if (duration < 20) {
return duration;
} else if (duration < 200) {
return duration - duration % 5;
} else if (duration < 500) {
return duration - duration % 20;
} else if (duration < 2000) {
return duration - duration % 50;
} else if (duration < 20000) {
return duration - duration % 500;
} else if (duration < 1000000) {
return duration - duration % 10000;
} else {
int dk = 524288;
if (duration > 3600 * 1000) {
dk = 3600 * 1000;
} else {
while (dk < duration) {
dk <<= 1;
}
}
return dk;
}
}
解释:当时间小于20ms时,1m一个桶,大于20小于200时,5ms一个桶,大于200ms小于500ms时,20ms一个桶,以此类推。桶的值可以作为百分位数的近似值,无需排序。耗时越小,精度越高。
注意事项
数据量足够大:百分位数的计算对数据量敏感,样本越多,结果越准确
剔除异常值:在计算前,需清洗数据,剔除明显的异常值(网络抖动)
动态监控:P90、P95、P99等值可能随时间变化,应定期重新计算。
参考:https://www.cnblogs.com/hunternet/p/14354983.html
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/whxhy666/article/details/144658356