阿里开源Arthas进阶之方法执行监控
点击蓝字
关注我们
前言
日常开发以及线上服务中,我们不免会遇到一些性能问题,本文主要介绍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
特别说明:
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://gitee.com/firegitspace/arthas-demo.git>
THE END
推荐阅读
阿里巴巴开源性能监控神器Arthas
SpringBoot 中如何正确的在异步线程中使用request
点赞+在看 ,关注公众号回复“666”领取福利