关于TP90 TP99 等常用于评估软件系统的处理性能的指标概念
工作中还是蛮少直接接触到评估系统性能的,但是不妨碍有兴趣了解。认为这是常识,只是个人才疏学浅不了解其定义。
TP=Top Percentile,Top百分数,是一个统计学里的术语,与平均数、中位数都是一类,为等水位线(waterline)。
TP50、TP90和TP99等指标常用于系统性能监控场景,指高于50%、90%、99%等百分线的情况。
上面都是学术上的定义,具体到软件系统评估的实践中怎么理解呢?以TP90为例(借用网络上搜到的资源):
The tp90 is a minimum time under which 90% of requests have been served.
tp90 = top percentile 90
Imagine you have response times:10s,1000s,100s,2s
Calculating TP is very simple:
1. Sort all times in ascending order: [2s, 10s, 100s, 1000s]
2. find latest item in portion you need to calculate.
2.1 For TP50 it will be ceil(4*0.5) = 2 requests. You need 2nd request.
2.2 For TP90 it will be ceil(4*0.9) = 4. You need 4th request.
3. We get time for the item found above. TP50=10s. TP90=1000s
可以认为 TP90的意思是保证90%请求都能被响应的最小耗时。例如上例中TP90=4s,就是如果要保证90%的用户得到有效的时间是4s;同理保证50%的用户得到有效相应的时间是2s。
如果现有需求:每隔5s打印一次最近1分钟内A、B、C三个方法的TP90、TP99的耗时情况。如何实现呢?
分析:
1、如果要计算 TP90、TP95 或者 TP99 等水位线的值,其前提就是需要我们将所有的待计算值保存起来。此需求中打印时刻最近1分钟内调用个方法的耗时时间。
2、用什么数据结构来存储这一系列的值呢?数组?或者列表?实际上,无论选择哪一种数据结构都不能假设其长度无限大,因为内存空间是有限的,而且数据结构也有理论上的最大值,但是要存储的值的个数却可能是无限的。因此,就需要利用有限长度的数据结构存储更多的数值。此例中,选择的数据结构是TreeSet。
3、最后一步就是由低到高顺序排序后计算等水位线的值了。
实现:
1、利用dubbo filter统计各方法调用耗时时间,使用数据结构TreeSet(Java)。
首先看下为什么选用TreeSet,看下TreeSet的结构:
SortedSet通过implements Comparable进行自定义排序:
此案例中耗时时间由小到大排序:
2、计算等WaterLine的值:这个算法就比较简单了,不介绍了直接上图
此文中仅介绍与WaterLine相关的内容,其具体实现再何处体现,后续Dubbo扩展点之一Filter中详述。