Arthas

一、安装

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

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值