点击上方“ 小码宋 ”,关注“设为星标”
技术文章第一时间送达!
背景:
arthas是阿里开源的Java排查工具。使用JVMTI等技术实现对JVM底层的一些监控,例如idea的DEBUG技术就是依赖这个,所以这是JVM的一个“后门”。
问题:
线上出现问题,很多时候由于日志的缺失,或则是监控的维度等等问题无法立即排查真实的情况。
下面就上周我遇到的一个线上问题排查过程做一个记录分析。
问题是:线上一个列表查询接口,在查询列表数据时,时而有数据,时而又无数据,但是代码里面没有打印日志,无法查看到底哪一步出现了问题,于是请教公司技术大佬,大佬给我支招让我借助 arthas 分析排查一下,下面就是我的排查过程。
1、首先登录跳板机跳转到目标服务器 上,如果你只是rd用户授权,授权到www(root)用户权限下。
2、首先下载并安装arthas:
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
然后执行(如果没有,先下载):
java -jar arthas-boot.jar
选择刚启动应用的pid进入arthas命令界面。
3、进入arthas的命令界面 之后,就是直接操作命令了。
我主要使用了两个命令, trace和watch。
trace主要看方法内部调用路径,并输出方法路径上的每个节点上的耗时;
这个指令对于优化代码非常的有用,可以看出具体每个方法执行的时间,如果是for循环等重复语句,还能看出n次循环中的最大耗时,最小耗时,和平均耗时,完美!
trace com.xx.demo.MathGame(类的全路径名) methodName(方法名)
在arthas命令界面输入trace命令之后,打开另一个命令界面,去请求接口,然后就会输入上图,接口在执行过程中方法内部调用的各个路径和节点的耗时。
另外,trace还支持次数限制(trace com.xx.demo.MathGame run -n 1)包含jdk的函数(trace --skipJDKMethod false com.xx.demo.MathGame run)还有耗时过滤( trace com.xx.demo.MathGame run '#cost > 10' )
具体可以参考:https://alibaba.github.io/arthas/trace.html#
4、watch命令: 方法执行的数据观测。
你可以通过watch指令,来监控某个类,监控后,运行下你的功能,复现下场景,arthas会提供给你具体的出参和入参,帮助你排查故障。
$ watch demo.MathGame primeFactors "{params,returnObj}" -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 44 ms.
ts=2018-12-03 19:16:51; [cost=1.280502ms] result=@ArrayList[
@Object[][
@Integer[535629513],
],
@ArrayList[
@Integer[3],
@Integer[19],
@Integer[191],
@Integer[49199],
],
]
工作中遇到一个优化问题,系统中一个导出表格的功能,响应时间长达2分钟,虽然给内部使用,但也不能这么夸张,用trace跟踪下方法,发现是其中的手机号加解密函数占用了非常大的时间,几千个手机号,进行了解密后加密的精彩操作,最终导致了两分钟的返回时间。
2. 某功能Bug导致服务器返回500
首先通过trace看异常报错的方法,之后通过tt排查方法,发现入参进来后,居然走错了方法(因为多态),走到了返回null的方法中,所以导致了NPE空指针错误。