龙空技术网

性能优化-CPU使用率优化实战,让面试官都为你点赞

大禹的足迹 790

前言:

当前各位老铁们对“服务器cpu使用率多少合适”可能比较关注,小伙伴们都想要分析一些“服务器cpu使用率多少合适”的相关内容。那么小编也在网上收集了一些对于“服务器cpu使用率多少合适””的相关内容,希望看官们能喜欢,各位老铁们快快来了解一下吧!

背景介绍

2020年双十一作为阿里云高可用架构师为客户重保期间,客户反映有个应用CPU使用率通常在70%上下,高峰时期到达80%上下,希望分析解决一下。

经过沟通,该应用消费metaq消息,处理后将数据存储到MySQL数据库中;依赖的服务有MQ、Redis、RDS。初步判断:不属于计算密集型应用,不应该CPU利用率这么高。

解决方法方法一示例top/jps -v,查找进程IDtop -H -p <pid>,查找CPU使用率高的线程IDprintf "%x" <thread_id>,将十进制的线程ID转换为16进制jstack <pid>,dump进程pid堆栈信息从堆栈信息中找到相应的线程,进而分析业务代码来定位问题备注这种方法较适合定位程序存在明显BUG的情况,由于只是抓取线程一个时刻的快照,并不适合性能问题的排查。useful-scripts/java.md at dev-2.x · oldratlee/useful-scripts · GitHubSmart Java thread dump analyzer - thread dump analysis in seconds方法二

perf/FlameGraph

示例

JVM参数增加:-XX:+PreserveFramePointer

1.install perf-map-agent

图1 安装perf-map-agent

2.profiling and flame graph generation

图2 抓取热点&可视化展示

CPU Flame Graphs-Java(),相比于专门针对Java的profiler,操作略复杂。

方法三

JMC(Java Mission Control)/JFR(Java Flight Recorder)

安装下载【Java Downloads | OracleMenu:Java SE Development Kit 11 Downloads】并安装下载【Java Downloads | OracleMenu:JDK Mission Control (JMC)】并安装示例

JVM参数增加:-XX:+UnlockCommercialFeatures -XX:+FlightRecorder

jcmd <pid> JFR.start name=abc settings=profile duration=120sjcmd <pid> JFR.stop name=abc filename=./abc.jfr将生成的jfr文件导入到JMC中备注

优点:丰富的系统监控指标

缺点:在Oracle JDK上属于商业特性,在JDK11该特性已开源出来。在AJDK 8已经集成进来,AJDK8.5.10新功能——Java飞行记录器。

其他:arthas 也已经继承了JFR的能力,详情见:

方法四示例thread -n <num>

使用arthas的thread,比【方法一】方便了很多,对于分析问题还是不够方便而且不够准确。

方法五示例

使用arthas profiler抓取ON-CPU热点堆栈数据。

profiler startprofiler stop

分析热点堆栈数据,可以发现下面图中画红框的地方存在问题:

图3 热点火焰图

初步结论

XXXX.java中调用Thread.currentThread().getStackTrace()引起CPU利用率升高的原因。

结论验证

图4 JMH微基准性能测试

【执行Thread.currentThread().getStackTrace()】与【不执行Thread.currentThread().getStackTrace()】基准数据

图5 基准数据差异

问题定位

业务方使用的是基础部门封装的日志框架,每次打印日志都会调用XXXX.java中的formatMsg方法,formatMsg方法使用了Thread.currentThread().getStackTrace(),从而浪费了CPU了。

图6 定位热点代码

标签: #服务器cpu使用率多少合适