ARMS支持通过分位数统计指标数据,本文介绍ARMS分位数指标的计算原理。
背景介绍
分位数是将一组数据按照大小顺序分成若干等份的数值点,用来表示数据的分布情况。常见的分位数包括:
P50代表中位数,即将数据分为两等份的数值点。
P75表示数据中排在前75%的数值点。
P90表示数据中排在前90%的数值点。
P99表示数据中排在前99%的数值点。
通过分位数可以更直观地了解数据的分布情况,以及数据中的极端值和离群值。
示例说明
示例样本:[2, 3, 6, 7, 8, 9, 10, 12, 14, 15, 16, 17, 18, 20]
对应的分位数分别为:
P50: 10
P75: 16
P90: 18
P99: 20
分位数指标示例
新版控制台
开启分位数统计功能的操作请参见Java应用自定义配置。
旧版控制台
开启分位数统计功能的操作请参见自定义配置。
ARMS探针分位数计算原理
4.x及以上版本探针基于分桶的方式来计算耗时分位数,目前默认的分桶边界为:
[0.0, 5.0, 10.0, 25.0, 50.0, 75.0, 100.0, 250.0, 500.0, 750.0, 1000.0, 2500.0, 5000.0, 7500.0, 10000.0]。
对应的分桶耗时区间为:
桶0:(-∞, 0.0]
桶1:(0.0, 5.0]
桶2:(5.0, 10.0]
桶3:(10.0, 25.0]
桶4:(25.0,50.0]
桶5:(50.0,75.0]
桶6:(75.0,100.0]
桶7:(100.0,250.0]
桶8:(250.0,500.0]
桶9:(500.0,750.0]
桶10:(750.0,1000.0]
桶11:(1000.0,2500.0]
桶12:(2500.0,5000.0]
桶13:(5000.0,7500.0]
桶14:(7500.0,10000.0]
桶15:(10000.0, +∞]
下面结合示例说明中的样本说明ARMS计算分位数的原理。
针对每一个样本点,确定该样本点对应的分桶,并对对应的分桶计数器计数加1,得到如下结果:
桶0:0
桶1:2
桶2:5
桶3:7
桶4:0
桶5:0
桶6:0
桶7:0
桶8:0
桶9:0
桶10:0
桶11:0
桶12:0
桶13:0
桶14:0
桶15:0
计算分位数。
以计算P75为例。
先根据需要计算的分位数计算分桶表。
P75即需要保证75%的数据在左边,共有14个样本数据,14*0.75 = 10.5,需要找到一个分桶,该分桶的数据和该分桶左边的数据加起来需要有11个样本,所以找到桶3。
按照线性插值的方法计算最终分位数。
桶0 + 桶1 + 桶2已经有7个数据点了,所以在桶3中仅需要找4个数据点,桶3中总共有7个数据点,再结合桶3的区间
(10.0, 25.0]
。所以最终P75 = 10.0 + (25.0-10.0)* 4 / 7 = 18.6。
分位数优缺点分析
优点:开销极小,无需保存全量样本数据即可计算任意分位数。
缺点:在耗时极小、耗时极大、样本数很少等场景下,分位数存在计算不准确的情况。
ARMS调用链分析分位数计算原理
调用链分析中分位数是以满足页面过滤条件的所有Span的耗时为样本数据,并调用日志服务的SQL函数计算得到,详情请参见函数概览中估算函数的approx_percentile函数说明。