一、安装
1、快速安装------>使用arthas-boot
下载arthas-boot.jar,然后用java -jar的方式启动:
a、curl -O https://arthas.aliyun.com/arthas-boot.jar
b、java -jar arthas-boot.jar
打印帮助信息:java -jar arthas-boot.jar -h
2、全量安装------>https://arthas.aliyun.com/download/latest_version?mirror=aliyun
a、下载:arthas-packaging-3.4.1-bin.zip
b、解压:unzip arthas-packaging-3.4.1-bin.zip
c、启动:java -jar arthas-boot.jar
注:指定ip和port:java -jar arthas-boot.jar --target-ip 192.168.171.17 --telnet-port 3658
注:启动arthas时输入的ip和端口都是本机暴露给外界的ip和端口。
d、attach目标进程,选择进程号
注:启动后,greys会打开客户端([arthas@3288]$ ),且后台会有个java进程(这个进程的端口号为3658)
注:与greys-anatomy不同的是:Arthas是ctrl+c是退出当前session的事务
二、快速入门
1、dashboard命令:展示当前进程(目标进程)的信息
48 Timer-for-arthas-dashboard-1e29bc3e-db system 5 RUNNABLE 100 0:0 false true
34 Attach Listener system 9 RUNNABLE 0 0:0 false true
15 ContainerBackgroundProcessor[StandardE main 5 TIMED_WAITIN 0 0:0 false true
33 DestroyJavaVM main 5 RUNNABLE 0 0:6 false false
3 Finalizer system 8 WAITING 0 0:0 false true
17 NioBlockingSelector.BlockPoller-1 main 5 RUNNABLE 0 0:0 false true
2 Reference Handler system 10 WAITING 0 0:0 false true
4 Signal Dispatcher system 9 RUNNABLE 0 0:0 false true
37 arthas-NettyHttpTelnetBootstrap-3-1 system 5 RUNNABLE 0 0:0 false true
44 arthas-NettyHttpTelnetBootstrap-3-2 system 5 RUNNABLE 0 0:0 false true
45 arthas-NettyHttpTelnetBootstrap-3-3 system 5 RUNNABLE 0 0:0 false true
38 arthas-NettyWebsocketTtyBootstrap-4-1 system 5 RUNNABLE 0 0:0 false true
39 arthas-NettyWebsocketTtyBootstrap-4-2 system 5 RUNNABLE 0 0:0 false true
42 arthas-UserStat system 9 WAITING 0 0:0 false true
46 arthas-command-execute system 5 TIMED_WAITIN 0 0:0 false true
40 arthas-shell-server system 9 TIMED_WAITIN 0 0:0 false true
41 arthas-shell-server system 9 TIMED_WAITIN 0 0:0 false true
36 arthas-timer system 9 WAITING 0 0:0 false true
16 container-0 main 5 TIMED_WAITIN 0 0:0 false false
Memory used total max usage GC
heap 288M 487M 3541M 8.14% gc.ps_scavenge.count 7
ps_eden_space 260M 311M 1290M 20.17% gc.ps_scavenge.time(ms) 211
ps_survivor_space 0K 17920K 17920K 0.00% gc.ps_marksweep.count 2
ps_old_gen 28M 158M 2656M 1.06% gc.ps_marksweep.time(ms) 220
nonheap 57M 59M -1 96.43%
code_cache 12M 12M 240M 5.30%
metaspace 44M 46M -1 95.65%
direct 8K 8K - 100.01%
mapped 0K 0K - NaN%
Runtime
os.name Linux
os.version 2.6.32-431.el6.x86_64
java.version 1.8.0_60
java.home /export/servers/jdk1.8.0_60/jre
systemload.average 0.15
processors 8
uptime 9293s
2、thread命令:打印线程的栈信息
例:thread id
3、jad命令:反编译
例:jad com.share.dao.StartDao
4、watch命令:观察到指定方法的调用情况
Advice 【观察表达式:ognl表达式】
|
+--ClassLoader loader (ClassLoader)
+--Class<?> clazz (目标类)
+--GaMethod method (目标方法,包括普通方法和构造函数)
+--Object[] params (调用参数)
+--Object returnObj (返回值)
+--Throwable throwExp (抛出异常)
例:watch com.share.dao.StartDao testDao params[0]
5、退出arthas
(1)、如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会继续被占用(netstat -anp|grep LIST),下次连接时可以直接连接上。
注:arthas进程没了,但3658(telnet-port)、8563(http-port)还被目标进程占用着
(2)、如果想完全退出arthas,可以执行stop命令。
注:arthas进程没了,但3658(telnet-port)、8563(http-port)也没了
注:使用方法一退出后,无法切换进程attach新进程,需要连接原进程,通过shutdown或stop关闭后,重新attach新进程。【若之前启动指定--target-ip,则再次连接时也需要指定--target-ip】
三、进阶使用
1、monitor/watch/trace相关
这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 stop 或将增强过的类执行 reset 命令(否则下次无法诊断当前这个方法)。
2、说明
monitor——方法执行监控
watch——方法执行数据观测
trace——方法内部调用路径,并输出方法路径上的每个节点上耗时
stack——输出当前方法被调用的调用路径
tt——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
例:trace com.share.dao.StartDao testDao 【--skipJDKMethod false、'#cost > 10'、-n 1】
注:trace只对当前方法的字节码【invokevirtual】进行增强,所及不下钻
打印信息如下:
`---ts=2020-09-16 14:40:14;thread_name=http-nio-8080-exec-1;id=12;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@6d41e24d
`---[8000.872841ms] com.share.dao.StartDao:testDao()
+---[0.034319ms] com.share.User:toString() #18
`---[5000.367167ms] com.share.dao.StartDao:testDao11() #19
3、profiler/火焰图
profiler–使用async-profiler对应用采样,生成火焰图
(1)本质上是通过不断的采样(采样间隔默认为10ms),然后把收集到的采样结果生成火焰图。
a、启动profiler: profiler start 。默认采集cpu事件,采集指定事件profiler start --event alloc
b、获取已采集的sample的数量:profiler getSamples
c、查看profiler状态:profiler status
d、停止profiler:profiler stop 同时会生成采样文件
注:默认生成.svg格式的文件,也可生成html:profiler stop --format html。也可指定目录名--file /tmp/result.html
注:生成的结果保存到目标应用的工作目录下的arthas-output目录。
通过浏览器查看:http://192.168.171.17:3658/arthas-output/ 直接点开.svg文件
e、arthas支持不同的events: profiler list
f、查看支持的action:profiler actions
h、查看profiler版本:profiler version
4、管道命令
grep——搜索满足条件的结果
plaintext——将命令的结果去除ANSI颜色
wc——按行统计输出结果
5、Arthas后台异步任务
(1)使用&在后台执行任务
例:trace com.share.dao.StartDao testDao &
(2)通过jobs查看任务
(3)fg、bg命令,将命令转到前台、后台继续执行
(4)停止命令 kill 任务进程号
6、web console
(1)、通过浏览器连接arthas
a、启动:java -jar arthas-boot.jar --target-ip 192.168.171.17 --telnet-port 3658
挂载到目标进程,选择进程号
b、浏览器打开:http://192.168.171.17:3658/
(2)、使用arthas tunnel server连接远程arthas
a、下载并部署arthas-tunnel-server:java -jar arthas-tunnel-server.jar
注:默认情况下,arthas tunnel server的web端口是8080,arthas agent连接的端口是7777。
b、启动之后可以访问:http://192.168.171.17:8080。再通过agentId
连接到已注册的arthas agent上。
c、通过Spring Boot的Endpoint,可以查看到具体的连接信息: http://localhost:8080/actuator/arthas ,登陆用户名是arthas,密码在arthas tunnel server的日志里可以找到,比如:
arthas tunnel server的日志中:Using generated security password: 5b37b7b6-7ee4-45e6-83e4-2aa3b371d088
d、启动arthas时连接到tunnel server,如:
java -jar arthas-boot.jar --target-ip 192.168.171.17 --telnet-port 3658 --tunnel-server 'ws://192.168.171.17:7777/ws' --agent-id arthasAgent
e、attach后可以看到id,或session中的agent_id
7、以java-agent方式启动宿主jvm
例:java -javaagent:/tmp/test/arthas-agent.jar -jar arthas-demo.jar
8、arthas-boot.jar使用技巧----->attach目标jvm
(1)、指定jar包的名字或类型
java -jar arthas-boot.jar --target-ip 192.168.171.17 --telnet-port 3658 --tunnel-server 'ws://192.168.171.17:7777/ws' --select sunxj-deploy-1.0-SNAPSHOT
注:jar包的名字或类名通过jps -l 获取
(2)、指定pid
java -jar arthas-boot.jar --target-ip 192.168.171.17 --telnet-port 3658 --tunnel-server 'ws://192.168.171.17:7777/ws' 2255
注:pid 通过ps -ef|grep java 获取
9、用户数据回报
在启动时,指定stat-url,就会回报执行的每一行命令
例:java -jar arthas-boot.jar --target-ip 192.168.171.17 --telnet-port 3658 --tunnel-server 'ws://192.168.171.17:7777/ws' --stat-url 'http://192.168.171.17:8080/api/stat'
注:可以通过重写:arthas-tunnel-server.jar中的StatController.java 记录每一行命令
10、执行结果保存日志
进入client后执行:options save-result true
11、批处理脚本
例:java -jar arthas-boot.jar --target-ip 192.168.171.17 --telnet-port 3658 --tunnel-server 'ws://192.168.171.17:7777/ws' -f /var/tmp/test.as <pid> > test.out
test.as为脚本名
pid为进程名
test.out执行结果输出的位置
12、http api
http://192.168.171.17:8563/ui
设计
1、在目标机器上安装arthas
2、找到target进程:ps -ef|grep java ,如2255
3、启动arthas-agent:java -jar arthas-boot.jar --target-ip 192.168.171.17 --telnet-port 3658 --tunnel-server 'ws://192.168.171.17:7777/ws' --agent-id arthasAgent 2255
【简化:java -jar arthas-boot.jar --tunnel-server 'ws://192.168.171.17:7777/ws' --agent-id arthasAgent 2255】
4、在arthas-tunnel-web输入:ip:目标机器 port:7777 AgentId:arthasAgent
5、停止:stop