利用Arthas进行简单的故障注入

目录

 

一、概念

二、整体逻辑

三、相关文档

四、故障注入实践


一、概念

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

二、整体逻辑

Arthas 的整体逻辑也是在 Java 的 Instrumentation基础上来实现,所有在加载的类会通过Agent的加载, 通过addTransformer之后,进行增强,然后将对应的Advice织入进去,对于类的查找,方法的查找,都是通过SearchUtil来进行的,通过InstrumentloadAllClass方法将所有的JVM加载的class按名字进行匹配,一致的会进行返回。

三、相关文档

快速入门

进阶使用

四、故障注入实践

在保证自身服务稳定的前提下,为了模拟远程调用服务出现异常情况,采用  Arthas 热更新线上服务代码的方式实现故障注入。


1、下载 Arthas 到服务器

curl -o /tmp/arthas-boot.jar https://arthas.aliyun.com/arthas-boot.jar


2、获取服务的进程号

ps -ef | grep 服务名

3、使用 Arthas atach 到服务上

/home/work/bin/服务名/java/bin/java -jar /tmp/arthas-boot.jar

4、输入服务进程号前的数字,并回车,进入 arthas 操作界面


5、在 Arthas 界面中使用 sc 命令加 -d 参数指定全限定名查找 Demo 类的相关信息,得到加载 Demo 类 ClassLoader 对应的 Hash 值

sc -d com.***.Demo | grep classLoaderHash | head -n1

6、编译Demo.java 文件,可以先提前将改好的代码传上来,在 Arthas 界面中使用 mc 命令内存编译Demo类,并通过 -c 参数指定由上一步获取的ClassLoader 的 hash 值( -d 参数为编译后文件输出目录)

$ mc -c hash值 /tmp/服务名/Demo.java -d /tmp/服务名

7、得到编译后的 Demo.class 文件后(可能会有匿名类Demo$1.class文件,如果没有修改匿名类逻辑,不需要热更新), 就可以用 retrasform 命令热更新代码了(class文件路径为上一步中输出的 /tmp/服务名/com/***/Demo.class )。

$ retransform /tmp/服务名/com/***/Demo.class

8、查看有多少个热加载更新的class,同一个就是id 增加的,删除之后,就是按最大Id也就是最近替进去的执行

retransform -l 

9、实践结束后,使用 retransform 命令撤销更新

retransform --deleteAll

10、注意:撤销之后,默认并不还原,还是 有特意添加的日志输出,jad 也还是影响的版本,要想显示的去生效旧版,还要再执行下面的指令才能完全恢复

retransform --classPattern com.***.Demo

11、退出arthas

如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。

如果想完全退出arthas,可以执行stop命令。

12、注意:当退出后,通过指令重新进入arthas操作界面时, 如果报arthas 3658端口占用错误

[ERROR] The telnet port 3658 is used by process 2822 instead of target process 6062, you will connect to an unexpected process.
[ERROR] 1. Try to restart arthas-boot, select process 2822, shutdown it first with running the 'stop' command.
[ERROR] 2. Or try to stop the existing arthas instance: java -jar arthas-client.jar 127.0.0.1 3658 -c "stop"
[ERROR] 3. Or try to use different telnet port, for example: java -jar arthas-boot.jar --telnet-port 9998 --http-port -1

13、根据提示,执行命令即可正常进入,一台机器上如果同时用arthas测试多个服务,可以采用不同的telnet端口号:

/home/work/bin/服务名/java/bin/java -jar /tmp/arthas-boot.jar --telnet-port 9998 --http-port -1

猜你喜欢

转载自blog.csdn.net/xiao__jia__jia/article/details/114944434