Java诊断工具Arthas

2024-07-29 fishedee 后端

0 概述

Java诊断工具,Arthas,神器。

官网在这里

1 安装

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

弹出进程名,选择进程,回车就可以了

stop

退出Arthas,需要先stop,后exit,否则Arthas依然挂在当前的服务上的

2 thread

thread

显示所有线程

thread --state BLOCKED

显示当前阻塞的线程

thread [id]

显示线程当前的堆栈

3 profiler

3.1 使用

profiler start
profiler stop

启动profiler,执行任务以后,停止profiler即可,这个时候会导出profiler文件,然后用浏览器打开即可

3.2 准备操作

  1. 将测试的租户设置路由到测试机器上。
  2. 设置测试机器的系统参数,sudo sysctl kernel.perf_event_paranoid=1,已经设置过了就不需要设置了。
  3. 确保关了arms的持续剖析和Arthas的监控。如果不能关的话,可以手动停掉supervisor监控的app,然后手动重新启动app,不带agent参数的,这样做能避免影响其他机器。
  4. 在app执行文件所在目录,加入777权限。
  5. 切换用户为jan,然后启动arthas,注入指定的app。
  6. profiler start启动即可
  7. 实测支持3.7.2版本

4 trace

trace class-pattern method-pattern  

然后执行方法内部的trace结果

trace -E com.test.ClassA|org.test.ClassB method1|method2|method3

使用多层trace来寻找

5 monitor

monitor -c 10 class-pattern method-pattern  

每10秒收集一次数据,然后统计输出,统计方法的调用次数和平均时间。

monitor -c 10 com.fishedee.jpa_boost.CurdRepository *

该方法可以统计所有db执行的时间和延迟是多少

9 FAQ

9.1 java.net.ConnectException: Connection refused (Connection refused)

如果在arms中启用了Arthas监控,这个时候再启动本地Arthas就会报错,需要先停掉arms的Arthas。

9.2 java.io.IOException: well-known file is not secure

[ERROR] Start arthas failed, exception stack trace: 
java.io.IOException: well-known file is not secure
    at sun.tools.attach.LinuxVirtualMachine.checkPermissions(Native Method)
    at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:117)
    at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:78)
    at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:250)
    at com.taobao.arthas.core.Arthas.attachAgent(Arthas.java:85)
    at com.taobao.arthas.core.Arthas.<init>(Arthas.java:28)
    at com.taobao.arthas.core.Arthas.main(Arthas.java:123)

解决方法:切换为执行java程序的用户启动arthas。例如,java程序的执行用户为jan,那么启动arthas的用户也需要为jan

9.3 Could not set dlopen hook.

profiler中如果提示了这个错误,有两个方法:

  • 先停掉arms的持续剖析
  • 再试试停掉arms的agent,再重启应用

9.4 AsyncProfiler error: No access to perf events. Try –fdtransfer or –all-user option or ‘sysctl kernel.perf_event_paranoid=1’

sudo sysctl kernel.perf_event_paranoid=1

在bash脚本执行以上命令即可

9.5 AsyncProfiler error: No such file or directory

解决方法看这里

  • 先找到当前用户是谁,ps -ef | grep 28901 | grep -v grep | awk ‘{print $1}’
  • 然后查看java执行文件的目录是谁, ls -l /proc/28901/cwd | awk ‘{print $NF}’
  • 将Java执行文件的赋予用户权限,或者777都是可以的。

这是因为Arthas在执行Profiler的时候,需要在Java执行文件的所在目录,使用Arthas的运行用户创建Arthas-output目录的,如果没有权限的话,会提示以上报错。

10 小结

好用,值得推荐

相关文章