文章目录

  • 前言
  • 参考文章
  • 套路
  • 怎么优化
  • 查看相关占用cpu代码
  • Arthas 火焰图


前言

在很多面试题中,有个高频的:线上cpu很高的时候,怎么处理

参考文章

cvte厂的巨佬,摩拜一波

套路

  1. top拿到占用cpu比较高的进程
  2. top -HP拿到进程中的线程pid
  3. jastack 对应pid | grep pid转十六进制(或者自己去文件找)

怎么优化

根据打印出来的堆栈信息,进行分析,也可以使用火焰图进行优化对应代码

步骤

  1. java -jar arthas-boot.jar
  2. 会显示正在运行的jar
  3. 然后选择对应的数值,进行profiler
  4. 导出成svg

python profile 火焰图 jstack 火焰图_java

由于现在没有特定代码导致cpu问题,我们就拿写相对比较占用cpu的代码看看

火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。
截取自参考文章

查看相关占用cpu代码

python profile 火焰图 jstack 火焰图_python profile 火焰图_02


可以看到我们公司的代码很多调用这个类转换的方法,使用的是org.springframework.beans.BeanUtils#copyProperties(java.lang.Object, java.lang.Object, java.lang.Class<?>, java.lang.String…)

这个相对比较消耗性能的,怎么优化呢?

  1. BeanCopier的性能是PropertyUtils (apache-common)的504倍。
  2. PropertyUtils的性能是BeanUtils(apache-common)的1.71倍

再如参考文章中讲的例子:
一次线上服务高 CPU 占用优化实践

关于Log4j2 下 KafkaAppender 异步的问题,这个是框架本身自带的问题,需要对其有一定的了解,以及可以进行相应的优化,从而降低cpu的占用资源。

Arthas 火焰图

Y轴是指调用的深度,A调用B,B调用C,C肯定是在最上面的,然后B,然后A

X轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多

性能问题可以找最顶,因为调用深度比较深,还有占用比例cpu比较多

python profile 火焰图 jstack 火焰图_火焰图_03