开始准备使用javaAgent制作一个开源工具
在当前公司的日常开发里,存在一个非常棘手的问题,主要问题如下:
1.项目是一个大型单体应用,主要是一个tomcat程序。
2.由多部门联合开发,我的任务主要是基于别人的jar包,进行二次开发。而且其他的所有jar包都不给源码包,只能反编译jar包查看。
3.大家都在一个spring容器里,各种jar包放在一起,跑在一个tomcat上。
4.启动特别慢,性能强劲的电脑,也要5-10分钟才能启动。运行性能也很差,目测观察还存在内存泄漏。
5.经过反编译观察,至少存在如下代码问题:componentScan随便扫package;还有classScanner去扫描各种class文件;随意的AOP切面编写;资源申请和回收非常随意。等等问题。
6.没有任何有效监控手段,因为这个大型单体应用是监控别人的。自己反而没有自监控手段。
我尝试加入了慢SQL打印、使用prometheus检查JMX、使用arthas和profile进行了性能瓶颈的定位,发现了一些问题。但是实际操作上并不简单。
总结下来:
1.没有一个可用的成熟的监控系统,这种监控系统的搭建一般依赖大数据组建,在个人工作电脑上捉襟见肘。
2.完全是黑盒的代码,各部门的代码,都不提供源码包,不方便观察分析。
3.依赖较强的排查经验,需要有敏感度和知识功底。
我突然想到,可能有其他人跟我有一样的问题,并不是每个人都用上了微服务,也不是每个人都有资源去搭建各种监控系统。
如何在面对这一坨屎山一样的、黑盒的、大型单体工程里,迅速找到一些直接的性能优化点呢?
我觉得,可以通过javaAgent的方式,把我的 知识经验做成插件,第三方也可以开发插件,在应用启动的时候,使用我们的agent进行增强;
主要进行如下检测:
1.class scan的插桩,并统计扫描耗时,方便找到罪魁祸首的jar包。
2.spring的bean的 生命周期耗时,尤其是 init,postConstruct之类的,有人喜欢在里面做各种业务操作,启动非常耗时。
3.AOP增强的类和切面的统计,看看到底是谁在乱写通配符,到底在无意间增强了多少类。
4.对jedis、jsch、httpclient、mysql jdbc的资源进行插桩,看看创建了连接,但是却一直不释放。
5.对指定的正则模式进行增强,统计其请求耗时,制作一个穷人版的简易监控系统。可以让函数调用的统计不依赖大型监控系统,可以简单地自定义,并统计出来。
6.jdbc的插桩,统计数据库操作耗时。
7.mybatis的插桩,找到不合理的滥用和mapper的耗时。
8.其他的一些缺陷检测。
简而言之,就是 把排查问题的经验智慧,浓缩成一个个插件,让agent帮我们做动态的分析。
开源项目的启动里程碑,写于公司。