应用cpu高排查流程
现象
【Firing】- 应用异常告警
1. 容器CPU使用率超过50%
应用名称: 权限中心
产品: 业务中台-bPaaS/权限中心
用户: xxxx@ufida.com
ID[环境]:online-iuap-apcom-auth[online]
报警信息: 应用[online-iuap-apcom-auth-7b74d9d7f6-dkx22]CPU使用率偏高(当前93.59%)
开始时间: 2021-06-26 02:06:29
分析步骤
1、如果镜像中有arthas则使用arthas。
2、如果没有arthas,服务能正常访问外网则下载arthas。下载地址如下
wget https://alibaba.github.io/arthas/arthas-boot.jar
3、下载完成后按照arthas的使用办法。
4、如果容器中没有,网络和外网是隔离的则按照标准的jvm命令进行分析。
通过Arthas分析CPU场景
-
启动arthas
java -jar /user/local/bin/arthas-boot.jar
-
查看占用cpu高的四个线程
thread -n 4
显示的前4个线程,如果线程name中有GC字样则按照内存排查。如果有arthas开头则不用关心,一定要找到业务线程并且是runnable的线程,找到以后分析堆栈中找到com.yonyou.xxx 相关的类进行分析。有时候需要多尝试执行几次命令
定位到具体的类,可以jad反编译查看源码定位问题。
-
查询完成后退出arthas
stop 或者 quit
标准JVM命令分析
-
使用jps命令找到占用CPU高的进程编号
jps -mv
-
找到占用cpu最高的线程
top -Hp pid
-
通过 printf “%xn” tid 将需要的线程 ID 转换为 16 进制格式。
-
通过 jstack 命令打印线程的堆栈信息
jstack pid |grep 0xtid -A 30
找到线程之后,如果线程中有gc字样则说明是内存问题,操作如下:
-
查看grafana监控进入到容器详情监控。
-
如过cpu使用率高, 首先排查是不是频繁的fullgc导致的cpu高
jstat -gcutil pid 1000 20
-
如果是java old区满了, 导致的CPU高, 具体解决方法详见应用内存高排查