Arthas 使用实践

1、Arthas

Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。

2、学习总结

2.1、所有环境都在线上,学习时不用自己搭环境

官方在线学习教程

2.2、官方文档

具体命令中文文档

2.3、相关参考博文

介绍博文

远程连接 jvm

arthas tunnel server 模式,运行在服务器上的 server, 通过本地输入 agentId 连接。

2.4、idea arthas 插件

idea 插件介绍
idea 插件文档

3、各种捣腾

3.1、Arthas 下载使用

离线安装文章
直接下载使用

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

启动后可以直接查看 JVM 里运行的程序
在这里插入图片描述
在这里插入图片描述

3.2、支持管道操作

sc -d *MathGame | grep Math

3.3、基础命令

  • sc, 搜索类,可以全限定名或者通配符,根据定位出来的结果,找到对应的类。

    sc -d *MathGame
    
  • jad, 反编译代码,可以直接查看,定位结果后,直接反编译初略地找下问题。

    jad demo.MathGame
    
  • watch, 监控各个方法使用时长

    watch <类名> <方法名> returnObj
    watch demo.MathGame primeFactors returnObj
    watch com.sample getUserName '{params,returnObj,throwExp}'  -n 5  -x 1
    

    在这里插入图片描述

  • 退出使用 exit 或者 quit,只能退出当前 session, 再次进入需要再执行一次 java 命令。 想要结束 server, 需要进入之后 stop

    java -jar arthas-boot.jar
    
  • vmtool (since 3.5.1)
    可参考堆栈中对象的信息

    vmtool --action getInstances --className org.apache.catalina.session.StandardManager --express 'instances[1].sessions' -x 2
    

3.4、进阶命令

  • sysprop 可以打印所有的System Properties信息,添加,查看 key 值

  • sysenvsysprop 类型

  • jvm

  • dashboard 实时监控页面

  • help 查看帮助文档

  • Tab 自动补全

  • keymap 查看快捷键信息, 如: Ctrl + A 行首, Ctrl + E 行尾

  • pipeline, 即 |, 如:sysprop | grep java

  • sc 查找类
    查看 classLoader

    sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash
    

    指定 classLoader
    ognl -c 1be6f5c3
    ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader

  • sm 查找函数
    sm命令则是查找类的具体函数。比如:

    sm java.math.RoundingMode
    

    通过-d参数可以打印函数的具体属性:

    sm -d java.math.RoundingMode
    

    也可以查找特定的函数,比如查找构造函数:

    sm java.math.RoundingMode <init>
    
  • Ognl 动态执行代码, 通过 arthas 执行代码, 可以在运行的 jar 里面执行, 应该是通过字节码增强技术实现。
    如:ognl '@java.lang.System@out.println("hello ognl")' 执行后,在目标进程里可以查看到日志: hello ognl。
    特殊用法参考
    官方指南

  • 热更新代码:jad -> mc -> redefine

  • tt即 TimeTunnel,它可以记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。

    tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
    
  • trace使用 ognl 表达式过滤
    trace *StringUtils isBlank '#cost>100'表示当执行时间超过100ms的时候,才会输出trace的结果。

4 idea arthas plugin 配合远程使用

Arthas 远程连接有两种,一种是使用 web consol, 另外一种是使用 Http Api

4.1、 安装idea arthas 插件

选择需要查看的方法或类,右键打开,选择 Arthas Command, 自动生成需要的命令,如:tt -t xxx.HttpTestController post -n 5 '1==1', 这个是这个插件自动生成的。
在这里插入图片描述

4.2、 安装 arthas tunnel server/client

官方安装文档

  1. 下载部署arthas tunnel server

  2. 默认情况下,arthas tunnel server的web端口是8080,arthas agent连接的端口是7777

    java -jar arthas-tunnel-server-3.4.5-fatjar.jar --server.port=8888
    
  3. 启动 arthas 客户端, 并注册到 arthas-tunnel-server, 注册 agent 需要使用 7777 端口

    java -jar arthas-boot.jar --tunnel-server 'ws://127.0.0.1:7777/ws' --agent-id test
    

    启动时会要求选择 PID , 这个 PID 就是此次启动的 agent 注册到 server 的 agent-id.

  4. 使用 web 页面
    agentId 就是启动 client 时设置的 test
    在这里插入图片描述

  5. 登陆 http://<实际 IP 地址 不能填127>:8888/actuator/arthas 查看 agentId 注册信息,用户名 arthas, 密码在启动时生成。
    在这里插入图片描述
    登陆后显示结果
    在这里插入图片描述

  6. 配合 idea arthas 插件使用, web console 不能黏贴,只适合开发阶段使用

4.3、Http API

http api 适合定时抓取信息, 如使用 shell 脚本或者使用代码进行开发, 做自己的监控。Http Api 是针对 client 端的访问,也就是 arthas-boot.jar, 每次只能指定一个应用。
简单的使用方式:获取 arthas 版本信息

curl -X POST -i 'http://127.0.0.1:8563/api' --data '{
  "action":"exec",
  "command":"version"
}'

其他例子看http api 官网

4.4、async-profiler生成火焰图

目前只支持 linux/mac,相关排查文章
图片来源https://www.cnblogs.com/alisystemsoftware/p/13596262.html

5、总结

arthas 的目的是做监控,因此都是在必要时使用, 没必要一直运行。
远程连接到 arthas 有两种方法: 1 启动一个服务端,每个客户端注册到服务端上,通过 web console 访问。2. 直连客户端的 8563 端口,使用 http api 访问。
如果是在物理环境下,每次应用重启,arthas 都要重新绑定 PID, 如果通过 docker 部署就不用手动指定 PID。
使用 web console 方式,服务端可以常开, 客户端只有需要的时候才启动,减少资源浪费。
arthas 作为最后排查工具出现, 在监控环节需要另外的中间件提供信息。

### 如何使用 Arthas 来追踪和诊断异常 Arthas 是一种强大的 Java 应用程序诊断工具,能够帮助开发者快速定位线上问题。以下是关于如何利用 Arthas 的 `trace` 和其他相关功能来追踪和诊断异常的具体说明。 #### 已知信息概述 Arthas 提供了一系列用于监控和调试的功能,其中包括但不限于以下几种命令: - **trace**: 跟踪方法的调用路径及其耗时情况。 - **watch**: 观察方法执行过程中的参数、返回值或抛出的异常。 - **stack**: 查看当前线程堆栈信息,分析阻塞原因。 - **tt**: 记录方法的历史调用数据以便后续回溯分析。 当遇到性能瓶颈或者异常行为时,可以借助上述命令深入剖析问题所在位置及根本原因[^1]。 #### 实际操作指南 假设我们已经发现某接口存在潜在 SQL 性能问题,则可以通过如下方式进一步确认具体细节: 1. **启动 Arthas 并连接目标 JVM** 首先需要确保已安装好 Arthas 客户端,并成功附加至待检测的服务进程之上。 2. **定位可疑与方法** 利用 `sc` (search class) 或者 `sm` (search method),查找涉及数据库交互的相关组件定义。 3. **运用 Trace 命令捕捉慢查询现象** 执行似于下面这样的指令去观察特定函数内部运作状况: ```bash trace com.example.service.UserService getUserById {params -> params[0].equals(123)} ``` 此处示例表示仅针对 ID 参数等于 123 的场景展开细致化探查;当然也可以省略过滤器部分从而覆盖更广范围内的请求实例[^3]。 4. **捕获异常事件** 如果希望专注于那些触发错误响应的情形,则可改用 Watch 功能配合自定义逻辑表达式完成筛选工作: ```bash watch com.example.dao.UserDao parseXXX "" {throwable -> throwable} ``` 上述语句的作用在于每当 `parseXXX()` 出现未处理好的例外情形之时即刻反馈出来,便于迅速锁定故障源头[^2]。 5. **清理资源释放负担** 在完成必要的调查之后记得及时移除临时注入的内容以免干扰正常运行环境稳定性。这通常涉及到发出 Reset 请求撤销先前所做的改动措施。 ```bash reset com.example.dao.UserDao parseXXX ``` 以上便是基于官方文档推荐的最佳实践流程介绍。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值