昨天听优化分享,有同学用火焰图调优有些问题,简单说一下这个工具

250 阅读3分钟

「这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战」。

早些年参加技术大会,听到千篇一律或者吹牛或者非常虚的项目很多,唯有一个让人印象深刻,就是远程调试调优工具。那次是章亦春(大家都喊春哥,工具地址)做的分享,初识了春哥。他是很喜欢研究技术也喜欢分享的人,还从他这里接触到了一些冥想,后来也跟自己的导师学了一些冥想,自己觉得冥想很有帮助,有兴趣的同学可以也多了解一下。

简单说,火焰图的是:在一段时间内,通过Linux提供的内核命令获取CPU堆栈信息采样,聚合采样信息画成的一个有函数调用关系和耗时相对时间的图,形似火焰,所以叫火焰图。

用途很多,不仅可以用于调试Java项目,它可以调试任何运行的进程。搜索一下安装工具,自己画一画,都很简单。

这次主要说说优化分享的这个案例,以期能对其他同学有帮助。案例图如下:

image.png

火焰图是对CPU堆栈信息的抽样聚合,上图中上下层级关系是下层函数调用了上层函数,每层宽度代表了这个函数在抽样中占比,通常会理解成耗时。

这个案例中述职同学找到两处行性能瓶颈,但是根因定位不准确。一处是左侧红框画起来的部分,说是用localcache解决了远程调用带来的损耗。其实根因是用ArrayList进行contains操作,远程调用耗时占比占比应该不足1/3。写这部分代码的同学应该是不太了解数据结构特点,基本功不扎实。

第二处优化就是右侧jackson部分,这里进行了大量的业务日志记录,并且使用json进行了数据编码。json编码对CPU损耗非常大,这个所有研发同学应该对这个有基础认知,如果只是日志记录,别用这么重的编码形式,精简日志或者简单字符串拼接会更经济。

两处优化其实都是不应该存在的。面对汇报说优化了30%、50%甚至更高的时候,听的同学要非常警惕,这可能在表述写这部分代码的同学基本功潜在的有些问题或者认知有缺失(不要觉得述职汇报了巨大优化效果是好事,自己挖的坑自己偷偷填上比较好)。当然也有非常非常有意义有沉淀价值的优化,我们要把这部分知识沉淀好,拿出来述职或分享,也要积极鼓励分享优化经验。

通过#今日份十分钟#这个案例,应该能大概了解火焰图和用火焰图调优了,同学们快试试自己写的项目吧。