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 使用 - 图2

    使用 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.jarJAVA 启动参数
    ARTHAS_APP_NAMEregisterarthas app name,根据实际情况修改
    ARTHAS_AGENT_IDregisterarthas 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

    以下是部分命令的使用截图:

    Arthas 使用 - 图5

    Arthas 使用 - 图7

    2. 生成火焰图

    命令支持生成应用热点的火焰图。本质上是通过不断的采样,然后把收集到的采样结果生成火焰图。
    以下命令均在Arthas Tunnel Web Console 中执行。

    1.启动 profiler

    2.停止 profiler 并生成火焰图

    默认情况下,结果文件是html格式,也可以用--format参数指定:

    1. $ profiler stop --format html
    2. profiler output file: /app/arthas-output/20220907-214802.html

    3.通过浏览器查看火焰图

    上一步生成的 html 文件在指定的微服务组件中,所以需要在该微服务组件中查看火焰图。