利用Arthas+APM监控进行Java性能深度定位

news2024/12/25 10:09:37

大家可能都用过APM监控,包括开源的Skywalking、商用的卓豪(ZOHO)ManageEngine APM应用性能监控、以及云监控产品如听云(Server监控),这些APM监控产品大大方便了我们实时监控应用性能,并实现性能深度透视监控。

但是这些监控手段离真正能够定位性能问题还是有一段距离,有时候可能就差这最后1米的距离,只能找资深开发人员介入定位分析,有些开发人员还真没这水平。但其实我们用好了工具,任何人都可以参与定位分析,甚至不用依赖开发人员就能找到问题所在,换句话说,测试人员不需要去深度定位分析问题,但至少要找到和开发人员沟通的桥梁吧,你把APM监控的结果发给开发人员,直接做个甩手掌柜,你信不信,开发人员可能看都不看,直接说那不是他的代码问题,可能是环境或配置问题,因为确实可能真不是他的问题,再说了,你会用APM监控工具,开发人员不一样会用,用的比你还溜,靠工具不是真本事,会用好工具才是真本事(同时你还能结合业务去思考和应用,这是开发人员不具备的)。 

一、APM监控可以告诉你慢的方法名

说到web响应慢,有很多方法能够监控,比如我们用浏览器自带的开发者工具就行,像谷歌浏览器通过F12,查看network就能看响应时间,就拿我最近测试的一个系统当中的导出功能来实验:

可以看到导出的请求,响应时间12.4秒,大部分时间花在等待服务器响应,这时候我们会说这个接口请求很慢,但我们无法知道慢的方法名,因为我们最多就捕获到了请求接口:

通过性能测试工具如JMeter,也一样的道理,我们只知道哪个请求哪个接口慢,不知道哪个方法调用慢,但通过APM监控就可以知道这个慢请求的方法,包括方法名和入口参数名:

通过APM监控的慢事务分解,我们能看到方法名是com.nfschina.controller.ExportController,其入口参数是exportLoophole

二、APM监控无法看到多层次的调用逻辑

看到了入口方法,我们肯定想知道下一层的方法是什么,想进一步深度探索,这在大部分的APM监控是做不到了,比如我们就看事务的慢组件分解,如下所示:

这个表能看出com.nfschina.controller.ExportController的方法多层调用吗?什么也看不出来,只是列出了方法调用的第一层方法链,ExportController为什么慢,还是根本不知道,不过这里还是能排除慢SQL问题(通过PreparedStatement/execute执行时间),至于代码为什么慢的问题是看不出来的,因为这只是第一层代码调用关系。

三、利用Arthas进行深度追踪

虽然我们作测试时,不能直接定位到性能慢的原因,但至少可以给开发人员提供慢事务的方法名,以及平均响应时间数据,本身也是价值很大。开发得到这些数据,就可以进一步定位分析。同样我们测试人员也可以尝试用开发的工具去进一步定位分析,比如Arthas:

 如上图,我们第一步,通过 trace com.nfschina.controller.ExportController exportLoophole追踪到了慢的方法com.github.liaochong.myexecl.core.ExcelBuilder,到这里就可以判断出慢的组件是myexcel,我们再一步步深入追踪:

最后我们追踪到是myexcel组件的createRow方法慢(响应时间占99.73%),其实就是mysql的数据导成excel创建table行数据很慢。

四、利用Arthas进一步获取异常信息

APM监控除了能捕获慢事务方法,还可以捕获异常信息的方法,如下所示:

通过监控,我们可以看出错误方法的名称及传参,并且抛出的异常信息是CustomException,如果我们觉得不够清晰,其实我们还可以用Arthas进一步查看和追踪异常信息,如下:

其实这只是个思路,因为Java的异常信息可能也是一层层上抛的,所以通过Arthas的命令是可以一层层的去追踪报错信息。

五、Arthas并不是万能的

通过上面的例子,你可能会觉得用Arthas定位Java性能问题简直无所不能,其实不是,引起Java性能问题的因素千种万种,可能就不是你说的那一种,有些问题不是Java代码的问题,但也可能会映射成是Java的代码问题,因为软件架构各式各样,代码之间互相调来调去,再加上环境千差万别,各种因素互相干扰,所以你还要有足够的敏锐度和经验去排查,以下我拿上面报异常的方法做个例子,这个方法之所以报异常,其实是和性能不稳定也有关,有时候响应很快,不到300ms,有时候很慢,高于15s,甚至直接报异常了。我们通过arthas反复一层层trace,去找到慢的原因:

1、首先我通过APM监控获取它的慢方法名

 2、然后开始arthas追踪获取下一层慢方法

 3、继续一层层往下追踪

4、不要一味的穷尽trace

当我们trace到这一步是,发现好像跟IO读取有关了,如下所示:

这时候我们就要思考了,这个业务是属于IO占用高的事务吗?显然不是呀,这只是个通过漏洞CVE编码去官网获取漏洞详情事务的请求,请求和获取的数据量都很小,也不需要去查询SQL。这时候我们就要排除是否Java代码的问题,因为不排除的话,这样一直trace下去就会越来越迷茫,因为都超出正常业务代码的范围了。另外就算是IO问题或网络问题,这也要涉及到和其他监控工具结合监控,比如通过查看服务器找找哪个进程线程占用IO高,总之,思路也得转变了。

基于我对这个业务的了解,我判断不太可能是简单的IO问题,我们首先思考这个方法除了Java代码本身,还有没有调用第三方的东西。通过从开发那了解到,这个业务其实是调用一个工具去第三方的网站爬取数据,这个工具是用go语言写的,和Java没关。所以我们花大把时间在这用arthas去追踪Java的性能问题,根本是在浪费时间。以上只是举个例子,就是告诉我们无论什么时候,都要有独立的判断能力,不能沉浸于工具带给我们的方便,而放弃了思考。

既然,找到了是这个go语言写的小工具的性能问题,那我们就直接调用和测试这个小工具,抛开Java的干扰,同时优化性能也可以从Java语言转移到这个golang小工具了,以下是通过JMeter对这个小工具的测试报告(单用户测试),发现确实是性能不稳定:

 响应时间波动非常大:

在单用户下,性能就如此不稳定,由于这个golang小工具,还会到漏洞官网去爬取数据,所有我们直接用JMeter按同样的逻辑去官网爬取数据(绕开这个工具),看看网站性能如何:

性能很高,两个接口加起来平均也不到200ms,再看响应时间波动和网络流量,都不大(响应时间有较大抖动,但最大响应时间都不高),如下所示:

说明,golang小工具爬取数据的性能很不稳定,不是和网站页面请求及网络性能有关,是它自身的性能问题(当然是否触发防爬取也需要考虑),通过排除法也可以告知开发人员,应该好好对这个golang写的小工具进行性能定位分析,由于本篇讲的是APM监控+Arthas定位分析问题,至于定位分析golang就需要用到别的工具,如pprof,本篇就不继续展开说明了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/845876.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

04-6_Qt 5.9 C++开发指南_QListWidget和QToolButton

文章目录 1. 实例简介2. 源码2.1 混合式界面设计2.2 mainwindow.h2.3 mainwindow.cpp 1. 实例简介 Qt 中用于项 (Item)处理的组件有两类,一类是 Item Views,包括 QListView、QTreeView、QTableView、QColumnView 等;另一类是 Item Widgets,包…

用html+javascript打造公文一键排版系统14:为半角和全角字符相互转换功能增加英文字母、阿拉伯数字、标点符号、空格选项

一、实际工作中需要对转换选项细化内容 在昨天我们实现了最简单的半角字符和全角字符相互转换功能,就是将英文字母、阿拉伯数字、标点符号、空格全部进行转换。 在实际工作中,我们有时只想英文字母、阿拉伯数字、标点符号、空格之中的一两类进行转换&a…

FTP Server(二)

问题 使用Centos8通过命令行登录FTP服务器后发现乱码,无法显示中文 原因 FTP服务器是windows系统使用的是GBK编码,大多数Linux版本默认使用的是UTF-8 解决 在家目录下新建编辑 .lftprc 文件 [rootwenzi ~]#pwd /root [rootwenzi ~]#vim .lftprc debu…

狂神说-通俗易懂的23种设计模式

狂神说-通俗易懂的23种设计模式 文章目录 1、设计模式概述2、OOP七大原则4、工厂模式5、抽象工厂模式6、建造者模式7、原型模式8、适配器模式9、桥接模式10、静态代理模式11、静态代理再理解12、动态代理详解 1、设计模式概述 设计模式的基本要素: 1、模式名称 2、…

以太网DHCP协议(十)

目录 一、工作原理 二、DHCP报文 2.1 DHCP报文类型 2.2 DHCP报文格式 当网络内部的主机设备数量过多是,IP地址的手动设置是一件非常繁琐的事情。为了实现自动设置IP地址、统一管理IP地址分配,TCPIP协议栈中引入了DHCP协议。 一、工作原理 使用DHCP之…

2022 robocom 世界机器人开发者大赛-本科组(国赛)

RC-u1 智能红绿灯 题目描述: RC-u1 智能红绿灯 为了最大化通行效率同时照顾老年人穿行马路,在某养老社区前,某科技公司设置了一个智能红绿灯。 这个红绿灯是这样设计的: 路的两旁设置了一个按钮,老年人希望通行马路时会…

C语言预处理命令 #error 学习

#error命令是C/C语言的预处理命令之一,当预处理器预处理到#error命令时将停止编译并输出用户自定义的错误消息。 如下代码输出数字1000,如果加了 #error,构建时不会通过,提示出错如下; 这可能在大型项目中比较有用&am…

前端小练--社区主页

文章目录 前言首页结构固定导航栏左侧导航itemitem标志 头部推荐文章展示ITEM实现ToolTip完整实现 首页完整实现 前言 废话不多说,直接看到效果: 是的也许你已经发现了这个页面和某个网站长得贼像。没错是这样的,这个布局我确实看起来很舒服…

【Rust】Rust学习 第五章使用结构体组织相关联的数据

5.1 定义结构体并实例化结构体 定义结构体,需要使用 struct 关键字并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着,在大括号中,定义每一部分数据的名字和类型,我们称为 字段(field&…

从进程pid反推获得该进程所属容器

参考链接 https://cloud-atlas.readthedocs.io/zh_CN/latest/docker/debug/get_container_by_pid.html

基于Java+SpringBoot+Vue的生鲜交易系统设计与实现(源码+LW+部署文档等)

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

Idea使用Docker插件实现maven打包自动构建镜像

Docker 开启TCP 服务 vi /lib/systemd/system/docker.service改写以下内容 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock重启服务 #重新加载配置文件 systemctl daemon-reload #重启服务 systemctl restart docker.service此时docker已…

支付模块功能实现(小兔鲜儿)【Vue3】

支付 渲染基础数据 支付页有俩个关键数据,一个是要支付的钱数,一个是倒计时数据(超时不支付商品释放) 准备接口 import request from /utils/httpexport const getOrderAPI (id) > {return request({url: /member/order/$…

Redis实战案例27-UV统计

1. Redis的HyperLogLog的统计功能 示例: 表明HyperLogLog不管加入重复元素多少次都不会让count,不会计数重复元素,所以适合做UV计数 2. 简单实现UV测试 通过单元测试,向 HyperLogLog 中添加 100 万条数据,看看内存占…

小鼠是否使用分布性RL?DeepMind说是的

DeepMind的研究人员发现了大脑对多巴胺的反应与分布强化学习的趋势AI理论之间的相似之处。这些发现验证了分布强化学习的潜力,并促使DeepMind研究人员自豪地宣称“现在人工智能研究走在正确的道路上”。 在这项新研究中,来自DeepMind和哈佛大学的研究人…

C# 完成串口通信RS485

C# 完成串口通信RS485|RS232上下位机交互 第零步: 我用的是电脑usb 转串口的所以首先是驱动程序下载,我们用的是CH341 下载地址:https://www.wch.cn/downloads/CH341SER_EXE.html 第一步:连接机器 RS485 上面有三个端子&#xf…

LangChain手记 Overview

整理并翻译自DeepLearning.AILangChain的官方课程:Overview 综述(Overview) LangChain是为大模型应用开发设计的开源框架 LangChain目前提供Python和JavaScript(TypeScript)两种语言的包 LangChain的主攻方向是聚合和…

若依form中点击重置按钮,select2选中项不会被重置

若依form中点击重置按钮,select2选中项不会被重置问题,下面提供解决办法。 如图所示,点击重置按钮后, 值被重置为初始状态, 而select2仍然选中之前的选项。 解决办法 在 ry-ui.js文件中 625行增加 下边的代码即可 $("#" currentId).find(select).val…

Parquet存储的数据模型以及文件格式

文章目录 数据模型Parquet 的原子类型Parquet 的逻辑类型嵌套编码 Parquet文件格式 本文主要参考文献:Tom White. Hadoop权威指南. 第4版. 清华大学出版社, 2017.pages 363. Aapche Parquet是一种能有效存储嵌套数据的列式存储格式,在Spark中应用较多。 …

【框架篇】MyBatis 介绍及使用(详细教程)

一,MyBatis 介绍 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff…