最近在学习使用Arthas 排查线上问题,总结来说Arthas 为我们解决线上问题提供了方便,多了一种选择,但对于复杂的问题,我们还是需要使用MAT、ELK、Grafana等工具来分析解决。
这篇文章是我总结了在线上排查问题时,可以使用到Arthas的地方,入门级的命令,不了解Arthas的同学可以看一下。
文章的开头是资料链接,文章的最后是Arthas复杂的用法及解决方案。
资料
- Arthas Doc文档
- Arthas 在线教学
- Arthas jar文件
- GitHub 地址
- 官方群组:钉钉群:21965291、30707824。企鹅群:916328269。
- 官方微信公众号:横云断岭的专栏
- 博客【不确定是不是官方】: hengyunabc.github.io/
修改日志输出级别
场景:线上频繁打印日志,存储空间不足。需要修改日志级别来输出debug日志等场景。
修改某个class的日志级别
# 启动 Arthas,并选择你的项目
[5080@Server11079 ~]$ java -jar arthas-boot.jar
# 查找要修改日志级别的class的classLoaderHash值
[arthas@28734]$ sc -d com.tianque.mediation.work.view.repo.DataScreeningRepo
#修改class的日志级别
[arthas@28734]$ logger --name com.tianque.mediation.work.view.repo.DataScreeningRepo --level debug -c 7daf6ecc
#修改成功
Update logger level success.
使用ognl语句修改全局日志级别
# 前面的步骤参考上面的文章,关键是获取classLoaderHash的值
# 执行修改
ognl -c 7daf6ecc '@org.slf4j.LoggerFactory@getLogger("root").setLevel(@ch.qos.logback.classic.Level@ERROR)'
实时获取某个方法的入参、返回值、异常信息等
场景:线上某个方法除了问题,需要对其监控,可获取请求参数及返回值。
# 这个是捕获的是实时的接口信息
# 参数里'-n 5',表示只执行两次
# '-x' 表示遍历深度,可以调整来打印具体的参数和结果内容。
# '-v' 标识打印详细
# '1==1' (condition-express) 请求过滤,方法被多个地方调用时,可以用此来过滤请求,
# 例如:'parpams[1]=="Arthas"',过滤掉第一个参数,值不是"Arthas"的请求。
watch com.tianque.mediation.work.view.repo.DataScreeningRepo dataScreening '{params,returnObj,throwExp}' -v -n 5 -x 3 '1==1'
图中圈住的位置,无异常返回null,有异常会打印堆栈日志
实时获取方法执行耗时
场景:像是某个方法频繁超时,用此查看是哪个步骤耗时最多
# '--skipJDKMethod false' 默认情况下,trace不会包含jdk里的函数调用,如果希望trace jdk里的函数,需要显式设置--skipJDKMethod false
trace com.tianque.mediation.work.view.repo.DataScreeningRepo dataScreening -v -n 5 --skipJDKMethod false '1==1'
反编译,热部署
反编译工具很好用,但热部署功能就显得很鸡肋了。Arthas官方文档推荐使用jad/mc/redefine等一连串命令实现class远程热替换,可实际使用上mc编译命令大概率会失败,导致无法热部署。 还有一只方法是使用插件将class二进制文件转换成base64编码,然后再复制粘贴到远程服务器,再把base64编码转换成class文件,最后,使用redefine进行热替换,但此法方法我在实际使用上也频频失败,很不稳定。
# 反编译
jad --source-only com.tianque.mediation.work.view.repo.DataScreeningRepo dataScreening
热部署我就不掩饰了,确实很鸡肋。
生成系统火焰图
用于统计系统指标,分析系统新能。可统计指标还是挺多的。例如:
-e cpu, 可以看出占用cpu比较大的资源。
# 开始启动统计
profiler -e cpu start
# 查看统计状态
profiler status
# 停止统计并输出问题,默认是svg
profiler stop
Dashboard,展示项目运行时的信息
可以直观的看到项目的内存与线程状况
#当前系统的实时数据面板
dashboard
Arthas的缺点
可能之前对Arthas期望太高,几天的使用下来,还是有很多不满意的地方。
- 缺乏对已有日志的分析。可能是定位不一样,我们只能用Arthas分析实时的数据(或者主动捕获数据,例如tt命令),这导致线上除了问题之后,我们还要依赖ELK等工具来拉取完整的信息。
- 无法获取某个类或方法的日志。虽然我们可以通过Watch 捕获对象的获取异常日志,但如果我想看某个方法的一般日志就没有办法了,导致我排查问题时还是要借助其他工具来拉取完整的日志
- 热部署功能基本无法实现。
- tt命令的回放功能使用条件很苛刻。官方文档上说tt命令记录了完整的请求信息,但实际使用时,我们的环境稍微复杂一点,回放功能就无法使用了,例如:用户session在回放时缺失,倒是无法回放。
- 命令之间无法协作。例如我用tt捕获一个请求,但tt捕获的内容有限,我如果想获取这个方法每个步骤的执行时间,就只能用trace命令去捕获新的请求,无法在tt已捕获的请求上调用。
- 缺乏对heap 的分析,如果想排查内存泄漏问题,还是用MAT更好。
- 内网环境无法使用Arthas,内网在启动Arthas时会报异常:
Arthas Idea 插件
Arthas IDEA 插件:一款十分便利好用的插件,常用的命令都可以通过插件一键生成,然后粘贴到服务器运行。安装后效果如下:
无论是学习Arthas还是日常使用,都建议安装一个。