我是如何通过火焰图分析让应用CPU占用下降近20%的
阿里妹导读
分享作者在使用Arthas火焰图工具进行Java应用性能分析和优化的经验。
看到标题是不是很多人在想是不是标题党了,是也不是👻~,请听我细细道来~
我们的应用代码是用Java写的,因此使用的火焰图工具是Arthas,下面的分析也是基于此。
Arthas火焰图使用
启动火焰图分析
$ profiler startStarted [cpu] profiling
停止
$ profiler stop --format flamegraphprofiler output file: /tmp/test/arthas-output/20211207-111550.htmlOK
如上所示默认会生成一个html的火焰图文件,指定输出格式相关可参考官方文档。
火焰图示例
火焰图横轴代表CPU的占用时间,横轴越宽代表CPU占用越多,鼠标移动上去也可以看到这个方法究竟占用了多少CPU。
纵轴代表调用栈,火焰越高代表调用栈越深。
其中绿色部分代表Java代码,黄色部分代表JVM C++代码,橙色部分代表内核态C语言代码,红色代表用户态C语言代码。
如何分析火焰图(附实战)
事情是这样的,我们的业务简单来说就是监听发货消息后执行一系列操作,分自动和批量两种方式,批量的大用户进行业务操作时,会同时有几万单、十几万单的产生,相当于大促时的流量了,因此cpu占用总是有尖刺,有时单机甚至能到80+%。而且日常流量时感觉cpu占用和流量数据相比也有些偏高,因此决定使用火焰图分析下。
从上往下看
下面采用两个在优化过程中比较典型的两个案例。
案例一
火焰图分析最简单的方式就是找大平顶,如果一个方法占用比较耗时、调用次数很多,那么他的横轴一定是比较宽的,体现到火焰图上就是一个大平顶。
图中红框是业务代码的执行,其中蓝框是初步定位到的耗时操作,点开后可以看到左侧是sentinel采样CPU占用,占用总CPU3%~4%,这部分应该是不会随流量上升而升高的, 这次就先没有动这块。第二块是在metaq的消费者代码里执行的,因此重点关注,因为我们的应用是消息驱动的,接受tp的发货消息后进行对应的操作,metaq流量升高,这部分对应的操作大概率也是会随之升高的。
案例二
从下往上看
案例二
优化效果