Java服务_并发TP90&TP99性能与可用率监控
1.监控原理
1.1基本概念
方法性能就是指方法的调用时间,主要用TP50、TP90、TP99等(top percent)表示。
TP90就是在监控单位时间内的所有调用中,90%调用完成所需要的最短时间。统计1分钟内的所有调用所需时间,从小到大排序,前90%中的最后一个即为1分钟内的TP90。
方法可用率是指方法调用成功率,不发生异常的概率。
1.2实现思路
监控某个方法的调用时间和可用率基本步骤:
- 方法开始前开始记时;
- 方法发生异常时记录失败;
- 方法完成时记录总时间。
单机部署应用的监控数据,可以保存在本地内存中的static变量、缓存,也可以保存在本地硬盘中的数据库、日志文件等。
如果要看分布式部署应用总的监控,则必须远程保存到同一个地方,缓存、日志文件、db都可以实现。
2.单机实例
2.1监控方法类
核心属性与方法:
- 两个
Map<String, DelayQueue<T>>类型属性用于分别保存调用时间和调用异常数据; - static代码块执行定时删除过期数据逻辑;
- start()用于起使位置埋点,error()用于异常位置埋点,end()用于结束位置埋点,getAP()用于获取方法可用率数据,getTP()用于获取方法性能数据。
1 | package jia.zheng.monitor; |
- 最好不要用LinkedList来保存服务调用时间队列,因为LinkedList只能通过index倒序删除数据,存在线程安全问题,在删除数据同时插入数据,导致删错数据。此处使用DelayQueue来保存相关数据,并创建定时轮询线程池,借助Delayed和Predicate定时删除过期数据。
- 我们可以自定义过期时间,过期时间实际上就是监控单位时间。
- 取TP90或TP99时要向下取整,向上取整有可能超出数组范围,导致ArrayIndexOutOfBoundsException。
2.2属性类
埋点属性类
1 | package jia.zheng.monitor; |
调用时间数据类
1 | package jia.zheng.monitor; |
- 过期数据删除时就是调用getDelay()方法,通过返回的long类型值判断数据是否过期。
调用失败计数数据类
1 | package jia.zheng.monitor; |
- 直接通过ErrorCount对象的个数来进行调用失败计数,所以该类中不需要额外属性,只需要expireTime用来计算过期时间即可。
2.3实验类
模拟被调用方法类
1 | package jia.zheng.service; |
模拟调用埋点类
1 | package jia.zheng.controller; |
- 此处用线程池辅助模拟多线程并发调用,这是非常巧妙的。
- 此处用一个定时器线程池来定时在计算并输出服务性能和可用率,每5s计算并输出一次。如果要添加告警机制也就是在此逻辑上添加的,计算完之后将性能值和可用率值与设定阈值进行比较,超出设定范围则执行报警逻辑。
- 线程池中任务的run()方法的报错日志不会输出到控制台上,一定要用try-catch块抓住异常并打印,才会将异常信息输出到控制台和日志文件中。
2.4运行结果
启动springboot项目,10s观察控制台发现性能和可用率计算任务已经开始执行:
1 | . ____ _ __ _ _ |
浏览器访问,调用visit()方法,控制开可以看到监控数据中第1分钟内调用次数逐渐增加:
1 | 2022-06-12 22:05:21.468 INFO 20628 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' |
因为监控单元为1分钟,可以看到第2分钟内调用次数基本稳定:
1 | 单位时间内总调用次数:11440次------------可用率:0.9009615384615385%------------性能TP90:913ms------------性能TP99:992ms |
因为我们模拟的调用多线程调用的总时间为2分钟,所以2分钟后没有调用了,可以看到第3分钟内调用次数逐渐下降:
1 | 单位时间内总调用次数:7438次------------可用率:0.9005108900242%------------性能TP90:911ms------------性能TP99:991ms |
第四分钟后就没有调用了:
1 | 单位时间内总调用次数:0次------------可用率:100.0%------------性能TP90:-1ms------------性能TP99:-1ms |
此时再次浏览其访问或者前一次访问还没完成就再一次访问都可以看到预期中的并发效果,其中可用率和性能计算都符合预期。