前言

最近负责的一个核心服务,TP999总是被上游吐槽,失败率也比较高。TP999达到了200ms+,最终通过arhas的火焰图,直接定位到了耗时的原因,是由于对象多余的序列化和反序列化导致的,去掉后性能提示了30%。本文将会顺带介绍一下火焰图的使用。

火焰图生成

如何安装Arthas这里不在介绍了,不知道的可以看笔者的前一篇文章:
Arthas实战

1.profiler start 启动采集(默认是CPU)
2.profiler getSamples 查看采样的数量
3.profiler status  查看采样的状态(是否在运行,运行了多久)
4.profiler stop 停止并生成火焰图

在这里插入图片描述
大家可以看到火焰图生成的路径,可以通过路径打开,也可以通过web打开(默认情况下可以打开: http://localhost:3658/arthas-output/ )。

火焰图解析

这是刚才测试程序生成的火焰图:
在这里插入图片描述
1.这里的x轴代表采样总量(也就是此刻所有执行的耗时cpu的方法)。
这是注意的是x 轴并不代表时间,而是所有的调用方法合并后,按字母顺序排列。
2.Y轴代表方法的调用栈深度,每一层都是一个方法。顶部是正在执行的方法。当然调用栈越深,火焰就越高。
3.鼠标可以点击的选中的每个框就代表了一个栈里的函数,其宽度可以直接理解为CPU时间占比(其实是采样的数量以及与采样总量的占比)。
那么,也就是说占比比较宽的框就表示:
a.该函数运行时间较长(单次时间长)
b.被调用次数较多.(调用频率高)
进而被采样的次数比较多,占用的CPU时间多。

4.另外火焰图:
绿色部分代表Java代码
黄色部分代表JVM C++代码
橙色部分代表内核态C语言代码
红色代表用户态C语言代码

由此可知,火焰图可以直观的帮我们分析CPU占用情况。

实战排查

在这里插入图片描述
当时的系统火焰图如上,大家可以发现,这个方法被Jackson.parse 和 Jackson.writeToString 浪费了这么多的CPU耗时,果断进行了优化,去除掉了序列化。

总结

火焰图对于性能分析非常直观方便,笔者这里也只是抛砖引玉,欢迎大家分享、拍砖~

参考资料

1.acmqueue 火焰图文章
2.火焰图介绍

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐