1、背景说明

针对项目中经常遇到的CPU占用告警问题问题排查的思路整理及相关工具的介绍。

2、问题说明

常见的CPU高占用问题,分为瞬时占用高和持续占用高2种情况???????

3、问题分析

3.1 第一步:定位占用CPU高的进程

使用Top命令确定是哪个进程占用了系统的大部分CPU,比较常见的是Smartbi的Tomcat进程占用资源最多的情况。

确定了是哪个进程占用了CPU后就需要分析是进程的哪一个线程占用了CPU。

3.2 第二步:定位消耗CPU高的代码逻辑

3.2.1 方法1 通过top查看CPU消耗

方法说明:

优势:不依赖任何外部工具,且在Smartbi无法页面访问时也能使用。

劣势:手动打命令转化慢,可能线程瞬间就运行完毕了,则无法捕捉到。

3.2.1.1 定位高占用线程

命令:top -Hbp pid | awk '/java/ && $9>50'

注:其中pid为Tomcat进程号

3.2.1.2 将高占用进程的线程号转换成16进制

命令:printf "%x\n" tid

注:其中tid为Tomcat线程号

3.2.1.3  jstack查看进程信息-定位到代码

命令:jstack pid | grep "xxx" -A 30

注:其中pid为Tomcat进程号,"xxx"为线程号的16进制码

3.2.2 方法2 通过listthread.jsp查看CPU消耗

方法说明:

优势:操作简单方便快捷。

劣势:必须Smartbi能访问时也能使用。

访问地址举例:http://proj.smartbi.com.cn:30001/smartbi/vision/monitor/listthreads.jsp 

加载此界面完成后Ctrl+S保存网页内容发回分析,可分析是哪个线程占用过高的CPU,线程的堆栈也可以看到。

3.2.3 方法3 通过基线Tomcat内置工具

优势:操作简单方便快捷,且在Smartbi无法页面访问时也能使用。

劣势:需要运行shell脚本,有些安全要求高的项目可能会被禁止。

工具地址:【内部】6.2_JVM和Tomcat调优配置基线

命令:./1_show-busy-java-threads.sh


4、项目案例

4.1 ETL导致的CPU占用告警

某项目反馈CPU使用率突然飙升,经排查发现是因为ETL执行引擎占用了较高的CPU

检查ETL配置发现执行引擎中配置了14核(一共16核)导致的问题,这个是ETL本身机制问题导致的。

注意:ETL运行原理是基于分配的CPU进行使用,如果job比较多且数据量大就会把所分配的CPU全部占用

ETL建议的CPU和内存比例为1:4 ,目前内存是32g,建议配置8核CPU。