Arthas 实践案例 | 学习笔记

简介: 快速学习 Arthas 实践案例

开发者学堂课程【线上问题排查利器 Alibaba Arthas(下)Arthas 实践案例】学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/747/detail/13210


Arthas 实践案例

 

内容介绍:

一. 需求

二. 准备场景

三. 步骤

四. 实现步骤

五. 结论


一.需求

需求有两个:第一,运行在服务器上面的 web 程序当中是由哪一个控制器来处理所有请求的?或者说现在在执行的复制器是哪一个?它的方法名是什么?

可以快速定位一个请求是被哪些 Filter 拦截的,或者请求最终是由哪些 Servlet 处理的。但有时想知道一 个请求是被哪个 Spring MVC Controller 处理的。如果代码,会比较难找,并且不一定准确。通过Arthas可以精确定位是哪个 Controller 处理请求。

第二个内容就是找到想得到每一个请求的调用参数和它的返回值。现在这个里面有两个需求,但是现在并不知道这个方法的名字是什么?还有它的返回值是什么?所以要一层一层去找。


二.准备场景

在做这个案例时,先要准备一个应用场景一个项目这个项目可以提前打包好,将它打包成一个war包,比如:ssm_student_war 再放在资料里面。

也可以从资料里面直接把它部署到tomcat服务器里面去。

例如将ssm_student_war项目部署到Linus的tomcat服务器下,并且是可以正常访问的。

启动之后,访问服务器的ip地址,访问:http://192.168.254.199.8080/ssm_student,再这个IP地址直接部署上去

以下例子是安装在User下面的local,这里面有一个web apps

在这里面有一个war包,它实际上就是一个简单的ssm框架做出来的一个简单的登录和查询当然它也是访问数据库的。

现在可以开始运行浏览器了看一下如下图效果首先输入前面的地址,按回车这时会进入登录的页面,这是很简单的一个页面。

数据库里面有一些数据在里面linux里面进行登录,可以看见里面有一个表

如下图:

image.png

里面有两张表一个是用户表,这个用户表里面有两条记录

可以看到用户名密码但这只是一个简单的密码并没有加密

另一个表展示了所有的学生的信息。

需求是这样的用户以表上名字登录进来以后就可以查到所有的学生信息,做这么一个基本的操作但是ssm框架做出来的

假设输入一个用户名输入一个密码进行登录

image.png

登录进来以后就可以查到以下这个是一简单的操作。


三. 步骤

如果想用arthas进行追踪,并且要想知道它是调用的控制器里面哪两个方法?这两个方法的输入参数和输出参数是多少?那应该怎么去做?

首先也是要启动入Java-jar arthas-boot.jar 按回车,选择要监视java进程,选1。如下图所示:

image.png

要注意,万一出现这个端口已经被别人使用了让你选择用另外一种方式的提示,那也有做法的。

在Linus里面有一个netstat可以输入这个命令,进行查看

image.png 

比如arthas是默认3658这个端口,2161/Java这是它的进程id。如果这个端口被占用了,可以直接把这个进程给清除掉。

如下图所示:

image.png

现在不用清除,因为两者没有冲突

 

四. 实现步骤

进来以后在浏览器上先做第一步操作现在可能知道是用的哪个方法

ssm当中所有的请求都是经过一个servlet,这个servlet的名字Dispatcherservlet所有的这个请求都是由spring框架的servlet来进行控制的,它是一个核心控制器,首先就追踪这个操作

如果不记得这个包也是没关系的,它这里会有提示。可以按一下tab键,就可以找到。如下图所示:

image.png

在servlet里面有命令DispatcherServlet。如果不知道在过滤器里面执行了哪个方法,就写一个星号,这就相当于追踪所有的方法。

如果不记得方法怎么办?不记得方法可以写个星号那么追踪的内核方法就多了,但是效率上面会低很多。所以还是要有一些开发的常识。如下图:

image.png

现在开始追踪,按回车,回车以后发现它现在是没有反应的。

如下图:

image.png

需要访问一次,才会追踪,就相当于重新刷新。刷新它实际上是

做了两件事情,因为它会有一个警告说重新提交表单并且再查询这个数据所以实际上做了两个操作。

点继续让重新提交一次。重新提交一次以后可以看到它最终的数据但是数据是非常多如下图所示:

image.png

如下图所示的白色区域:

先从这里开始

image.png

这里可以选择视图,选择全屏模式或者紧凑模式,这样看起来内容更多一点字体也调小一点。如下图:

image.png

这里就出现一个问题,现在这么多内容应该怎么去看。可以从这个地方开始,如下图:

image.png

这里有一个经验,就是看哪个耗时最多。

比如说如下图,一个是33 ,一个是34。

image.png

到这里基本上能追踪出来,它是运用哪个方法

在如上图33下面{33.738972ms}耗时是最长的33毫秒,也就是说它实际上做的是doDipatch这个方法。执行这个方法是比较耗时的。

如果再往下看还有没有最长耗时的其实都有一些耗时的,但是最终这个doDipatch方法就可以。

现在就开始追踪doDipatch,其实不需要追踪,直接到了如下图这一层,能够看到这个方法就说明这个方法在处理了。

这样就可以对这个方法进行反编译这是要做的第二步操作。将doDipatch进行反编译的操作。

image.png

注意看一下如上个代码,因为比较耗时,所以这里就要用到反编译的命令,先从这个页面退出来,输入Jad这是反编译的。

如果只想显示源码,就敲source only。找org.springframework.Web servlet.下面的Dispatcherservlet 反编译Dodispatch 这个方法

再按回车,就完成了。反编译的这个方法只是反映编译的这一个方法Dodispatch而且只显示源码。这样就可以看到spring里面的一些源码它最终返回的是modeAnd view

这个是它模型和视图的一个封装对象,就是它要返回的一个对象mv,那就看哪个方法是返回mv的。

找到哪个地方是给mv进行赋值的之类的东西往下找有个ha,它是适配器

假设一行一行代码去看不太现实,于是这里可以调用getHandler

以上这句话返回了一个ha对象获得了一个ha。

下面大概就是获得请求的方法

image.png

如果是get的方法就显示如上图所示的【equals method】。

这里大概是记录日志,也就是说下面这块的代码是一些无关紧要的代码。

image.png

这块区域就再跟踪这个方法,并且无论跟踪哪个方法都要进行多次的尝试。

假设现在跟踪的是这个核心的处理代码的方法。这个方法它的返回值或者它返回的对象是一个什么样的内容ha到底是个什么命令?Ha实际上就叫处理器适配器。

这也是spring当中三大组件之一,还叫处理器适配器。跟踪一下这个方法gateHandlerAdapter接下来找到watch org .springframework.web.servlet getHandler

看一这里面的get handler这个方法。

Gate handler这个方法想知道它的返回值就输入 return obj再按回车,如果他没有动说明没有调用,这时要再刷新一次,刷新一次以后可以显示它执行的结果可以看到gethandler他返回的对象。如下图:

image.png

这个handler对象里面所有的成员属性其中就有一个handler属性中间就标出来两个处理器,一个是Usercontroller login,它带了两个参数,一个user对象。一个session。还有一个student controller。

找到这两个方法以后基本上就已经找到了具体的处理器是哪一个了

接下来第四步怎么做?

再来追踪这两个方法,它的输入参数和返回值那这时退出再输入watch com.itheima.controller.*.*,

要追踪的是什么呢?

后面要写条件表达式{params returnobj}。

需要知道它的参数是什么,以及它的返回值是什么?

如果不带参数,回车,再去刷新一次,就可以看到追踪的这个方法,如下图代码所示:

image.png

第一个是登录的方法登录的方法最终返回的是一个forward://student/list这个地址,在这个学生信息上面看不到这个地址看到的是logi,它最终跳到student/list这个地址了。

Result=@Array list这个是上面的com.itheima.controller.usercontroller.login登录的方法。

会发现它的返回值返回了一个students,返回一个students集合里面封装的每一个元素。这样就可以知道它的值。

如果看不到密码或者这个方法的其他的一些信息怎么办?可以把这个方法追踪设置它的级别,把它最终的深度设置为两级watch,监视的深度两级

再刷新一下来看结果这个时候就更加清楚了。

image.png

这个是登录的方法。登录里面的用户名和密码这里面还有绘画,之前那个登录是有两个参数的Student/list这个是它的返回值。

同样findall是查找所有的参数来查找所有的学生信息。反而执行modleandview,它会执行这个view。这个方法就能够看到里面的模型的值

加到三级能不能再看得到里面的内容呢?

再刷新次,按回车,然后再刷新,如果三级还看不到就到四级再刷

四级就能看到里面的内容。如下图所示:

image.png

这样就可以具体追踪到每一个方法,因为已经知道它方法的名称了。以上就是具体的应用的一个案例

 

五. 结论

最终主要使用的是这三条命令:一个是 trace,一个是 jad 的,一个是 watch。

trace 是用来追踪最耗时的部分。jad 是反编译的,watch 是用的比较多的,它用来监视每个方法的参数和返回值以及它的所耗时长。

这个就相当于一个简单的实战,实际的应用当中,可以发挥自己的想象,并且需要大量的实战的操作积累相应的经验。

相关文章
|
Arthas 运维 Java
arthas 的使用场景、优点和缺点
Arthas 是Alibaba开源的Java诊断工具,它可以帮助开发人员或者运维人员查找问题、分析性能和bug追踪。以下是Arthas的一些使用场景: 1. 查看目标服务器应用程序的JVM信息。 2. 方法性能的排查和跟踪。例如,在实际使用过程中发现某个接口很耗时,但是无法在本地环境复现的时候,可以通过Arthas的trace来跟踪,它会输出方法内部路径每个节点的耗时。 3. 查找全局视角查看系统的运行状况、健康状况的信息。 4. 反编译源码,查看JVM加载的是否为预期的文件内容。
1150 0
|
固态存储 关系型数据库 MySQL
TiDB亿级数据亚秒响应查询集群部署
TiDB亿级数据亚秒响应查询集群部署
622 0
|
消息中间件 缓存 NoSQL
Java多线程实战-CompletableFuture异步编程优化查询接口响应速度
Java多线程实战-CompletableFuture异步编程优化查询接口响应速度
|
机器学习/深度学习 算法
基于鲸鱼优化的knn分类特征选择算法matlab仿真
**基于WOA的KNN特征选择算法摘要** 该研究提出了一种融合鲸鱼优化算法(WOA)与K近邻(KNN)分类器的特征选择方法,旨在提升KNN的分类精度。在MATLAB2022a中实现,WOA负责优化特征子集,通过模拟鲸鱼捕食行为的螺旋式和包围策略搜索最佳特征。KNN则用于评估特征子集的性能。算法流程包括WOA参数初始化、特征二进制编码、适应度函数定义(以分类准确率为基准)、WOA迭代搜索及最优解输出。该方法有效地结合了启发式搜索与机器学习,优化特征选择,提高分类性能。
|
Java API 数据库
深研Java异步编程:CompletableFuture与反应式编程范式的融合实践
【4月更文挑战第17天】本文探讨了Java中的CompletableFuture和反应式编程在提升异步编程体验上的作用。CompletableFuture作为Java 8引入的Future扩展,提供了一套流畅的链式API,简化异步操作,如示例所示的非阻塞数据库查询。反应式编程则关注数据流和变化传播,通过Reactor等框架实现高度响应的异步处理。两者结合,如将CompletableFuture转换为Mono或Flux,可以兼顾灵活性和资源管理,适应现代高并发环境的需求。开发者可按需选择和整合这两种技术,优化系统性能和响应能力。
357 1
|
Arthas Java 测试技术
arthas入门
arthas入门
474 1
|
前端开发
Grafana 分享带可变参数的链接
Grafana 分享带可变参数的链接
471 0
|
Dubbo Java 应用服务中间件
快速上手使用Dubbo进行远程调用
本场景将对Dubbo的基础结构和使用方式进行介绍,带您体验快速上手使用Dubbo完成基础验证。
|
Arthas Java 测试技术
Arthas 实践案例 | 学习笔记
快速学习 Arthas 实践案例
Arthas 实践案例 | 学习笔记
|
SQL 前端开发 JavaScript
基于Springboot+Mybatis的学校教务管理系统
基于Springboot+Mybatis的学校教务管理系统
619 0
基于Springboot+Mybatis的学校教务管理系统