当前位置:网站首页>Arthas实践操作文档记录

Arthas实践操作文档记录

2022-06-11 15:04:00 小Y在线编码

Arthas实践操作文档记录

第1章Arthas简单介绍

1.1 Arthas是什么

arthas是阿里巴巴开源的Java诊断工具,基本使用场景是定位复现一些生产环境比较难以定位问题。可以在线排查问题,以及动态追踪Java代码,实时监控JVM状态等等,官网地址:https://arthas.aliyun.com/doc/。

1.2 Arthas能干什么

某个类从那个jar包加载的?为什么会报各种类的异常? (可以通过命令拿到指定类的加载路径和异常信息)

改的代码没有执行到?是没有commit还是分支搞错还是怎么样?(可以通过反编译拿到类的代码信息)

遇到问题无法在线上debug,难道只能通过加日志再重新发布吗?(可以通过jdk 1.5的instrument来进行代码的动态替换)

线上遇到某个用户的数据处理有问题,但线上同样无法debug,线下无法重现!(arthas中可以看到很详细的jvm状态以及一些比较方便的工具,比如反编译,在线调试等)

是否有一个全局视角来查看系统的运行状况?(dashboard命令查看jvm的详细信息)

怎么快速定位应用的热点,生成火焰图?

怎样直接从JVM内查找某个类的实例?

1.3 Arthas支持的版本

支持JDK 6+ 支持Linux/Mac/Windows

第2章Arthas的使用

2.1Arthas的安装(windows)

下载安装的方式有很多种,这里介绍一种手动安装的方式。

手动下载安装包:https://arthas.aliyun.com/download/latest_version?mirror=aliyun;

Linux的安装使用可参考官网:https://arthas.aliyun.com/doc/install-detail.html#

2.2Arthas的使用

下载安装包解压后cmd进入控制台,再进入到解压后的文件目录下;

在这里插入图片描述

输入命令:.\as.bat pid(查看程序的 pid可以使用java 自带的java VisualVM可视化工具)

在这里插入图片描述

在这里插入图片描述

选择需要监控分析的java进程,成功启动Arthas之后,会看到Arthas的界面,也可通过浏览器直接访问相应端口;

在这里插入图片描述

进入Arthas的界面后即可在此界面输入相应命令对程序进行分析;

2.3Arthas基本命令介绍与实际使用

注意:如果不记得命令,可以使用idea插件arthas idea生成arthas相关命令;

在这里插入图片描述

dashboard命令

输入该命令可以看到当前系统的实时数据面板;

在这里插入图片描述

jvm命令

输入该命令可以看到当前jvm的详细信息;

在这里插入图片描述

thread 命令

输入该命令可以查看到线程的堆栈详细信息;

在这里插入图片描述

trace命令

trace 命令能主动搜索方法调用路径,并输出方法路径上的每个节点上耗时,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。

使用示例:

现在要监听SysUserController类下的user()方法的调用链:

在这里插入图片描述

输入命令:

trace com.pig4cloud.pigx.admin.controller.SysUserController user  -n 5 --skipJDKMethod false

注意:trace后面的是类和方法的全路径;

调用该方法,随后可以看到在arthas界面输出了该方法的调用链以及链路上每个方法的耗时,可以利用这个方式找出比较耗时的方法进行有针对性的优化;

在这里插入图片描述

watch命令

watch命令可以让用户能方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。

使用示例:观察SysUserController类下的user()方法;

在这里插入图片描述

第3章profiler 生成火焰图(仅支持Linux/Mac)

profiler命令支持生成应用热点的火焰图。本质上是通过不断的采样,然后把收集到的采样结果生成火焰图,可以用于线上性能问题快速排查。

火焰图是基于perf结果产生的 SVG 图片,用来展示 CPU 的调用栈。

在这里插入图片描述

y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。

x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。

火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。

颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。

间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。

火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。

颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。

具体使用可参照官网:https://arthas.gitee.io/profiler.html

第4章 实际问题模拟

4.1 性能问题模拟

1.首先写一个耗时比较久的循环:

private void test() {
    
    int a = 1;
    while (a < 9999999) {
    
        a++;
        System.out.println(out(a));
    }
}

2.在添加用户的方法中调用test()方法
在这里插入图片描述
3.启动服务,用arthas监控user方法

trace com.pig4cloud.pigx.admin.controller.SysUserController user  -n 5 --skipJDKMethod false

4.调用添加用户的接口,经过较长时间后接口成功响应,可以看到arthas控制台输出了该方法的调用栈
在这里插入图片描述
可以看到test()方法耗时最久。

4.2 cpu飙高问题模拟

1.把上面的程序改造成一个死循环
在这里插入图片描述
2.同样在添加用户的接口中调用test()方法
在这里插入图片描述
3.重新启动服务之后再启动arthas。

4.在调用添加用户接口之前输入thread命令,此时可以看到各个线程都是正常的,如下图:
在这里插入图片描述
5.现在调用添加用户的接口,再次输入thread命令,可以看到其中有一个id为308的线程导致cpu飙升到百分之九十多。
在这里插入图片描述
6.打印出线程ID为308的详细信息,可以看到导致问题的具体代码位置和行数。
在这里插入图片描述

原网站

版权声明
本文为[小Y在线编码]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_42483764/article/details/125018444