转载

使用 Arthas 排查线上问题

使用 Arthas 排查线上问题

点击上方“ 小码宋 ”,关注“设为星标”

技术文章第一时间送达!

使用 Arthas 排查线上问题

背景:

arthas是阿里开源的Java排查工具。使用JVMTI等技术实现对JVM底层的一些监控,例如idea的DEBUG技术就是依赖这个,所以这是JVM的一个“后门”。

问题:

线上出现问题,很多时候由于日志的缺失,或则是监控的维度等等问题无法立即排查真实的情况。

下面就上周我遇到的一个线上问题排查过程做一个记录分析。

问题是:线上一个列表查询接口,在查询列表数据时,时而有数据,时而又无数据,但是代码里面没有打印日志,无法查看到底哪一步出现了问题,于是请教公司技术大佬,大佬给我支招让我借助 arthas 分析排查一下,下面就是我的排查过程。

1、首先登录跳板机跳转到目标服务器 上,如果你只是rd用户授权,授权到www(root)用户权限下。

使用 Arthas 排查线上问题

2、首先下载并安装arthas: 

curl -O https://alibaba.github.io/arthas/arthas-boot.jar

然后执行(如果没有,先下载):

java -jar arthas-boot.jar

选择刚启动应用的pid进入arthas命令界面。

使用 Arthas 排查线上问题

3、进入arthas的命令界面 之后,就是直接操作命令了。

我主要使用了两个命令, trace和watch。

trace主要看方法内部调用路径,并输出方法路径上的每个节点上的耗时;

这个指令对于优化代码非常的有用,可以看出具体每个方法执行的时间,如果是for循环等重复语句,还能看出n次循环中的最大耗时,最小耗时,和平均耗时,完美!

trace com.xx.demo.MathGame(类的全路径名) methodName(方法名)

使用 Arthas 排查线上问题

在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],

],

]

使用 Arthas 排查线上问题

使用Arthas解决具体问题

1. 响应时间异常问题

工作中遇到一个优化问题,系统中一个导出表格的功能,响应时间长达2分钟,虽然给内部使用,但也不能这么夸张,用trace跟踪下方法,发现是其中的手机号加解密函数占用了非常大的时间,几千个手机号,进行了解密后加密的精彩操作,最终导致了两分钟的返回时间。

2. 某功能Bug导致服务器返回500

首先通过trace看异常报错的方法,之后通过tt排查方法,发现入参进来后,居然走错了方法(因为多态),走到了返回null的方法中,所以导致了NPE空指针错误。

原文  https://mp.weixin.qq.com/s/bewge4Kys6ukPrfahBZL0g
正文到此结束
Loading...