查看原文
其他

阿里开源Arthas进阶之方法执行监控

MrFire 架构师成长之路 2023-09-18

点击蓝字

关注我们


前言

日常开发以及线上服务中,我们不免会遇到一些性能问题,本文主要介绍Arthas监控方法执行效率,执行参数结果等几个实用命令,对于排查性能问题还是很有用的。

1.帮助及监控面板

1) help

查看帮助 


2) dashboard


功能

监控面板,可查看cpu,线程,jvm内存,GC,系统等信息


用法

dashboard -i 5000 -n 5
  • i :刷新频率,默认5000ms

  • n :刷新次数


案例 


2.方法执行监控

主要介绍trace,watch,montor,stack这几个命令的使用。

注意:

这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时, 请尽量明确需要观测的类、方法以及条件,诊断结束要执行 stop 或将增强过的类执行 reset 命令。

1)trace

功能

跟踪方法执行耗时,方法内部调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路,并输出方法路径上的每个节点上耗时。


用法

trace com.fire.arthas.demo.web.ArthasTestController method -n 5 --skipJDKMethod false
  • n :执行追踪次数

  • skipJDKMethod:包含jdk里面的函数

很多时候我们只想看到某个方法的rt大于某个时间之后的trace结果,现在Arthas可以按照方法执行的耗时来进行过滤了,例如:

trace *StringUtils isBlank '#cost>100' 只展示执行耗时大于100ms的
  • #cost:方法执行耗时

表示当执行时间超过100ms的时候,才会输出trace的结果。


案例

执行如下命令

trace com.fire.arthas.demo.web.ArthasTestController traceMethod -n 5 --skipJDKMethod false



从图中可以看到方法调用栈执行耗时,从而分析具体哪块有性能问题。

2)watch

功能

让你能方便的观察到指定函数的调用情况。能观察到的范围为:返回值、抛出异常、入参,支持OGNL表达式

OGNL表达式官网:https://commons.apache.org/proper/commons-ognl/language-guide.html(opens new window)


特别说明:

  • watch 命令定义了4个观察事件点,即 -b 方法调用前,-e 方法异常后,-s 方法返回后,-f 方法结束后, -b、-e、-s 默认关闭,-f 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出

  • 当使用 -b 时,由于观察事件点是在方法调用前,此时返回值或异常均不存在

  • 在watch命令的结果里,会打印出location信息。location有三种可能值:AtEnter,AtExit,AtExceptionExit。对应方法入口,方法正常return,方法抛出异常。


用法

watch com.fire.arthas.demo.web.ArthasTestController watchMethod '{params,returnObj,throwExp}'  -n 2  -x 3 -s

参数说明:

  • express :观察表达式,默认值:{params, target, returnObj} ,分别代表参数,目标,返回值

  • n :监控次数

  • x :指定输出结果的属性遍历深度,默认为 1,最大值是4

  • b :观察方法调用前

  • e :观察方法异常后

  • s :观察方法返回后

  • f :观察方法结束后


案例

watch com.fire.arthas.demo.web.ArthasTestController watchMethod '{params,returnObj,throwExp}' -n 2 -x 3


  • 异常的情况



  • 正常输出



  • 调整输出遍历深度,观察参数的属性值,当前对象中的属性


执行如下命令

watch com.fire.arthas.demo.web.ArthasTestController watchMethod -x 4


可以看到当前对象中TestService内部的cahce这map的值,如果x设置为4的话则只能看到上一层。


3)monitor

功能 

对方法执行监控,可监控方法执行的成功失败次数,平均RT,失败率等。非实时返回命令。

监控维度:

  • timestamp :时间戳

  • class :Java类

  • method :方法(构造方法、普通方法)

  • total :调用次数

  • success :成功次数

  • fail :失败次数

  • rt :平均RT

  • fail-rate :失败率


用法

monitor com.fire.arthas.demo.service.TestService montorMethod -n 10 --cycle 10

参数说明:

  • n :监控次数

  • cycle 监控周期,单位为秒,10代表10秒,也可简写为-c


案例

本案例demo中montorMethod方法代码:

@GetMapping("/monitor")public void monitorMethod(){ int index=0; while(index<15){ try { testService.montorMethod(index); index++; }catch (Exception e){ index++; logger.error("调用失败!");        }     }}
public void montorMethod(int i){ if(i%5==0){ throw new RuntimeException(); } System.out.println(i);}

执行如下命令

monitor com.fire.arthas.demo.service.TestService montorMethod -n 10 --cycle 10


从图中可开出方法montorMethod执行15次,成功12次,失败3次,失败比例20%,平均RT为0.04ms。

4)stack

功能 

输出当前方法被调用的调用路径,找到调用根源。


用法

stack com.fire.arthas.demo.service.TestService traceMethod4  -n 5 

参数说明:

  • n :执行次数


案例

执行如下命令

stack com.fire.arthas.demo.service.TestService traceMethod4 -n 5

出TestService.traceMethod4方法的调用栈




参考:<https://arthas.aliyun.com/doc/>
案例源码:<https://gitee.com/firegitspace/arthas-demo.git>

 THE END

推荐阅读  

SpringBoot整合阿里开源性能监控神器Arthas

阿里巴巴开源性能监控神器Arthas

Spring注入Bean的方式你知道几种?

SpringBoot 中如何正确的在异步线程中使用request

阿里出品!SpringBoot应用自动化部署神器

RabbitMQ如何实现高可用?

点赞+在看 ,关注公众号回复“666”领取福利


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存