面试题--cpu高解决方案以及火焰图学习
Posted go大鸡腿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题--cpu高解决方案以及火焰图学习相关的知识,希望对你有一定的参考价值。
前言
在很多面试题中,有个高频的:线上cpu很高的时候,怎么处理
参考文章
cvte厂的巨佬,摩拜一波
套路
- top拿到占用cpu比较高的进程
- top -HP拿到进程中的线程pid
- jastack 对应pid | grep pid转十六进制(或者自己去文件找)
怎么优化
根据打印出来的堆栈信息,进行分析,也可以使用火焰图进行优化对应代码
步骤
- java -jar arthas-boot.jar
- 会显示正在运行的jar
- 然后选择对应的数值,进行profiler
- 导出成svg
由于现在没有特定代码导致cpu问题,我们就拿写相对比较占用cpu的代码看看
火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。
截取自参考文章
查看相关占用cpu代码
可以看到我们公司的代码很多调用这个类转换的方法,使用的是org.springframework.beans.BeanUtils#copyProperties(java.lang.Object, java.lang.Object, java.lang.Class<?>, java.lang.String…)
这个相对比较消耗性能的,怎么优化呢?
- BeanCopier的性能是PropertyUtils (apache-common)的504倍。
- PropertyUtils的性能是BeanUtils(apache-common)的1.71倍
再如参考文章中讲的例子:
一次线上服务高 CPU 占用优化实践
关于Log4j2 下 KafkaAppender 异步的问题,这个是框架本身自带的问题,需要对其有一定的了解,以及可以进行相应的优化,从而降低cpu的占用资源。
Arthas 火焰图
Y轴是指调用的深度,A调用B,B调用C,C肯定是在最上面的,然后B,然后A
X轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多
性能问题可以找最顶,因为调用深度比较深,还有占用比例cpu比较多
以上是关于面试题--cpu高解决方案以及火焰图学习的主要内容,如果未能解决你的问题,请参考以下文章