Linux下Arthas(阿尔萨斯)的简单使用-接口调用慢排查
就一个进程org.apache.catalina.startup.Bootstrap,输入编号1回车。k8s容器内运行了一个springboot服务,服务的启动方法是main()方法。先执行命令,再调用对应的方法。最终定位到执行慢的代码。
使用环境
k8s容器内运行了一个springboot服务,服务的启动方法是main()方法
下载并启动 arthas
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
选择应用 java 进程
就一个进程org.apache.catalina.startup.Bootstrap,输入编号1回车。Arthas 会 attach 到目标进程上,并输出日志:
使用thread命令查看所有进程
使用 trace 查看方法内部调用路径,并输出方法路径上的每个节点上耗时
先执行命令,再调用对应的方法
trace cc.eslink.bu.controller.pc.QueryMapController queryMapWaterDecline
trace cc.eslink.bu.service.impl.QueryMapServiceImpl queryMapWaterDecline
trace cc.eslink.bu.service.impl.QueryMapServiceImpl queryMap
最终定位到执行慢的代码
stop 关闭 Arthas 服务端
常用命令
jad (字节码文件反编译成源代码 )
# 1、反编译java.lang.String
jad java.lang.String
# 2、反编绎时只显示源代码(默认情况下,反编译结果里会带有ClassLoader信息)
jad --source-only demo.MathGame
# 3、反编译指定的函数
jad demo.MathGame main
mc (Memory Compiler/内存编译器 )
Memory Compiler/内存编译器编译,java文件生成.class文件。
# 1、在内存中编译Test.java为Test.class
mc /opt/Test.java
# 2、可以通过-d命令指定输出目录
mc -d /opt/test /root/Test.java
redefine(加载外部的.class文件,redefine到JVM里 )
常用来解决线上服务不停止,修改代码操作。
注:
1)、redefine后的原来的类不能恢复,redefine有可能失败(比如增加了新的field)。reset命令对redefine的类无效。如果想重置,需要redefine原始的字节码。redefine命令 jad / watch /trace/ monitor/tt 等命令会冲突。执行完redefine之后,如果再执行上面提到的命令,则会把redefine的字节码重置;
2)、不允许新增加 field/method;
3)、正在运行的函数,没有退出不能生效。
# 1、使用jad反编译 demo.MathGame 输出到 /opt/MathGame.java
jad --source-only demo.MathGame > /opt/MathGame.java
# 2、把上一步反编译的代码修改完成后,使用mc在内存中对新的代码进行编译
mc /opt/MathGame.java -d /opt
# 3、使用redefine命令加载新的字节码
redefine /opt/demo/MathGame.class
trace 查看方法调用耗时
参考链接
官方文档
https://arthas.aliyun.com/doc/vmtool.html
其它博客
https://blog.csdn.net/DevelopmentStack/article/details/117557817
https://github.com/alibaba/arthas/issues?q=label%3Auser-case
更多推荐
所有评论(0)