Arthas是什么
你以为如下图
其实这里的Arthas如下图
实际上Arthas:
- 是一个命令行工具
- 通常是一个通过java启动的jar包
- 大量运用字节码等黑科技直接读取甚至控制对应的java进程的工具
Arthas主要解决的问题
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
总得来说特别适合
线上&性能&线下难复现的BUG排查
典型场景
现象
软件CPU占用率异常居高不下
操作
1.登录生产服务器
2.将arthas-boot.jar复制到生产服务器
3.java -jar 启动
4.查看整体情况
dashboard
5.寻找热点线程
thread –i 3000 –n 5
也可以通过下面脚本寻找入口
thread 1 | grep 'main'
6.反编译查看源码进一步定位,
jad --source-only com.wangji92.arthas.plugin.demo.controller.CommonController
这样你就基本可以知道大体情况
7. 通过monitor来对可以代码行进行统计
monitor com.wangji92.arthas.plugin.demo.controller.CommonController add -n 10 --cycle 10
8. 查看是否被调用了,参数和返回值,异常
watch com.wangji92.arthas.plugin.demo.controller.CommonController * '{params,returnObj,throwExp}' -n 5 -x 3
9.查看调用链情况
trace com.wangji92.arthas.plugin.demo.controller.CommonController getRandomInteger -n 10
- 必要的时候进行堆栈分析
heapdump 1.hprof
mat分析dump
Arthas的一些问题
- 门槛较高,需要使用较为复杂的参数或语法糖,你真的需要一个小本本来记录常用的语法
- 功能太强,有风险,由于Arthas直接运行于生产服务器,且基于字节码等技术,完全可以绕过各种安全机制,直接操作软件内部参数和方法,一旦操作失误将很难处理,而且从外部还看不出来问题
- 运行于生产服务器,要挤占服务器资源
当然Arthas仍然是应该是挽救你发量的有效工具,你总不希望,紧急时刻面对着软件日志,全靠猜出了什么问题吧。
参考
- https://github.com/alibaba/arthas/issues?q=label%3Auser-case
- https://alibaba.github.io/arthas/