Arthas 学习使用2:各种命令

基础命令
help——查看命令帮助信息

cls——清空当前屏幕区域

session——查看当前会话的信息

reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类

version——输出当前目标 Java 进程所加载的 Arthas 版本号

quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响

shutdown——关闭 Arthas 服务端,所有 Arthas 客户端全部退出

keymap——Arthas快捷键列表及自定义快捷键

jvm相关

dashboard——当前系统的实时数据面板
thread——查看当前 JVM 的线程堆栈信息(非常有用的一个命令)
jvm——查看当前 JVM 的信息
sysprop——查看和修改JVM的系统属性
getstatic——查看类的静态属性
class/classloader相关

sc——查看JVM已加载的类信息(可以查看类是哪个jar包中加载的)
sm——查看已加载类的方法信息
dump——dump 已加载类的 byte code 到特定目录
redefine——加载外部的.class文件,redefine到JVM里
jad——反编译指定已加载类的源码
classloader——查看classloader的继承树,urls,类加载信息,使用classloader去getResource
monitor/watch/trace相关
请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件, 诊断结束要执行 shutdown 或将增强过的类执行 reset 命令。
monitor——方法执行监控

watch——方法执行数据观测

trace——方法内部调用路径,并输出方法路径上的每个节点上耗时

stack——输出当前方法被调用的调用路径

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

options
options——查看或设置Arthas全局开关

dashboard

在这里插入图片描述

Web Console

https://alibaba.github.io/arthas/web-console
在这里插入图片描述

通过浏览器连接arthas
Arthas目前支持Web Console,用户在attach成功之后,可以直接访问:http://127.0.0.1:8563/。

可以填入IP,远程连接其它机器上的arthas。

monitor

监控com.demo.gateway.controllers.Controller类下面的get_messages方法

[arthas@31471]$ monitor -c 20 com.demo.gateway.controllers.Controller get_messages
Press Q or Ctrl+C to abort.
Affect(class-cnt:3 , method-cnt:3) cost in 232 ms.
 timestamp            class                                                                              method               total
------------------------------------------------------------------------------------------------------------------------------------
 2019-09-22 16:35:40  com.demo.gateway.controllers.Controller$$EnhancerBySpringCGLIB$$ad2087f  get_messages  11
 2019-09-22 16:35:40  com.demo.gateway.controllers.Controller                                  get_messages  11
 2019-09-22 16:35:40  com.demo.gateway.controllers.Controller$$EnhancerByCGLIB$$491516ab       get_messages  11

 timestamp            class                                                                              method               total
------------------------------------------------------------------------------------------------------------------------------------
 2019-09-22 16:36:20  com.demo.gateway.controllers.Controller$$EnhancerBySpringCGLIB$$ad2087f  get_messages  26
 2019-09-22 16:36:20  com.demo.gateway.controllers.Controller                                  get_messages  26
 2019-09-22 16:36:20  com.demo.gateway.controllers.Controller$$EnhancerByCGLIB$$491516ab       get_messages  26

监控 kite.springcloud.jxm.service package 下所有了类的所有方法 *是通配符 也可以是正则表达式
monitor -c 60 kite.springcloud.jxm.service.* *

-c 为执行周期,默认120 秒,例如 -c 5 表示 5 秒钟输出一次,-c 60 表示 60 秒输出一次。

watch

(1) 方法返回后 打印返回值
watch kite.springcloud.jxm.service.MonitorDashboardService buildJvmInfo "{returnObj}" -s -n 1

[arthas@31471]$ watch com.demo.gateway.controllers.Controller get_messages "{returnObj}" -s -n 1
Press Q or Ctrl+C to abort.
Affect(class-cnt:3 , method-cnt:3) cost in 215 ms.
ts=2019-09-22 16:39:06; [cost=28.886509ms] result=@ArrayList[
    @GetMessagesResponse[GetMessagesResponse(success:true, message_list:[Message(message_id:1000, creation_time:2019-07-30 17:50:30.039, creation_type:SYSTEM, content_type:OPERATION, content:sdagasg), Message(message_id:1003, creation_time:2019-07-30 17:50:17.594, creation_type:SYSTEM, content_type:TEXT, content:开始), Message(message_id:1001, creation_time:2019-07-30 17:50:17.575, creation_type:SUMMARY, content_type:TEXT, content: fdgafg
)])],
]
Command execution times exceed limit: 1, so command will exit. You can set it with -n option.

(2) 方法返回后 打印所在的 ClassLoader、所在的类、调用实例
watch kite.springcloud.jxm.service.MonitorDashboardService buildJvmInfo "{loader,clazz,target}" -s -n 1

[arthas@31471]$ watch com.demo.gateway.controllers.Controller get_messages "{loader,clazz,target}" -s -n 1
Press Q or Ctrl+C to abort.
Affect(class-cnt:3 , method-cnt:3) cost in 217 ms.
ts=2019-09-22 16:40:53; [cost=29.183994ms] result=@ArrayList[
    @LaunchedURLClassLoader[org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3],
    @Class[class com.demo.gateway.controllers.Controller],
    @Controller[com.demo.gateway.controllers.Controller@d535a3d],
]
Command execution times exceed limit: 1, so command will exit. You can set it with -n option.

(3) 方法执行前 打印参数
watch kite.springcloud.jxm.service.MonitorDashboardService buildJvmInfo "{params}" -b -n 1

watch com.demo.gateway.controllers.Controller get_messages "{params}" -b -n 1 -x 3
Press Q or Ctrl+C to abort.
Affect(class-cnt:3 , method-cnt:3) cost in 234 ms.
ts=2019-09-19 17:05:02; [cost=0.019899ms] result=@ArrayList[
    @Object[][
        @Context[
            STRUCT_DESC=@TStruct[org.apache.thrift.protocol.TStruct@13abeadb],
            TRACE_ID_FIELD_DESC=@TField[<TField name:'traceID' type:11 field-id:1>],
            CLIENT_HOST_FIELD_DESC=@TField[<TField name:'clientHost' type:11 field-id:2>],
            BAGGAGE_FIELD_DESC=@TField[<TField name:'baggage' type:13 field-id:3>],
            SPAN_ID_FIELD_DESC=@TField[<TField name:'spanID' type:11 field-id:4>],
            SAMPLED_FIELD_DESC=@TField[<TField name:'sampled' type:2 field-id:5>],
            PARENT_SPAN_ID_FIELD_DESC=@TField[<TField name:'parentSpanID' type:11 field-id:6>],
            USER_ID_FIELD_DESC=@TField[<TField name:'userID' type:11 field-id:7>],
            STANDARD_SCHEME_FACTORY=@ContextStandardSchemeFactory[com.demo.infra.rpc.base.Context$ContextStandardSchemeFactory@1d6c06de],
            TUPLE_SCHEME_FACTORY=@ContextTupleSchemeFactory[com.demo.infra.rpc.base.Context$ContextTupleSchemeFactory@195381ab],
            traceID=@String[38bff2037455deac],
            clientHost=@String[virtual_machine_computer],
            baggage=@HashMap[isEmpty=false;size=10],
            spanID=@String[e5f7e2427bed42c7],
            sampled=@Boolean[false],
            parentSpanID=@String[c7375bfc6cd08083],
            userID=null,
            __SAMPLED_ISSET_ID=@Integer[0],
            __isset_bitfield=@Byte[1],
            metaDataMap=@UnmodifiableMap[isEmpty=false;size=7],
        ],
        @GetMessagesRequest[
            STRUCT_DESC=@TStruct[org.apache.thrift.protocol.TStruct@5c510ce5],
            USER_ID_FIELD_DESC=@TField[<TField name:'user_id' type:11 field-id:1>],
            REF_MSG_ID_FIELD_DESC=@TField[<TField name:'ref_msg_id' type:11 field-id:3>],
            LIMIT_FIELD_DESC=@TField[<TField name:'limit' type:8 field-id:4>],
            SORT_FIELD_DESC=@TField[<TField name:'sort' type:8 field-id:5>],
            STANDARD_SCHEME_FACTORY=@GetTicketMessagesRequestStandardSchemeFactory[com.demo.fls.rpc.tms.request.GetMessagesRequest$GetTicketMessagesRequestStandardSchemeFactory@1060c886],
            TUPLE_SCHEME_FACTORY=@GeMessagesRequestTupleSchemeFactory[com.demo.fls.rpc.tms.request.GetMessagesRequest$GeMessagesRequestTupleSchemeFactory@6d4776a2],
            user_id=@String[123],
            ref_msg_id=null,
            limit=@Integer[10],
            sort=@SortOrder[DESC],
            __LIMIT_ISSET_ID=@Integer[0],
            __isset_bitfield=@Byte[1],
            optionals=@_Fields[][isEmpty=false;size=3],
            metaDataMap=@UnmodifiableMap[isEmpty=false;size=5],
        ],
    ],
]
Command execution times exceed limit: 1, so command will exit. You can set it with -n option.

(4) 打印耗时超过 200ms 方法的参数和返回值
watch kite.springcloud.jxm.service.MonitorDashboardService * "{params, returnObj}" "#cost>200"

trace

方法内部调用路径,并输出方法路径上的每个节点上耗时

stack

输出当前方法被调用的调用路径

参考文档:

  1. https://www.ppkanshu.com/index.php/post/4578.html

猜你喜欢

转载自blog.csdn.net/yangyangrenren/article/details/101172406