文章目录
- Arthas
- Arthas(阿尔萨斯)能为你做什么?
- 安装
- 1.linux中使用
- 2.docker中使用
- 命令列表
- jvm 相关
- class/classloader 相关
- monitor/watch/trace
- profiler/火焰图
Arthas
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
Arthas(阿尔萨斯)能为你做什么?
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到 JVM 的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
- 怎样直接从 JVM 内查找某个类的实例?
安装
1.linux中使用
# 下载
[root@VM-4-8-centos www]# curl -O https://arthas.aliyun.com/arthas-boot.jar
# 启动
[root@VM-4-8-centos www]# java -jar arthas-boot.jar
2.docker中使用
遇到的错误
# 在rancher中,找到容器,执行命令行,直接进到容器内部
/ # cd /opt/arthas/
/opt/arthas # ls
arthas-agent.jar arthas-client.jar arthas-spy.jar as-service.bat as.sh install-local.sh logback.xml
arthas-boot.jar arthas-core.jar arthas.properties as.bat async-profiler lib math-game.jar
/opt/arthas # java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.5.5
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 1 /app.jar
1
[INFO] arthas home: /opt/arthas
[INFO] Try to attach process 1
[ERROR] Start arthas failed, exception stack trace:
com.sun.tools.attach.AttachNotSupportedException: Unable to get pid of LinuxThreads manager threadat sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:86)at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:78)at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:250)at com.taobao.arthas.core.Arthas.attachAgent(Arthas.java:102)at com.taobao.arthas.core.Arthas.<init>(Arthas.java:27)at com.taobao.arthas.core.Arthas.main(Arthas.java:151)
[ERROR] attach fail, targetPid: 1
/opt/arthas #
解决方案:
dockfile文件
# 使用jdk完整镜像,否则没有jps命令,arthas启动不了
FROM openjdk:8-jdk-alpine# 将arthas包打进镜像里
COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas# 这个要加,否则启动arthas,会遇到如上错误,选定pid为1时会报错
RUN apk --update --no-cache add tini
ENTRYPOINT ["tini"]
命令行启动
[root@server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
fbef3a25a005 order-service:dev1.0.0 "/.r/r tini sh -c 'j…" 28 seconds ago Up 26 seconds
[root@server ~]# docker exec -it fbef3a25a005 /bin/sh
/ # cd /opt/arthas/
/opt/arthas # ls
arthas-agent.jar arthas-client.jar arthas-spy.jar as-service.bat as.sh install-local.sh logback.xml
arthas-boot.jar arthas-core.jar arthas.properties as.bat async-profiler lib math-game.jar
/opt/arthas # java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.5.5
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 11 /app.jar
1
[INFO] arthas home: /opt/arthas
[INFO] Try to attach process 11
[INFO] Attach process 11 success.
[INFO] arthas-client connect 127.0.0.1 3658,---. ,------. ,--------.,--. ,--. ,---. ,---. / O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' wiki https://arthas.aliyun.com/doc
tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
version 3.5.5
main_class
pid 11
time 2023-06-02 10:08:22 [arthas@11]$
输入dashboard
测试一下
命令列表
官方文档:https://arthas.aliyun.com/doc/
参考使用案例:https://github.com/alibaba/arthas/issues
有真实使用案例再补充
jvm 相关
- dashboard - 当前系统的实时数据面板
- getstatic - 查看类的静态属性
- heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能
- jvm - 查看当前 JVM 的信息
- logger - 查看和修改 logger
- mbean - 查看 Mbean 的信息
- memory - 查看 JVM 的内存信息
- ognl - 执行 ognl 表达式
- perfcounter - 查看当前 JVM 的 Perf Counter 信息
- sysenv - 查看 JVM 的环境变量
- sysprop - 查看和修改 JVM 的系统属性
- thread - 查看当前 JVM 的线程堆栈信息
- vmoption - 查看和修改 JVM 里诊断相关的 option
- vmtool - 从 jvm 里查询对象,执行 forceGc
class/classloader 相关
- classloader - 查看 classloader 的继承树,urls,类加载信息,使用 classloader 去 getResource
- dump - dump 已加载类的 byte code 到特定目录
- jad - 反编译指定已加载类的源码
- mc - 内存编译器,内存编译.java文件为.class文件
- redefine - 加载外部的.class文件,redefine 到 JVM 里
- retransform - 加载外部的.class文件,retransform 到 JVM 里
- sc - 查看 JVM 已加载的类信息
- sm - 查看已加载类的方法信息
monitor/watch/trace
- monitor - 方法执行监控
- stack - 输出当前方法被调用的调用路径
- trace - 方法内部调用路径,并输出方法路径上的每个节点上耗时
- tt - 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
- watch - 方法执行数据观测
profiler/火焰图
- profiler - 使用async-profiler对应用采样,生成火焰图
- jfr - 动态开启关闭 JFR 记录