一、背景
(1)、随着微服务架构的逐渐推广,一个大型的单个应用程序被拆分为数个微服务系统,这为研发人员的本地调试跟踪带来困难
(2)、在微服务架构中,由于业务的复杂性,常常一个业务流程涉及好数个微服务系统的调用,性能排查时到底因为哪个微服务系统的性能瓶颈从而导致整个业务性能的瓶颈,不好定位
因此,下面为大家介绍目前有哪些开源工具支持查看应用JVM状况、Debug调试跟踪、调用链跟踪等功能,方便应用问题快速定位和性能优化
1.1、什么样的场景需要性能调优
(1)、OutOfMemoryError,内存不足
(2)、内存泄露
(3)、线程死锁
(4)、锁争用(Lock Contention)
(5)、Java进程消耗CPU过高
这些问题出现的时候常常通过重启服务器或者调大内存来临时解决,实际情况,还需要尽量还原当时的业务场景,并分析内存、线程等数据,通过分析找到最终的解决方案。
二、常见调优工具
2.1、jvisualvm应用监控
第一步:应用JVM参数添加JMX监控参数
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=<应用所在机器IP> -Dcom.sun.management.jmxremote.port=<“2”+应用端口> -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
第二步:打开jvisualvm监控工具
如果本地有安装jdk环境,打开终端工具,输入:jvisualvm 命令回车进入窗口界面,然后在在《远程》菜单上右击后点击《添加远程主机》,然后设置端口点击《确定》即可
JMX端口:“2”+“应用端口号”
例如:应用端口号为:8011,那它的JMX端口为:28011
2.2、应用Debug模式开启
第一步:应用JVM参数新增Debug调试参数
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=<“1”+应用端口号>,server=y,suspend=n"
第二步:Intellij idea开发环境应用Debug调试
打开Intellij idea 的Run Configurations,点击添加Remote,然后配置应用名称、应用地址、端口号,点击《确定》,最后运行调试
应用Debug端口生成规则:“1”+“应用端口号”
例如:应用端口号为:8011,那它的Debug调试端口为:18011
注意:
(1)、调试时本地分支代码和部署的分支代码保持一致
(2)、调试时设置的断点会影响其他人的正常使用
2.3、APM-PinPoint性能调用链跟踪
Pinpoint是一款全链路分析工具,提供了无侵入式的调用链监控、方法执行详情查看、应用状态信息监控等功能。基于GoogleDapper论文进行的实现,与另一款开源的全链路分析工具Zipkin类似,但相比Zipkin提供了无侵入式、代码维度的监控等更多的特性,Pinpoint支持的功能比较丰富。
参考网站:
(1)、Pinpoint安装部署
(2)、回到网易后开源APM技术选型与实战
(3)、2个实例+5个维度解读APM技术
(1)、服务拓扑图
对整个系统中应用的调用关系进行了可视化的展示,单击某个服务节点,可以显示该节点的详细信息,比如当前节点状态、请求数量等
(2)、请求调用栈查看
对分布式环境中每个请求提供了代码维度的可见性,可以在页面中查看请求针对到代码维度的执行详情,帮助查找请求的瓶颈和故障原因。
三、性能调优工具实践
3.1、Web跨境Redis请求过于频繁,导致系统响应过慢
(1)、菜单Pattern匹配存储在rendis,缓存交互过多;解决方案:稳定不变的值,例如StringMatchUtils中的正则模型解释Pattern本地缓存替换redis缓存
总结:通过Pattern本地缓存替换redis缓存优化,减少了130多次的redis访问
(2)、Shiro频繁访问Redis读取和更新session;解决方案:ShareCacheSessionDao使用LocalThread缓存同一请求线程中的session,解决Shiro频繁访问Redis读取和更新session
总结:通过对Shiro访问Redis优化,Redis访问次数减少了1200多次
(3)、本地缓存穿透;当key对应的value为空时,缓存失效;解决方案:对统一配置key值为空也进行缓存,5分钟的有效期;防止统一配置缓存穿透问题