0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用Arthas火焰图工具的Java应用性能分析和优化经验

OSC开源社区 来源:阿里云开发者 2024-10-28 09:27 次阅读

以下文章来源于阿里云开发者,作者誉铭

导读

分享作者在使用Arthas火焰图工具进行Java应用性能分析和优化的经验。

看到标题是不是很多人在想是不是标题党了,是也不是~,请听我细细道来~

我们的应用代码是用Java写的,因此使用的火焰图工具是Arthas,下面的分析也是基于此。

Arthas火焰图使用

启动火焰图分析


$ profiler start
Started [cpu] profiling

停止


$ profiler stop --format flamegraph
profiler output file: /tmp/test/arthas-output/20211207-111550.html
OK

如上所示默认会生成一个html的火焰图文件,指定输出格式相关可参考官方文档。

火焰图示例

0bfa336a-9409-11ef-a511-92fbcf53809c.png

火焰图横轴代表CPU的占用时间,横轴越宽代表CPU占用越多,鼠标移动上去也可以看到这个方法究竟占用了多少CPU。

纵轴代表调用栈,火焰越高代表调用栈越深。

其中绿色部分代表Java代码,黄色部分代表JVM C++代码,橙色部分代表内核态C语言代码,红色代表用户态C语言代码。

如何分析火焰图(附实战)

事情是这样的,我们的业务简单来说就是监听发货消息后执行一系列操作,分自动和批量两种方式,批量的大用户进行业务操作时,会同时有几万单、十几万单的产生,相当于大促时的流量了,因此cpu占用总是有尖刺,有时单机甚至能到80+%。而且日常流量时感觉cpu占用和流量数据相比也有些偏高,因此决定使用火焰图分析下。

从上往下看

下面采用两个在优化过程中比较典型的两个案例。

案例一

0c164d16-9409-11ef-a511-92fbcf53809c.png

火焰图分析最简单的方式就是找大平顶,如果一个方法占用比较耗时、调用次数很多,那么他的横轴一定是比较宽的,体现到火焰图上就是一个大平顶。

图中红框是业务代码的执行,其中蓝框是初步定位到的耗时操作,点开后可以看到左侧是sentinel采样CPU占用,占用总CPU3%~4%,这部分应该是不会随流量上升而升高的, 这次就先没有动这块。第二块是在metaq的消费者代码里执行的,因此重点关注,因为我们的应用是消息驱动的,接受tp的发货消息后进行对应的操作,metaq流量升高,这部分对应的操作大概率也是会随之升高的。

0c1b55f4-9409-11ef-a511-92fbcf53809c.png

0c33415a-9409-11ef-a511-92fbcf53809c.png

占总CPU占用达到了惊人的9.3%。 点开后可以看到是脱敏工具,其对性能的影响几乎和发货消息齐平了,排查后发现是我们部门内部使用的链路采集工具,在采集metaq消息时会对消息进行脱敏处理,脱敏工具会对姓名、邮箱、手机号等分别进行正则匹配,而我们接收的交易消息中是包含整个订单信息的,这个对象是很大的(包含扩展字段等诸多信息),对其使用正则进行脱敏工作量巨大。正常情况下使用此工具采集线上流量对性能影响不是很大,但是在我们的场景影响有点出乎意料...... 由于我们平时基本不会在链路图上关注消息的内容,一般都是用来看HSF链路,因此直接把dp对metaq的采集关闭了。

案例二

0c38d2a0-9409-11ef-a511-92fbcf53809c.png

0c689134-9409-11ef-a511-92fbcf53809c.png

0c88e9ac-9409-11ef-a511-92fbcf53809c.png

使用全局搜索后居然占用了将近6%的CPU,这可是日常的流量下截取的火焰图,系统流量升高时占用比例会更大。 点开后可以看到是进行HSF调用的时候,获取Java调用栈比较耗时,之前写代码的时候怀疑过获取调用栈会比较耗性能,但没想到居然比一次HSF调用本身的耗时都大了。这个地方之前是为了获取调用来源,打印到日志中方便排查问题的(历史代码),后续将HSF的调用日志改成了通过HSF Filter的方式,去掉了获取调用栈的逻辑。 其实案例二我一开始不是从上往下看定位到的,因为调用HSF的地方不止一个,每个耗时其实也不长,整体看的话从上往下还是比较难发现的。

从下往上看

案例二

如果从上往下看效果不明显,可以从我们系统主要流量入口处进行分析,从下面入口一步步往上点,也可以发现问题,带着怀疑的态度来找,上述的案例二我一开始并没有注意到上方的问题,我是一步步从消息入口看,然后点到上面发现的这个调用消耗居然比HSF多的。

0c8c56d2-9409-11ef-a511-92fbcf53809c.png

可以看到这个调用不是集中在一个地方的,细看每个地方都有调用,所以整体对性能的影响才那么大。 全局搜索后可以看到到处都有调用(图示紫色部分)。

0c91cdba-9409-11ef-a511-92fbcf53809c.png

从下往上找更适合细化的时候,专门对某个链路进行分析优化。

优化效果

下面来让我们计算一下数据,来看看楼主是不是标题党了。

0c98511c-9409-11ef-a511-92fbcf53809c.png

整体大致优化了5~6%左右(7月份的时候,机器数量是30台,8月缩容到了27台),取5%,其中系统CPU占用在6.5%左右,从日常流量上来看,用户态cpu从26%到21%,下降19%+,考虑缩容的关系,20%的优化大抵是有的。 由于这是日常流量的优化结果,大促流量突增时,系统负载降低应该会更明显,优化后大用户批量操作时瞬时流量也基本不会有机器cpu占用超过60%了。 后续双十一压测也会继续关注优化,流量上升后更多问题可能就会暴露出来。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10794

    浏览量

    210643
  • JAVA
    +关注

    关注

    19

    文章

    2951

    浏览量

    104420
  • 代码
    +关注

    关注

    30

    文章

    4708

    浏览量

    68171

原文标题:我是如何通过火焰图分析让应用CPU占用下降近20%的

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    OpenHarmony之开机优化

    OpenHarmony已经支持了Bootchart工具,我们可以直接使用Bootchart工具,Bootchart工具介绍如下: 概述 Bootchart是一个用于系统启动过程性能
    发表于 07-01 16:39

    高薪聘JAVA工程师

    ; 2、深入理解业务需求,分析和发现系统的优化点,负责推动产品性能和架构优化; 3、对所负责系统进行规划,并结合项目不断优化和升级,提高
    发表于 05-27 16:23

    详解java代码优化方法

    性能下降,JDK7之后,可以使用ThreadLocalRandom来获取随机数44. 静态类、单例类、工厂类将它们的构造函数置为private以上是常用的Java代码优化方法,在Java
    发表于 04-02 15:43

    针对于Java的35 个代码性能优化总结

    针对于Java的35 个代码性能优化总结 前言代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑
    发表于 06-19 21:03

    具有特殊应用性能的模拟开关有什么优点

    随着市场对功能丰富的手机需求越来越强劲,具有特殊应用性能的模拟开关得到了最终设计的持续青睐。此举不仅能降低材料成本(BOM),还有助于提升设计性能并满足对产品上市时间的要求。本文将通过若干实际用例
    发表于 07-16 06:21

    嵌入式Java虚拟机的性能优化技术

    ——JMO+(JMOplus)的性能优化技术。 在过去的几年里,Java已经在各个领域得到了广泛的应用,尤其是无线移动领域,全球180多个移动运营商已经推出了Java下载服务。无线手持
    发表于 07-18 06:26

    关于java性能优化的一些细节

    优化。此举能够使性能平均提高50% 。2、尽量重用对象特别是String对象的使用,出现字符串连接时应该使用StringBuilder/StringBuffer代替。由于Java虚拟机不仅要花时间生成
    发表于 10-11 09:23

    Arm高性能计算工具试用分析

    全球排名前20的超级计算机用户中有70%使用Arm工具来快速理解应用程序性能,并通过调试、分析优化更快地获得结果努力。
    发表于 08-02 09:51

    【技术视界】鸿蒙开发套件之DevEco Profiler助您轻松分析应用性能问题

    作者:shizhengtao,华为性能调优工具专家 应用的性能优化一直以来都是开发者所面临的一大难题,在2023HDC大会上全新亮相的HarmonyOS NEXT开发者预览版,其中鸿蒙
    发表于 09-15 15:55

    JAVA教程之图片火焰效果

    JAVA教程之图片火焰效果,很好的JAVA的资料,快来学习吧
    发表于 04-11 17:14 5次下载

    Arthas可以解决哪些问题

    诊断利器 Arthas,是阿里的一款开源工具。Github-alibaba/arthas 上可以看到它的介绍
    的头像 发表于 12-24 14:22 748次阅读

    技术速递 | Java Agent场景性能测试分析优化经验分享

    能力产生一定的性能影响,作为一个基于Java Agent技术做服务治理的框架,我们需要在保证服务治理能力生效的同时,极小的影响微服务原有的服务性能。 虽然基于Java Agent的服务
    的头像 发表于 03-25 07:55 639次阅读

    Arthas -- 一款释放潜力的神器

    阿里巴巴 Arthas 是一个诊断工具,可以用于监视、分析和解决 Java 应用程序的问题。使用 Arthas 的一个主要优点是,我们不需要
    的头像 发表于 07-05 11:21 509次阅读
    <b class='flag-5'>Arthas</b> -- 一款释放潜力的神器

    【技术视界】鸿蒙开发套件之DevEco Profiler助您轻松分析应用性能问题

    的是华为性能调优工具专家的分享,希望能为您的应用性能优化带来启发~ 作者:shizhengtao,华为性能调优
    的头像 发表于 09-15 12:15 930次阅读
    【技术视界】鸿蒙开发套件之DevEco Profiler助您轻松<b class='flag-5'>分析</b><b class='flag-5'>应用性能</b>问题

    jvm内存分析命令和工具

    JVM内存分析Java开发和调优过程中非常重要的一部分。通过对JVM内存分析命令和工具的深入了解和使用,可以帮助开发人员识别内存泄漏、性能
    的头像 发表于 12-05 11:07 1098次阅读