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 值
-
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
指定 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
官方安装文档
-
下载部署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 作为最后排查工具出现, 在监控环节需要另外的中间件提供信息。