Arthas 使用
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到 JVM 的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
- 怎样直接从 JVM 内查找某个类的实例?
Arthas(阿尔萨斯)是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
Arthas 采用命令行交互模式,同时提供丰富的 Tab
自动补全功能,进一步方便进行问题的定位和诊断。
同时 Arthas 也支持通过 Web Console 进入命令行交互模式,这适用于开发人员没有服务器权限时通过 Arthas Web Console 诊断业务。
1. 插件集成
通过 Rainbond 插件的机制,从 Rainbond 开源应用商店一键安装 Arthas 插件并在组件中开通,组件启动时会自动下载 arthas-agent.jar
结合环境变量配置使用 javaagent
方式启动。
2. Arthas Tunnel 集成
当我们的微服务业务有 10+,这时通过 Arthas 去诊断就会比较麻烦,开发人员没有服务器的权限并且通过 Web Console 访问的话也会由于访问地址太多导致特别混乱。这时就需要通过 Arthas Tunnel Server/Client 来远程管理/连接多个 Agent。
Arthas Agent 会通过 WS 注册到 Arthas Tunnel 中,实现统一管理。
Arthas Tunnel 可通过 Rainbond 开源应用商店一键安装。
3. Arthas Web Console
对于 Spring Boot 应用则无需通过 Arthas Tunnel 访问 Web Console,在组件内添加8563端口即可访问 Web Console。(注意:域名访问需开启 Websocket 支持
团队 -> 新增 -> 基于应用商店创建组件 -> 在应用商店中搜索 若依SpringBoot
进行一键部署。
2. 安装 Arthas Java Agent 插件并配置
安装插件
团队 -> 插件 -> 从应用商店安装插件 -> 在应用商店中搜索 Arthas-Agent
进行一键部署。
开通插件
环境变量配置
为 ruoyi-admin
组件配置环境变量,在组件内 -> 环境变量 -> 添加变量。
2.4 添加端口并更新
为 组件添加 8563 端口并打开对外服务,更新组件完成后可通过默认域名访问 Web Console。
使用 Arthas 诊断部署在 Rainbond 上的微服务 Spring Cloud Pig,并通过 Arthas Tunnel 统一管理 Arthas agent。
团队 -> 新增 -> 基于应用商店创建组件 -> 在应用商店中搜索 SpringCloud-Pig
进行一键部署。
2. 部署 Arthas Tunnel
团队 -> 新增 -> 基于应用商店创建组件 -> 在应用商店中搜索 Arthas-Tunnel
进行一键部署。
安装插件
团队 -> 插件 -> 从应用商店安装插件 -> 在应用商店中搜索 Arthas-Agent
进行一键部署。
开通插件
为每个微服务组件都开通插件,进入微服务组件 -> 插件 -> 开通插件 Arthas-Agent
。
配置环境变量
为每个微服务组件配置环境变量,在组件内 -> 环境变量 -> 添加变量。
变量名 | 变量值 | 说明 |
---|---|---|
JAVA_OPTS | -javaagent:/arthas/arthas-agent.jar | JAVA 启动参数 |
ARTHAS_APP_NAME | register | arthas app name,根据实际情况修改 |
ARTHAS_AGENT_ID | register | arthas agent ID 不可与其他 ID相同,是唯一的 |
配置依赖关系
将所有微服务组件依赖至 arthas tunnel
,应用视图切换到编排模式进行拖拉拽。
批量更新
更新/重启所有微服务相关组件。可在 列表
中批量操作。
4. 通过 Arthas Tunnel 连接到其他 Agent 进行诊断
1.可通过 Arthas Tunnel 8080 端口默认生成的域名访问 Web Console。
2.在 Web Console 中的 IP:PORT 填写 Arthas Tunnel 7777 的对外服务端口,7777 端口是 Agent 连接到 Tunnel 的。所以在通过 Web 远程连接到其他服务时修改 AgentId 即可连接
Arthas 采用命令行交互模式,同时提供丰富的 Tab
自动补全功能,进一步方便进行问题的定位和诊断,以下是部分命令,详细请参阅文档
- dashboard - 当前系统的实时数据面板
- getstatic - 查看类的静态属性
- heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能
- logger - 查看和修改 logger
- mbean - 查看 Mbean 的信息
- memory - 查看 JVM 的内存信息
- ognl - 执行 ognl 表达式
- perfcounter - 查看当前 JVM 的 Perf Counter 信息
- sysenv - 查看 JVM 的环境变量
- sysprop - 查看和修改 JVM 的系统属性
- thread - 查看当前 JVM 的线程堆栈信息
- vmoption - 查看和修改 JVM 里诊断相关的 option
- vmtool - 从 jvm 里查询对象,执行 forceGc
以下是部分命令的使用截图:
2. 生成火焰图
命令支持生成应用热点的火焰图。本质上是通过不断的采样,然后把收集到的采样结果生成火焰图。
以下命令均在Arthas Tunnel Web Console 中执行。
1.启动 profiler
2.停止 profiler 并生成火焰图
默认情况下,结果文件是html
格式,也可以用--format
参数指定:
$ profiler stop --format html
profiler output file: /app/arthas-output/20220907-214802.html
3.通过浏览器查看火焰图
上一步生成的 html 文件在指定的微服务组件中,所以需要在该微服务组件中查看火焰图。