Arthas诊断工具项目实践

一、配置启动Arthas

1、下载arthas-boot.jar

下载 | arthas

2、直接cmd直接启动

java -Dfile.encoding=UTF-8 -jar arthas-boot.jar

3、先启动java服务,arthas启动后扫描已启用的服务,多个服务提示选择项,

如果不确定服务进程,可根据端口号查进程号

netstat -nao | findstr "8080"

如图测试选择第一个服务

二、watch使用

便于观察指定方法的调用情况。具体地,可以观察到:方法入参、方法返回值、方法抛出异常。故watch命令定义了4个观察事件点。并提供了对应的方法选项

「-b」:在方法被调用前进行观察。当使用该选项时,由于观察事件点是在方法被调用之前,此时方法的返回值或异常均无法观察到。即只能观察到方法的入参 「-e」:在方法调用抛出异常时,进行观察。 「-s」:在方法调用正常返回时,进行观察。 「-f」:在方法调用结束后进行观察。显然该选项即会观察到方法抛出异常的情形,也会观察到方法正常返回的情形。除了该选项默认打开外,上述3个选项均默认关闭

1、通过-b选项观察调用InitMMGUpdateThread 的入参

watch -b com.ccse.semiphysical.service.IThreadPoolService InitMMGUpdateThread '{params,returnObj,throwExp}'  -n 5  -x 3
ts=2024-01-19 11:17:21; [cost=0.0293ms] result=@ArrayList[
    @Object[][
        @TaskInfo[
            taskId=@String[01],
            shipId=@String[0001],
            outTableName=@String[maneuverable_output_01_2024],
            inputTableName=@String[maneuverable_input_01_2024],
            updateVO=@UpdateVO[UpdateVO(id=a999eea609314638887b129384b5b80b, ship_id=0001, n_step=10, delta_cmd_deg=90, rps_cmd=10.5)],
        ],
    ],
    null,
    null,
]
method=com.sun.proxy.$Proxy132.InitMMGUpdateThread location=AtEntermethod=com.ccse.semiphysical.service.impl.IThreadPoolServiceImpl.InitMMGUpdateThread location=AtEnter

 2、通过-选项观察调用InitMMGUpdateThread 的入参

watch -s com.ccse.semiphysical.service.IThreadPoolService InitMMGUpdateThread '{params,returnObj,throwExp}'  -n 5  -x 3
method=com.sun.proxy.$Proxy132.InitMMGUpdateThread location=AtExit
ts=2024-01-19 11:17:51; [cost=0.2419ms] result=@ArrayList[
    @Object[][
        @TaskInfo[
            taskId=@String[01],
            shipId=@String[0002],
            outTableName=@String[maneuverable_output_01_2024],
            inputTableName=@String[maneuverable_input_01_2024],
            updateVO=@UpdateVO[UpdateVO(id=ae32a3760b7a471a93e78cc39a10fbea, ship_id=0002, n_step=10, delta_cmd_deg=90, rps_cmd=10.5)],
        ],
    ],
    null,
    null,
]

 三、tt命令使用

 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测

1、跟踪对应方法,此处只取10条记录

$ tt -t com.ccse.semiphysical.service.IEnvironmentApiService initial -n 10

2、此时有报错则会跟踪打印信息

3、查看详细报错信息

$ tt -i 1002

4、复现重做(重新执行)

tt -i 1002 -p

四、monitor使用

该命令可以对方法进行监控,监控指标包括调用次数、成功次数、失败次数、平均RT(平均响应时间)、失败率。其中这里失败的判定标准为方法执行抛出异常。这里提供如下的测试代码

1、监控指定方法

monitor com.ccse.semiphysical.service.impl.IThreadPoolServiceImpl InitMMGUpdateThread  -n 10  --cycle 10

Affect(class count: 1 , method count: 1) cost in 65 ms, listenerId: 4
 timestamp                   class                                      method                                    total         success        fail          avg-rt(ms)    fail-rate
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 2024-01-19 11:25:02         com.ccse.semiphysical.service.impl.IThrea  InitMMGUpdateThread                       28            28             0             202.82        0.00%
                             dPoolServiceImpl

 timestamp                   class                                      method                                    total         success        fail          avg-rt(ms)    fail-rate
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 2024-01-19 11:25:12         com.ccse.semiphysical.service.impl.IThrea  InitMMGUpdateThread                       40            40             0             13.19         0.00%
                             dPoolServiceImpl

 timestamp                   class                                      method                                    total         success        fail          avg-rt(ms)    fail-rate
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 2024-01-19 11:25:13         com.ccse.semiphysical.service.impl.IThrea  InitMMGUpdateThread                       4             4              0             12.20         0.00%
                             dPoolServiceImpl

 timestamp                   class
五、使用trace 获取各个方法的运行时间

1、监听当前方法内的所有一级方法

trace com.ccse.semiphysical.service.IThreadPoolProxyService DoUpdateMMG
`---ts=2024-01-19 10:45:56;thread_name=http-nio-9204-exec-9;id=165;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@142918a0
    `---[14.9336ms] com.ccse.semiphysical.service.impl.IThreadPoolProxyServiceImpl:DoUpdateMMG()
        +---[38.53% 5.7532ms ] com.ccse.cloud.common.redis.service.RedisService:getCacheObject() #29
        +---[0.16% min=0.0106ms,max=0.0129ms,total=0.0235ms,count=2] cn.hutool.core.collection.CollectionUtil:isEmpty() #40
        +---[0.28% min=0.0063ms,max=0.0179ms,total=0.0415ms,count=4] com.ccse.semiphysical.po.vo.TaskInfo:<init>() #45
        +---[0.23% min=0.006ms,max=0.0125ms,total=0.0346ms,count=4] com.ccse.semiphysical.po.vo.UpdateVO:<init>() #46
        +---[5.22% min=0.0316ms,max=0.6584ms,total=0.7796ms,count=4] com.ccse.cloud.common.core.utils.uuid.UUID:randomUUID() #47
        +---[0.62% min=0.0154ms,max=0.0334ms,total=0.0932ms,count=4] com.ccse.cloud.common.core.utils.uuid.UUID:toString() #47
        +---[0.34% min=0.0061ms,max=0.0254ms,total=0.0509ms,count=4] com.ccse.semiphysical.po.vo.UpdateVO:setId() #48
        +---[0.29% min=0.0056ms,max=0.0161ms,total=0.0426ms,count=4] com.ccse.semiphysical.po.vo.UpdateVO:setShip_id() #49
        +---[0.60% min=0.0052ms,max=0.0473ms,total=0.0894ms,count=4] com.ccse.semiphysical.po.vo.UpdateVO:setN_step() #51
        +---[0.40% min=0.0051ms,max=0.0208ms,total=0.0602ms,count=4] com.ccse.semiphysical.po.vo.UpdateVO:setDelta_cmd_deg() #53
        +---[0.36% min=0.0065ms,max=0.0205ms,total=0.0533ms,count=4] com.ccse.semiphysical.po.vo.UpdateVO:setRps_cmd() #55
        +---[0.34% min=0.0065ms,max=0.0225ms,total=0.051ms,count=4] com.ccse.semiphysical.po.vo.TaskInfo:setTaskId() #56
        +---[0.38% min=0.0058ms,max=0.0261ms,total=0.0572ms,count=4] com.ccse.semiphysical.po.vo.TaskInfo:setShipId() #57
        +---[0.30% min=0.0048ms,max=0.0199ms,total=0.0445ms,count=4] com.ccse.semiphysical.po.vo.TaskInfo:setOutTableName() #58
        +---[0.31% min=0.005ms,max=0.0214ms,total=0.0463ms,count=4] com.ccse.semiphysical.po.vo.TaskInfo:setInputTableName() #59
        +---[0.31% min=0.0054ms,max=0.0202ms,total=0.0469ms,count=4] com.ccse.semiphysical.po.vo.TaskInfo:setUpdateVO() #60
        `---[37.53% min=1.076ms,max=1.7336ms,total=5.6051ms,count=4] com.ccse.semiphysical.service.IThreadPoolService:InitMMGUpdateThread() #61

2、如果对方法内比较耗时的方法进一步跟踪,则使用如下命令

trace -E com.ccse.semiphysical.service.IThreadPoolProxyService|com.ccse.semiphysical.service.IThreadPoolService DoUpdateMMG|InitMMGUpdateThread
`---ts=2024-01-19 10:55:53;thread_name=http-nio-9204-exec-1;id=157;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@142918a0
    `---[4.35ms] com.ccse.semiphysical.service.impl.IThreadPoolProxyServiceImpl:DoUpdateMMG()
        +---[42.00% 1.8269ms ] com.ccse.cloud.common.redis.service.RedisService:getCacheObject() #29
        +---[0.10% min=0.002ms,max=0.0025ms,total=0.0045ms,count=2] cn.hutool.core.collection.CollectionUtil:isEmpty() #40
        +---[0.18% min=0.0017ms,max=0.0025ms,total=0.0078ms,count=4] com.ccse.semiphysical.po.vo.TaskInfo:<init>() #45
        +---[0.13% min=0.0013ms,max=0.0016ms,total=0.0058ms,count=4] com.ccse.semiphysical.po.vo.UpdateVO:<init>() #46
        +---[0.56% min=0.0035ms,max=0.0095ms,total=0.0243ms,count=4] com.ccse.cloud.common.core.utils.uuid.UUID:randomUUID() #47
        +---[0.38% min=0.0036ms,max=0.005ms,total=0.0164ms,count=4] com.ccse.cloud.common.core.utils.uuid.UUID:toString() #47
        +---[0.20% min=0.0016ms,max=0.0038ms,total=0.0088ms,count=4] com.ccse.semiphysical.po.vo.UpdateVO:setId() #48
        +---[0.18% min=0.0016ms,max=0.0029ms,total=0.008ms,count=4] com.ccse.semiphysical.po.vo.UpdateVO:setShip_id() #49
        +---[0.15% min=0.0014ms,max=0.002ms,total=0.0067ms,count=4] com.ccse.semiphysical.po.vo.UpdateVO:setN_step() #51
        +---[0.15% min=0.0015ms,max=0.0018ms,total=0.0066ms,count=4] com.ccse.semiphysical.po.vo.UpdateVO:setDelta_cmd_deg() #53
        +---[0.14% min=0.0013ms,max=0.0017ms,total=0.0059ms,count=4] com.ccse.semiphysical.po.vo.UpdateVO:setRps_cmd() #55
        +---[0.17% min=0.0016ms,max=0.0023ms,total=0.0074ms,count=4] com.ccse.semiphysical.po.vo.TaskInfo:setTaskId() #56
        +---[0.14% min=0.0015ms,max=0.0017ms,total=0.0063ms,count=4] com.ccse.semiphysical.po.vo.TaskInfo:setShipId() #57
        +---[0.15% min=0.0016ms,max=0.0017ms,total=0.0066ms,count=4] com.ccse.semiphysical.po.vo.TaskInfo:setOutTableName() #58
        +---[0.15% min=0.0015ms,max=0.0018ms,total=0.0066ms,count=4] com.ccse.semiphysical.po.vo.TaskInfo:setInputTableName() #59
        +---[0.16% min=0.0016ms,max=0.0018ms,total=0.0068ms,count=4] com.ccse.semiphysical.po.vo.TaskInfo:setUpdateVO() #60
        `---[48.33% min=0.1543ms,max=1.1008ms,total=2.1025ms,count=4] com.ccse.semiphysical.service.IThreadPoolService:InitMMGUpdateThread() #61
            `---[97.55% min=0.1429ms,max=1.0814ms,total=2.051ms,count=4] com.sun.proxy.$Proxy132:InitMMGUpdateThread()

`---ts=2024-01-19 10:55:53;thread_name=thread-40;id=2666;is_daemon=false;priority=10;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@142918a0
    `---[12.042ms] com.ccse.semiphysical.service.impl.IThreadPoolServiceImpl:InitMMGUpdateThread()
        `---[99.76% 12.0129ms ] com.ccse.semiphysical.service.IEnvironmentApiService:updateMMG() #23

`---ts=2024-01-19 10:55:53;thread_name=thread-39;id=2665;is_daemon=false;priority=10;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@142918a0
    `---[11.2162ms] com.ccse.semiphysical.service.impl.IThreadPoolServiceImpl:InitMMGUpdateThread()
        `---[99.80% 11.1942ms ] com.ccse.semiphysical.service.IEnvironmentApiService:updateMMG() #23

`---ts=2024-01-19 10:55:53;thread_name=thread-41;id=2670;is_daemon=false;priority=10;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@142918a0
    `---[11.5205ms] com.ccse.semiphysical.service.impl.IThreadPoolServiceImpl:InitMMGUpdateThread()
        `---[99.81% 11.4986ms ] com.ccse.semiphysical.service.IEnvironmentApiService:updateMMG() #23

`---ts=2024-01-19 10:55:53;thread_name=thread-42;id=2671;is_daemon=false;priority=10;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@142918a0
    `---[12.1831ms] com.ccse.semiphysical.service.impl.IThreadPoolServiceImpl:InitMMGUpdateThread()
        `---[99.82% 12.1616ms ] com.ccse.semiphysical.service.IEnvironmentApiService:updateMMG() #23
六、jad反编译

可以通过jad反编译指定已加载的类源码

jad com.ccse.semiphysical.service.IEnvironmentApiService
ClassLoader:
+-java.net.URLClassLoader@32eebfca

Location:
/D:/CCS/Topic2/easy_cloud_back/basic-modules/smart-navigation-semiphysical/target/classes/

/*
 * Decompiled with CFR.
 *
 * Could not load the following classes:
 *  com.ccse.semiphysical.po.vo.Initiali
 *  com.ccse.semiphysical.po.vo.TaskInfo
 *  com.ccse.semiphysical.po.vo.UpdateVO
 */
package com.ccse.semiphysical.service;

import com.ccse.semiphysical.po.vo.Initiali;
import com.ccse.semiphysical.po.vo.TaskInfo;
import com.ccse.semiphysical.po.vo.UpdateVO;
import java.util.List;
import java.util.Map;

public interface IEnvironmentApiService {
    public boolean initial(List<Initiali> var1) throws Exception;

    public List<Map> update(UpdateVO var1) throws InterruptedException;

    public void updateMMG(TaskInfo var1);

    public boolean setUpdateParams(Map var1);

    public boolean shutdown(String var1) throws Exception;
}
七、通过浏览器连接arthas

1、Arthas目前支持Web Console,用户在attach成功之后,可以直接访问端口可以在启动信息里面确认

2、可以填入IP,远程连接其它机器上的arthas,web console跟我本地访问的可以不相同,
如果在远程服务器上启动arthas,启动时要指定ip和端口,不然不开放远程访问,只能通过127.0.0.1访问 

java -jar arthas-boot.jar --target-ip {ip} --http-port {port} {pid}

3、调用示例

java -Dfile.encoding=UTF-8 -jar arthas-boot.jar --target-ip 172.26.192.195 --http-port 3658 12736

 

八、idea插件集成

使用Idea arthas 插件可以生成对应的指定,在指定的方法上右键选择插件和指定命令操作后自动复制到粘贴板,如图:

  • 20
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值