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 准备操作
- 将测试的租户设置路由到测试机器上。
- 设置测试机器的系统参数,sudo sysctl kernel.perf_event_paranoid=1,已经设置过了就不需要设置了。
- 确保关了arms的持续剖析和Arthas的监控。如果不能关的话,可以手动停掉supervisor监控的app,然后手动重新启动app,不带agent参数的,这样做能避免影响其他机器。
- 在app执行文件所在目录,加入777权限。
- 切换用户为jan,然后启动arthas,注入指定的app。
- profiler start启动即可
- 实测支持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:
.io.IOException: well-known file is not secure
java.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 sun.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) at com
解决方法:切换为执行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 小结
好用,值得推荐
- 本文作者: fishedee
- 版权声明: 本博客所有文章均采用 CC BY-NC-SA 3.0 CN 许可协议,转载必须注明出处!