文章目录
- 1、Arthas
- 2、学习总结
- 2.1、所有环境都在线上,学习时不用自己搭环境
- 2.2、官方文档
- 2.3、相关参考博文
- 2.4、idea arthas 插件
- 3、各种捣腾
- 3.1、Arthas 下载使用
- 3.2、支持管道操作
- 3.3、基础命令
- 3.4、进阶命令
- 4 idea arthas plugin 配合远程使用
- 4.1、 安装idea arthas 插件
- 4.2、 安装 arthas tunnel server/client
- 4.3、Http API
- 4.4、async-profiler生成火焰图
- 5、总结
1、Arthas
Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。
2、学习总结
2.1、所有环境都在线上,学习时不用自己搭环境
2.2、官方文档
2.3、相关参考博文
arthas tunnel server 模式,运行在服务器上的 server, 通过本地输入 agentId 连接。
2.4、idea arthas 插件
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 值sysenv
与sysprop
类型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
指定 classLoaderognl -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
- 下载部署arthas tunnel server
- 默认情况下,arthas tunnel server的web端口是8080,arthas agent连接的端口是7777
java -jar arthas-tunnel-server-3.4.5-fatjar.jar --server.port=8888
- 启动 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.
- 使用 web 页面
agentId 就是启动 client 时设置的 test - 登陆 http://<实际 IP 地址 不能填127>:8888/actuator/arthas 查看 agentId 注册信息,用户名 arthas, 密码在启动时生成。
登陆后显示结果 - 配合 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,相关排查文章
5、总结
arthas 的目的是做监控,因此都是在必要时使用, 没必要一直运行。
远程连接到 arthas 有两种方法: 1 启动一个服务端,每个客户端注册到服务端上,通过 web console 访问。2. 直连客户端的 8563 端口,使用 http api 访问。
如果是在物理环境下,每次应用重启,arthas 都要重新绑定 PID, 如果通过 docker 部署就不用手动指定 PID。
使用 web console 方式,服务端可以常开, 客户端只有需要的时候才启动,减少资源浪费。
arthas 作为最后排查工具出现, 在监控环节需要另外的中间件提供信息。