当Spring Boot遇上Arthas--业务研发问题排查实践

·  阅读 1767
当Spring Boot遇上Arthas--业务研发问题排查实践

Arthas简介

Arthas 出处

Arthas(阿尔萨斯)是阿里巴巴开源的 Java 诊断工具,是排查问题的瑞士军刀,深受开发者喜爱。当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决:

  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?

  • 遇到问题无法在测试环境 debug,难道只能通过加日志再重新发布吗?

  • 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!

  • 是否有一个全局视角来查看系统的运行状况?

Arthas 采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

Arthas 架构

Arthas是C/S模式,多个Client,只有一个Server,目标Java进程只需被 attach 一次。其中bytekit是阿里开源的字节码增强工具包,可以在目标Java进程增强代码,实现monitor/watch/trace等功能。arthas的实现原理主要使用了JVM Attach API、Java Instrumentation 接口、字节码增强等技术。类似的工具还有JProfiler,不过JProfiler收费、界面复杂,相比之下arthas免费开源、易用方便。

Arthas 技能树

实践 查看方法入参/返回值/异常

使用Arthas attach目标Java进程:

java -jar ~/Desktop/arthas-boot-3.4.6.jar
复制代码

查看入参/返回值/异常:

watch <类名表达式> <方法名表达式> '{params,returnObj,throwExp}' -x 2
复制代码

可以使用IDEA插件生成命令

支持根据入参进行条件过滤(-x 表示遍历深度):

watch <类名表达式> <方法名表达式> '{params,returnObj,throwExp}' 'params[0]<0' -x 2
复制代码

HTTP请求500/404/401时,不用再担心没加日志。

实践 定位应用性能热点

使用trace命令跟踪方法的子调用

trace <类名表达式> <方法名表达式> 
复制代码

cpu/heap 火焰图

开始采集:

profiler start --event cpu/alloc
复制代码

结束采集:

profiler stop --format html/svg
复制代码

cpu火焰图(大平顶是可能有性能问题的函数)

heap火焰图(顶部是heap中数量较多的对象)

实践 热更新代码

测试环境想改行代码、加行日志输出,commit、push、publish、等应用重启?一顿操作下来,10分钟过去了,人生苦短,试试在线热更新代码(PHP、Python等动态语言的优势之一):

1 反编译代码

jad --source-only 类名表达式  >  /tmp/Foo.java
复制代码

2 查找加载目标类的ClassLoader

sc -d 类名表达式 | grep classLoaderHash
复制代码

3 内存编译

mc --classLoaderClass  类加载器  Foo.java  -d /tmp
复制代码

4 更新类的字节码

retransform /path/Foo.class
复制代码

更新完代码,想重放调用,恳求测试人员再触发几次?测试人员太忙,测试人员不在电脑旁,只能空等吗,如何快速重放调用?

时空隧道TimeTunnel(tt命令会记录一次调用所有现场信息):

tt -t  <类名表达式> <方法名表达式> -n  <记录调用次数>
复制代码

重放 INDEX 为1001的调用:

tt -i 1001 -p
复制代码

查看 INDEX 为1001的调用详情:

tt -i 1001  // 会打印入参/返回值/异常
复制代码

实践 解决类冲突

查看ClassLoader的继承树(使用classloader命令可以查询类来自哪个jar、由哪个ClassLoader加载):

classloader -t
复制代码

使用ClassLoader定位类加载路径:

classloader -c <classLoaderHash> -r java/lang/String.class
复制代码

更多 arthas 命令参考:

arthas.aliyun.com/doc/command…

分类:
后端
标签:
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改