利用Arthas+APM监控进行Java性能深度定位
大家可能都用过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,本篇就不继续展开说明了。
相关文章:
利用Arthas+APM监控进行Java性能深度定位
大家可能都用过APM监控,包括开源的Skywalking、商用的卓豪(ZOHO)ManageEngine APM应用性能监控、以及云监控产品如听云(Server监控),这些APM监控产品大大方便了我们实时监控应用性能,并实现性能…...
【BASH】回顾与知识点梳理(十一)
【BASH】回顾与知识点梳理 十一 十一. 八至十章知识点总结及练习11.1 总结11.2 练习情境模拟题一:透过 grep 搜寻特殊字符串,并配合数据流重导向来处理大量的文件搜寻问题。情境模拟题二:使用管线命令配合正规表示法建立新指令与新变量。 该系…...
vue2-diff算法
1、diff算法是什么? diff算法是一种通过同层的树节点进行比较的高效算法。 其有两个特点: 比较只会在同层级进行,不会跨层级进行。 在diff比较的过程中,循环从两边向中间比较。 diff算法在很多场景中都有应用,在vue中&…...
SpringBoot使用redis作为缓存的实例
目录 什么是缓存? 缓存的作用? 缓存的成本? 实际项目中的应用 代码展示 什么是缓存? 缓存就是数据交换的缓冲区(称作Cache [ kʃ ] ),是存贮数据的临时地方,一般读写性能较高。 缓…...
vue3使用vue3-seamless-scroll插件
1、局部引入 import vueSeamlessScroll from "vue-seamless-scroll"; 2、注册 components: { vueSeamlessScroll, }, 3、使用 <vue3-seamless-scroll :list"list1" class"scroll" step"0.2"><div class"item"…...
QT开发学习相关笔记
QT中配置文件读取 QT中使用的config文件为:xxx.ini文件,基本格式如下: 使用 QSetting(QT自带类)中的相关接口实现设置配置文件数据,或者读取数据。 读取配置文件路径设置如下,其中 iniPath为设置路径 ne…...
拆分PDBQT文件并将其转换为PDB格式
拆分PDBQT文件转为PDB格式 1. vina_split拆分PDBQT文件 假设你用AutoDock Vina做了对接,那么所有预测的结合构象都被放入一个多构象 PDBQT 文件中,如果需要拆分后进行可视化分析,那么Vina官方自带了vina_split来进行拆分。下面是vina_split…...
Reinforcement Learning with Code 【Code 4. DQN】
Reinforcement Learning with Code 【Code 4. DQN】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation of Reinforcement…...
Python3 高级教程 | Python3 正则表达式(一)
目录 一、Python3 正则表达式 (一)re.match函数 (二)re.search方法 (三)re.match与re.search的区别 二、检索和替换 (一)repl 参数是一个函数 (二)comp…...
奥威BI系统:零编程建模、开发报表,提升决策速度
奥威BI是一款非常实用的、易用、高效的商业智能工具,可以帮助企业快速获取数据、分析数据、展示数据。值得特别注意的一点是奥威BI系统支持零编程建模、开发报表,是一款人人都能用的大数据分析系统,有助于全面提升企业的数据分析挖掘效率&…...
海康威视摄像头二次开发_云台控制_视频画面实时预览(基于Qt实现)
一、项目背景 需求:需要在公司的产品里集成海康威视摄像头的SDK,用于控制海康威视的摄像头。 拍照抓图、视频录制、云台控制、视频实时预览等等功能。 开发环境: windows-X64(系统) + Qt5.12.6(Qt版本) + MSVC2017_X64(使用的编译器) 海康威视提供了设备网络SDK,设备网…...
单片机外部晶振故障后自动切换内部晶振——以STM32为例
单片机外部晶振故障后自动切换内部晶振——以STM32为例 作者日期版本说明Dog Tao2023.08.02V1.0发布初始版本 文章目录 单片机外部晶振故障后自动切换内部晶振——以STM32为例背景外部晶振与内部振荡器STM32F103时钟系统STM32F407时钟系统 代码实现系统时钟设置流程时钟源检测…...
Matlab实现决策树算法(附上多个完整仿真源码)
决策树是一种常见的机器学习算法,它可以用于分类和回归问题。在本文中,我们将介绍如何使用Matlab实现决策树算法。 文章目录 1. 数据预处理2. 构建决策树模型3. 测试模型4. 可视化决策树5. 总结6. 完整仿真源码下载 1. 数据预处理 在使用决策树算法之前…...
java中异步socket类的实现和源代码
java中异步socket类的实现和源代码 我们知道,java中socket类一般操作都是同步进行,常常在read的时候socket就会阻塞直到有数据可读或socket连接断开的时候才返回,虽然可以设置超时返回,但是这样比较低效,需要做一个循环来不停扫描…...
ElasticSearch7.6入门学习笔记
在学习ElasticSearch之前,先简单了解一下Lucene: Doug Cutting开发 是apache软件基金会4 jakarta项目组的一个子项目 是一个开放源代码的全文检索引擎工具包不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的…...
《面试1v1》ElasticSearch架构设计
🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪 🍅 技术交流:定期更新Java硬核干货,不定期送书活动 🍅 王哥多年工作总结:Java学习路线总结…...
tomcat和nginx的日志记录请求时间
当系统卡顿时候,我们需要分析时间花费在哪个缓解。项目的后端接口可以记录一些时间,此外,在我们的tomcat容器和nginx网关上也可以记录一些有关请求用户,请求时间,响应时间的数据,可以提供更多的信息以便于排…...
数据结构——红黑树基础(博文笔记)
数据结构在查找这一章里介绍过这些数据结构:BST,AVL,RBT,B和B。 除去RBT,其他的数据结构之前的学过,都是在BST的基础上进行微小的限制。 1.比如AVL是要求任意节点的左右子树深度之差绝对值不大于1,由此引出…...
盘点帮助中心系统可以帮到我们什么呢?
在线帮助中心系统是一种强大的软件系统,可以让我们用来组织、管理、发布、更新和维护企业的宝贵知识库和用户文档。今天looklook就详细讲讲,除了大众所熟知的这些,帮助中心系统还有什么特别作用呢? 帮助中心系统的作用 1.快速自助…...
Web3 solidity编写交易所合约 编写ETH和自定义代币存入逻辑 并带着大家手动测试
上文 Web3 叙述交易所授权置换概念 编写transferFrom与approve函数我们写完一个简单授权交易所的逻辑 但是并没有测试 其实也不是我不想 主要是 交易所也没实例化 现在也测试不了 我们先运行 ganache 启动一个虚拟的区块链环境 先发布 在终端执行 truffle migrate如果你跟着我…...
不再依赖翻译专员:跨马翻译让运营人员也能独立完成高质量多语言出图
一、一个让中型跨境团队头疼的问题 我们团队从最初的单人作战发展到现在的十五人规模,花了大概三年时间。团队架构从最早的"运营一肩挑",逐步细分为运营组、产品组、设计组、客服组和市场组。分工越来越明确,但问题也随之而来——翻…...
水泥路面裂缝分类数据集该数据集包含有图片40000张,类别是有裂缝和没有裂缝图像大小是227x227可直接进行使用
水泥路面裂缝分类数据集 该数据集包含有图片40000张,类别是有裂缝和没有裂缝 图像大小是227x227 可直接进行使用...
Nunchaku-FLUX.1-dev开源镜像部署教程:免编译、免依赖、一键拉起服务
Nunchaku-FLUX.1-dev开源镜像部署教程:免编译、免依赖、一键拉起服务 1. 开篇:为什么你需要这个本地文生图神器? 如果你玩过AI绘画,肯定遇到过这些烦心事:想用国外模型生成中文场景,结果出来的图不伦不类…...
BROADCHIP广芯 BCT0104EGD-TR QFN 转换器/电平移位器
特性 无需方向控制信号数据速率 24Mbps(推) 2Mbps(开漏) A端口1.65V至5.5V,B端口2.3V至5.5V(VCCA < VCCB) VCC隔离:若任一VCC接地,则两个端口均处于高阻抗状态 无需电源供应顺序,VCCA或VCCB可先斜坡上升 lOFF:支持部分断电模式操作 提供QF…...
JTAG引脚定义:从接口信号到调试实践的深度解析
1. JTAG接口的核心引脚功能解析 第一次接触JTAG接口时,看到那一排密密麻麻的引脚确实有点发怵。但实际用起来你会发现,真正关键的信号线就那么几根。我调试过的板子少说也有上百块,总结下来最核心的就是TCK、TMS、TDO、TDI这四根线࿰…...
移动端ncnn部署YOLOv11:从官方转换到实战排错
1. 移动端部署YOLOv11的完整流程 在移动端部署YOLOv11模型,ncnn无疑是最佳选择之一。这个轻量级的高性能神经网络前向计算框架,专为移动端优化设计。我最近刚完成一个项目,需要把YOLOv11部署到安卓设备上,整个过程虽然踩了不少坑…...
从物流小哥,转行网络安全,是我这辈子最成功的选择
从月薪4000的物流小哥成功转行到月入上万的网络安全工程师,我是怎么做到的,下面说说我的亲身经历。 我叫阿强,我是26岁转行学网安的。说实在,转行就是奔着挣钱去的。我三流大学毕业,物流专业,学习能力一般…...
新手零基础入门:在快马平台上用jupyter notebook学习python数据分析
作为一个刚接触Python数据分析的小白,最近在InsCode(快马)平台上发现了一个超实用的学习方式——用Jupyter Notebook零基础入门。这个交互式工具简直是为新手量身定制的,特别适合像我这样不想折腾环境配置的人。下面分享我的学习笔记,记录如何…...
一体化数字引擎 驱动机械设备非标项目精益盈
机械设备行业正进入深度数字化转型期,非标定制与项目型制造企业普遍面临项目成本失控、进度不透明、变更响应慢、售后价值难挖掘等核心痛点。传统分散式管理与复杂业务场景脱节,导致交付延迟、利润流失、协同效率低下。面向非标设备行业的数字化管理需求…...
网站爬虫原理,基于浏览器点击行为还原可接口请求
爬虫这个词细节来说本质只有一件事,把浏览器发出的请求,换一种方式再发一遍 问题不是怎么发请求,而是: 请求是怎么构造的参数从哪里来的哪些字段不能少从一个点击动作开始 打开一个网站,例如一个列表页。 执行一个动作…...
