Arthas常用功能及一次线上问题排查
一、Arthas简介
Arthas是Alibaba开源的Java诊断工具,功能很强大,它是通过Agent方式来连接运行的Java进程、主要通过交互式来完成功能。
https://arthas.aliyun.com/doc/stack.html
首先贴出官方文档,自己使用也不多,主要用于一次线上问题排查
二、运行
java -jar arthas-boot.jar ,运行Arthas
选择要粘附的进程,输入编号即可
使用以下两个命令其中一个查看java程序的进程号
ps -ef
jps
备注:也可以通过浏览器连接Arthas,只是执行命令的时候需要加--target-ip参数
三、dashboard
输入以下命令进入仪表盘,监控线程,内存状态,GC等信息
四、thread
打印全部线程:thread
打印最忙的前10条线程: thread -n 10
根据线程号打印: thread 20
找出阻塞其他线程的线程 注意, 目前只支持找出synchronized关键字阻塞住的线程, 如果是java.util.concurrent.Lock, 目前还不支持。
thread -b
如果响应慢,阻塞状态的线程比较多,我们需要重点关注
五、查看已经加载的类(如果没有代码权限,使用jad)
sc com.XXX.sgw.controller.*
sc com.XXX.controller.AccessLogController
六、追踪方法堆栈调用时间
跟踪方法内部调用,输出各个节点的耗时,主要用于响应慢的时候
trace comXXX.controller.api.ServiceGatewayV1Controller list
trace com.XXX.service.ServiceGatewayV1Service customizeQuery m -n 2 ,一般需要输出多次结果,所以这里可以通过-n指定结果数量
七、查看程序调用出入参
类似于debug,查看被测方法的参数和返回值
watch com.XXX.controller.api.ServiceGatewayV1Controller list "{params[0],params[1],returnObj}"
watch com.XXX.service.ServiceGatewayV1Service customizeQuery "{params[0],params[1],params[2],returnObj}"
八、回溯方法执行
下面关注:耗时、IS-RET为false表示失败
tt -t com.XXX.vo.PageVo getPageSize
tt -i 1037 -w "target.getPageSize()"
九、查看方法被调用路径
stack com.XXX.service.impl.PostgresqlServiceImpl customQuery
十、反编译线上代码
jad --source-only com.yingzi.data.sgw.controller.api.ServiceGatewayV1Controller
jad --source-only com.yingzi.data.sgw.controller.api.ServiceGatewayV1Controller getDataByAlgorithm
十一、以3秒为一个时间窗口,统计时间窗口内调用次数,成功次数,失败次数,平时RT时间。用于监控方法的执行情况
monitor -c 3 com.yingzi.data.sgw.controller.api.ServiceGatewayV1Controller list
十二、JVM
重点关注下死锁(DEADLOCK-COUNT,下面不为0,表示有死锁)
根据下面的栈信息,可以看到,这两个线程互相请求被对方占用未释放的资源导致了死锁。举个例子,现实中很少
十三、profiler(火焰图)
系统cpu高的时候,我们可以看系统调用,相比于perf命令,profiler的步骤要更简便点,
profiler start,启动,默认是生成cpu的火焰图,which event to trace (cpu, alloc, lock, cache-misses etc.), default value is cpu
profiler stop,停止,可以看到生成的svg文件路径