一、背景与简介
1、介绍
如果你的程序是Java开发,有时候生产环境出现性能瓶颈或者接口访问缓慢、又或者本地环境无法进行复现,只会在线上产生bug或者问题,这时候我们需要进行在线debug排查问题。但是生产环境又不能轻易重启、或者使用传统方式轻易的debug、jmap、jstack等等进行排查,因为这些传统工具可能会导致程序业务线程暂停,产生线上事故。 那么我们有什么工具能方便我们针对线上程序做调试或者定位问题吗? 这个神器就是Alibaba开源的Arthas.
Arthas 是一款线上Java应用监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
官方站点: https://arthas.gitee.io/doc/
详情可以查看官方网站, 官网有相关DOC文档、教程、指令等相关使用参考
2、Arthas(阿尔萨斯)能为你做什么?
Arthas
是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas
可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到 JVM 的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
- 怎样直接从 JVM 内查找某个类的实例?
Arthas
支持 JDK 6+,支持 Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab
自动补全功能,进一步方便进行问题的定位和诊断。
二、基本安装和初体验
1、基本安装
1、下载Arthas包
https://arthas.aliyun.com/download/latest_version?mirror=aliyun
2、保证当前服务器存在至少1个JAVA进程, 使用命令运行 java -jar arthas-boot.jar,此时会在线下载依赖的JAR包到本地,最后执行.
3、选择至少1个需要监控或者观察的进程ID, 回车,进入Arthas控制台。否则Arthas探测不到任何进程,则Arthas直接退出
4、进入Arthas控制台
2、与Linux相比,功能类似的基本指令
1、version、help、cls、history、grep、pwd、echo、tee
version: 显示当前Arthas的版本号
help: 查看有哪些命令、各个命令的功能、参数是什么
cls: 清屏
history: 查看历史命令
grep: 管道关键词过滤
pwd: 查看当前attach进程所在的工作目录
echo: 和Linux一致
tee: 和Linx一致
3、常用的基本命令
1、dashbord
可以查看当前JVM虚拟机的Thread线程运行情况、Memory内存情况、操作系统信息,实时更新,类似Linux的Top命令:
2、thread
查看JVM线程运行情况:
3、memory
查看JVM堆内存情况:
4、jad
jad可以针对某个具体类做反编译出Java源代码,在排查时可以做一些逻辑实现的参考:
5、jvm
查看JVM相关信息,可以查看GC信息、内存信息等:
三、高级排查指令
1、monitor[监控类的方法执行情况]
1、-c参数,运行次数
monitor -c 5 demo.MathGame
时间戳、类名称、方法、调用次数、成功次数、失败[抛出异常]次数、平均耗时、失败率.
2、params条件表达式
2、trace[方法调用耗时跟踪]
1、简单使用
trace demo.MathGame run
trace追踪demo.MathGame这个类的 run 方法, 看下run方法的里面各个方法的执行耗时时长.
源码:
2、trace #cost耗时条件
trace demo.MathGame run '#cost > 0.1'
trace追踪demo.MathGame run方法, 并且只有耗时大于0.1ms的才打印出来
3、通过listenerId,深入显示调用层级
1、首先第一版执行一次trace, 得到一个listenerId, 此时只展示第一层调用关系
此时,拿到listenerID: 5
2、如果我还想继续看primeFactors()函数的调用追踪,我新开启一个Arthas终端,然后继续使用这个命令追踪目标函数primeFactors, 但是后面需要添加参数 --listenerId 5
执行命令:
trace demo.MathGame primeFactors --listenerId 7
原窗口显示的层级变多了:
3、watch[函数执行数据观测]
让你能方便的观察到指定函数的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看
watch demo.MathGame primeFactors -x 2
观察表达式,默认值是{params, target, returnObj}
watch观察 demo.MathGame这个类的 primeFactors 方法执行情况[默认时机: 函数正常结束]的返回值内容, -x 2 -x是显示Java对象信息的深度,默认是1, 最大是4.
显示对象深度越大,对象的整体数据结构和信息越详细
4、stack[输出当前方法被调用的调用路径]
很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多,或者你根本就不知道这个方法是从那里被执行了,此时你需要的是 stack 命令。
监控某个类的某个方法,都被那些类的方法调用了,因为调用入口可能很多
四、总结
上述知识一些常用高频命令的简介和简单使用,更加详细的深入需要我们针对Arthas进行实操,使用过程中我们才能将这些命令融会贯通,发挥价值。 因为单纯只是从单个指令而言,好像简单,但是现实的实际情况远比我们想象的复杂,所以如何运用这些命令才是关键。