首页 >> 知识 >> 99分位、95分位计算 实时分位数的统计方法

99分位、95分位计算 实时分位数的统计方法

之前做的一个项目上线有一段时间了,但一直也没有来得及做统计分析(峰值、平均QPS、……)。最近刚好又被问到了这个事情,所以抽空学习了解一下部分监控指标的概念和含义,方便后续自己做统计分析。

一、分位数 1、概念

分位数(Quantile),TP=Top Percentile,即对一批数值型数据进行排序之后,排在p%位置的数值大小,是数据分析中非常重要的统计指标之一。常用的分位数包括:80分位数,90分位数,99分位数等。

然而,在实时计算(流式计算)场景中,由于无法在有限的时间内对海量数据进行全局的排序,给实时分位数的计算带来一定的技术挑战。

TP50、TP90和TP99等指标常用于系统性能监控场景,指高于50%、90%、99%等百分线的情况。

2、计算/统计方法

TP50:指在一个时间段内(如5分钟),统计该方法每次调用所消耗的时间,并将这些时间按从小到大的顺序进行排序,取第50%的那个值作为TP50的值;配置此监控指标对应的报警阀值后,需要保证在这个时间段内该方法所有调用的消耗时间至少有50%的值要小于此阀值,否则系统将会报警。

举例:假设现在有4次请求耗时分别为: 10s 1000s 100s 2s

计算TP百分线的方法就是:

1、先按升序排列 [2s, 10s, 100s, 1000s];

2、找到你需要用做统计的最后一个条目(向高取整)对应的数值,比如:TP50就是第 ceil(4*0.5)=2 个,即 10s ;TP90就是第 ceil(4*0.9)=4 个,即 1000s 。

3、为什么用百分位数而不是平均数?

自个想,你都来了你还问我这?

这有说的明白的:Why averages suck and percentiles are great | Dynatrace news

参考

distributed system - What do we mean by "top percentile" or TP based latency? - Stack Overflow

第95个百分位(95th percentile)是什么概念? - 知乎

tp90和tp99是指什么性能指标,求大神解释下? - 知乎

二、如何计算或统计这个分位数呢 1、TDigest计算分位数

TDigest是一个简单,快速,精确度高,可并行化的近似百分位算法,被Spark,ES,Kylin等系统使用。TDigest的核心思想是通过聚类的方法将离散的数据点聚集为多个不同的质心,在通过线性差值法计算分位数,线性差值法是最简单的插值算法。

如上图所示,将离散的数据点(图中无色的数据点)聚类为多个不同的质心(图中彩色的数据点),其中每个质心周围的数据点数决定了该质心所占的权重(图中质心的大小),最后通过对所有的质心进行排序,就可以使用线性插值法求取对应的分位数,其中数据点与质心的距离和权重关系如下图所示。

特别地,在每个TDigest创建时有一个重要的compression参数,主要用于在计算的精确度与空间复杂度之间做权衡:

当compression参数设置越大时,聚类得到的质心越多,则差分法求取的分位数精确度越高

当compression参数设置越大时,TDigest数据结构占用的存储空间越大,则分位数计算的空间复杂度越高

随着数据量的增大,compression的取值应适当增大,能够有效提高计算的准确率

2、架构模型

1) 从上游业务方读取需要统计分位数的原始数据

2) 根据业务方需求的分组规则,按分组聚合为TDigest数据结构,将聚合结果存入Redis中,或与Redis中已存在对应的数据进行合并,以获取准确的计算结果

3) 从TDigest结构中获取分位数的计算结果,并向上返回

3、问题

在实际的业务需求中,草莓视频在线观看APP可能需要按照不同的时间、查询维度等信息检索统计的分位数。但是,已经计算好的两个分位数结果是无法进行聚合操作的。

解决:按所有查询维度进行提前聚合计算的解决方案,即针对每一种可能出现的查询维度组合都提前计算分位数并存储,在查询过程中直接检索对应查询维度的聚合计算结果

(感觉有点。。。)

三、Prometheus

重点来了

Prometheus是一个监控平台,通过抓取目标上和metric相关的HTTP endpoint,收集被监控目标的metrics。

网站地图