Arthas是阿里出品的一款在线调试线上java程序运行的工具包,在工作中我们时长都会用到。今天就来给大家介绍几个比较实用和常用的小技巧,快速应用到我们生产环境中,排查生产环境出现的问题。
首先我们介绍下如何使用arthas。
其实arthas很好用,他也是一个javajar包,因此我们把他下载下来直接运行即可。
mkdir /mnt/arthas cd /mnt/arthas wget https://alibaba.github.io/arthas/arthas-boot.jar
然后我们执行这个jar包即可。
java -jar arthas-boot.jar
此时程序会列举出我们当前服务器正在运行的所有java程序。例如:
我们找到要排查的程序,例如这个bigdatainterface-pt-0.0.1-shapshop.jar。他对应的序号是3,因此我们输入一个3即可。
此时就可以开始排查程序了。
1、线上的接口没有打印日志,我们希望查看下请求信息和返回参数,排查具体问题怎么办?
答:可以直接使用:
watch com.gy.bigdatainterfacept.sync.controller.SyncController cjsb "{params,returnObj,throwExp}" -x 2
这里的意思是我们监听SyncController类的sjsb的方法,我们需要打印出来请求参数,返回结果及异常情况。当执行后,我们再次请求接口,结果就出来了。
2、线上某个接口请求超时比较厉害,获取请求到返回的时长比较大,如何判断哪个方法占用的时间较多呢?
答:我们可以执行如下命令:
trace com.gy.bigdatainterfacept.sync.controller.SyncController cjsb
这个方法是监听SyncController类的cjsb的方法,查看下这个方法的调用链路,链路里面每个方法的耗时时间。如图:
3、线上请求接口很慢,需要评估下平均时间,因此不能长时间把命令行开着,需要把arthas的输出打印到日志里面怎么办?
答:可以直接执行下面的文件,让命令在后台运行,不用长时间盯着程序。
trace com.gy.bigdatainterfacept.sync.controller.SyncController cjsb > /mnt/arthas/out.log &
此时程序就会启动一个后台线程进行监听并且把日志写入到out.log里面去。
备注:这里的后台程序不宜开启太多,理论上不超过8个,如果我们需要把后台程序杀死怎么办?
jobs kill
4、想要观察下当前java进程的jvm使用情况怎么办?
答:执行下面的程序即可
dashboard
执行后我们就可以看到一个命令行式的显示面板。
还有这个面板是动态的,可以进行持续的观察。下面说下对应的面板名称解释。
序号 | 名词 | 解释 |
1 | ID | Java级别的线程ID,注意这个ID不能跟jstack中的nativeID一一对应 我们可以通过 thread id 查看线程的堆栈 信息 |
2 | NAME | 线程名 |
3 | GROUP | 线程组名 |
4 | PRIORITY | 线程优先级, 1~10之间的数字,越大表示优先级越高 |
5 | STATE | 线程的状态 |
6 | CPU% | 线程消耗的cpu占比,采样100ms,将所有线程在这100ms内的cpu使用量求和,再算出每个线程的cpu使用占比。 |
7 | TIME | 线程运行总时间,数据格式为分:秒 |
8 | INTERRUPTED | 线程当前的中断位状态 |
9 | DAEMON | 是否是daemon线程 |
还没有评论,来说两句吧...