最近在做项目的微服务性能优化,快结尾了,做一下总结,里面关于使用到阿里巴巴的arthas的地方和心得
官方教程:Arthas教程 github
Bootstrap Arthas
EXAMPLES:
java -jar arthas-boot.jar <pid>
java -jar arthas-boot.jar --target-ip 0.0.0.0
java -jar arthas-boot.jar --telnet-port 9999 --http-port -1
java -jar arthas-boot.jar --tunnel-server 'ws://192.168.10.11:7777/ws'
java -jar arthas-boot.jar --tunnel-server 'ws://192.168.10.11:7777/ws'
--agent-id bvDOe8XbTM2pQWjF4cfw
java -jar arthas-boot.jar --stat-url 'http://192.168.10.11:8080/api/stat'
java -jar arthas-boot.jar -c 'sysprop; thread' <pid>
java -jar arthas-boot.jar -f batch.as <pid>
java -jar arthas-boot.jar --use-version 3.1.4
java -jar arthas-boot.jar --versions
java -jar arthas-boot.jar --session-timeout 3600
java -jar arthas-boot.jar --attach-only
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
WIKI:
https://alibaba.github.io/arthas
Options and Arguments:
-h,--help Print usage
--target-ip <value> The target jvm listen ip, default 127.0.0.1
--telnet-port <value> The target jvm listen telnet port, default 3658
--http-port <value> The target jvm listen http port, default 8563
--session-timeout <value> The session timeout seconds, default 1800
(30min)
--arthas-home <value> The arthas home
--use-version <value> Use special version arthas
--repo-mirror <value> Use special maven repository mirror, value is
center/aliyun or http repo url.
--versions List local and remote arthas versions
--use-http Enforce use http to download, default use https
--attach-only Attach target process only, do not connect
-c,--command <value> Command to execute, multiple commands separated
by ;
-f,--batch-file <value> The batch file to execute
--height <value> arthas-client terminal height
--width <value> arthas-client terminal width
-v,--verbose Verbose, print debug info.
--tunnel-server <value> The tunnel server url
--agent-id <value> The agent id register to tunnel server
--stat-url <value> The report stat url
<pid>
基本命令
- help : 查看命令帮助信息
- cat : 打印文件内容
- echo : 打印参数
- grep : 匹配查找
- tee : 复制标准输入到标准输出和指定的文件
- pwd : 返回当前的工作目录
- cls : 清空当前屏幕区域
- session : 查看当前绘话的信息
- reset : 重置增强类,将被arthas增强过的类全部还原,arthas服务端关闭时会重置所有增强过的类
- version : 输出当前目标java进程所加载的arthas版本号
- history : 打印命令历史
- quit : 退出当前arthas客户端,其他arthas客户端不受影响
- stop : 关闭arthas服务端,所有arthas客户端全部退出
- keymap : arthas快捷键列表及自定义快捷键
jvm相关命令
- dashboard : 当前系统的实时数据面板
- thread : 查看当前jvm的线程堆栈信息
- jvm : 查看当前jvm信息
- sysprop : 查看和修改jvm的系统属性
- sysenv : 查看jvm的环境变量
- vmoption : 查看和修改jvm里诊断相关的option
- perfcounter : 查看当前jv,的perf counter信息
- logger : 查看和修改logger
- getstatic : 查看类的静态属性
- ognl : 执行ognl表达式
- mbean : 查看Mbean的信息
- heapdump : dump java heap,类似jmap命令的heap dump功能
class/classloader相关
- sc : 查看JVM已加载的类信息
- sm : 查看已加载类的方法信息
- jad : 反编译指定已加载类的源码
- mc : 内存编译器,内存编译
.java
文件为.class
文件 - redefine : 加载外部的
.class
文件,redefine到JVM里 - dump : dump 已加载类的 byte code 到特定目录
- classloader : 查看classloader的继承树,urls,类加载信息,使用classloader去getResource
monitor/watch/trace相关
请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 stop
或将增强过的类执行 reset
命令。
- monitor : 方法执行监控
- watch : 方法执行数据观测
- trace : 方法内部调用路径,并输出方法路径上的每个节点耗时
- stack : 输出当前方法被调用的调用路径
- tt : 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
profile/火焰图
- profiler : 使用async-profiler对应用采样,生成火焰图
- options : 查看或者设置arthas全局开关
管道
Arthas支持使用管道对上述命令的结果进行进一步的处理,如sm java.lang.String * | grep 'index'
- grep : 搜索满足条件的结果
- plaintext : 将命令的结果去除ANSI颜色
- wc : 按行统计输出结果
后台异步任务
当线上出现偶发的问题,比如需要watch某个条件,而这个条件一天可能才会出现一次时,异步后台任务就派上用场了
- 使用 > 将结果重写向到日志文件,使用 & 指定命令是后台运行,session断开不影响任务执行(生命周期默认为1天)
- jobs——列出所有job
- kill——强制终止任务
- fg——将暂停的任务拉到前台执行
- bg——将暂停的任务放到后台执行
web console
通过 websocket连接arthas
Arthas目前支持Web Console,用户在attach成功之后,可以直接访问:http://127.0.0.1:3658/。
可以填入IP,远程连接其它机器上的arthas。
默认情况下,arthas只listen 127.0.0.1,所以如果想从远程连接,则可以使用 --target-ip
参数指定listen的IP,更多参考-h
的帮助说明。 注意会有安全风险,考虑下面的tunnel server的方案。
使用arthas tunnel server连接远程arthas
Arthas tunnel server是一个spring boot fat jar应用,直接java -jar
启动:
java -jar arthas-tunnel-server.jar
默认情况下,arthas tunnel server
的web端口是8080
,arthas agent
连接的端口是7777
。
以java agent 方式启动
用户数据回报
在3.1.4
版本后,增加了用户数据回报功能,方便统一做安全或者历史数据统计。
在启动时,指定stat-url
,就会回报执行的每一行命令,比如: ./as.sh --stat-url 'http://192.168.10.11:8080/api/stat'