分析服务响应时间分布,如均值,中位值,P95值,P99值等计算
请求的总耗时/请求总数量,通过该值,我们大体能知道服务运行情况可以采用直方图来进行计算,该计算方式虽不是完全准确值,但精度非常高,误差较小。
直方图需要界定两个直方之间的跨度,一般采用等分形式
例如对于耗时统计需求,我们可以假定一个耗时上界,然后等分,比如划分成100个区间,对于每个响应耗时落入对应的直方
此外,考虑到数据分布特点,服务耗时异常数据应该只是少数,但是异常值跨度可能很大,大部分耗时数据均靠近正常值,如果采用桶等分的形式,可能会导致大量数据堆积在一个桶内中,又如何解决这个问题?
其实可以采用非等分的跨度划分方式,例如采用指数形式划分,耗时越低的区间,跨度越小,精度约高。
此外,话可以采用美团点评的实时检控官系统cat的桶跨度划分方式
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; } } 百分位数值在互联网系统中有很大的意义。通过对百分位数值的监控与优化,我们可以将更多的用户纳入我们的监控体系中,让我们的服务能够对绝对大多数的用户提供更好的体验!在一些错误率、异常率上面我们也可以使用百分位数来进行系统可用性是否达到要求,甚至在一些新的产品特性或者AB测试上也可以用来统计分析用户对其的反响,以此来衡量该特性是否真正对用户有帮助......
RPS:衡量服务器的吞吐能力,每秒处理器处理的请求数,是服务器并发处理能力的量化描述
import numpy as npa = np.array([1,2,3,4,5])p_90 = np.percentile(a, 90)p_95 = np.percentile(a, 95)p_99 = np.percentile(a, 99)avg = np.average(a)min = np.min(a)max = np.max(a)print("p90 = {} \np95={} \np99={} \navg={} \nmin={} \nmax={}".format(p_90,p_95,p_99,avg,min,max))