现在企业对后端开发的要求越来越高,不仅要求我们会写代码,还要我们能够进行部署和运维!
项目上线并运行一段时间后,可能会发现部署所在的Linux服务器CPU占用过高,该如何排查解决?
本文用5步带你搞定线上CPU占用过高的问题~
排查思路
- 如何观察Linux服务器CPU占比
- 如何定位到产生问题的Java代码所在线程,判断出当前问题线程到底在执行什么方法
top -H -p pid查看java占用率最高的几条线程
jstack pid > xxx.txt 打印线程快照
jmap -heap pid 查看堆内存情况
步骤一:top命令
首先需要找出哪个进程占用CPU高:
使用top命令列出系统各个进程的资源占用情况。
以上图为例,我们发现CPU占用高的进程pid为85。
步骤二:top -Hp pid
命令
虽然找到了占用 CPU 最高的进程 PID,但并不能直接就开始定位代码了,因为一个进程中有很多线程,不可能所有线程都占用了大量 CPU,所以我们现在要做的查看进程中的线程占用资源情况。执行top -Hp pid
命令,pid 就是上面我们排查出来的进程 PID:95
。
从上图可以看到目前占用 CPU 最多的进程的 PID 是 95,遥遥领先于其他线程。
步骤三:转换16进制
我们接下来的目的是获得 PID 95
这个线程的堆栈信息,然后根据堆栈信息定位代码。但是jstack命令需要的线程的PID的16进制值。所以需要通过 printf
命令将 PID 95 转化成 16 进制。
printf "%xn" 95
得到 16 进制的线程 PID 为 0x5f
。接下来就可以通过 jstack 命令查看堆栈信息了:
步骤四:打印线程堆栈信息
通过步骤三得到 16 进制的线程 PID 为 0x5f
。这样,就可以通过 jstack 命令查看堆栈信息了:
#jstack 进程 PID | grep '线程 16 进制 PID' -C20
jstack 85 | grep '0x5f' -C20
执行结果如下图所示:
步骤五:定位到具体业务方法
根据步骤四得到的堆栈信息,我们即可定位到具体业务方法。可以看到,定位到了 highCpuThread
线程中的代码,具体在第 15 行。
到这里导致服务器CPU占用量飙升的原因就被找到了,结合堆栈信息对代码进行相应的优化即可。
总结
通过本文应该让你对线上服务器CPU占用量过高的问题有了一定的了解和处理思路。在碰到类似的问题时就不用慌。