面对CPU狂飙时的5步解决方案

现在企业对后端开发的要求越来越高,不仅要求我们会写代码,还要我们能够进行部署和运维!
项目上线并运行一段时间后,可能会发现部署所在的Linux服务器CPU占用过高,该如何排查解决?

本文用5步带你搞定线上CPU占用过高的问题~

排查思路

  • 如何观察Linux服务器CPU占比
  • 如何定位到产生问题的Java代码所在线程,判断出当前问题线程到底在执行什么方法
top -H -p  pid查看java占用率最高的几条线程
jstack pid >  xxx.txt   打印线程快照
jmap -heap pid   查看堆内存情况

步骤一:top命令

首先需要找出哪个进程占用CPU高:
使用top命令列出系统各个进程的资源占用情况。

面对CPU狂飙时的5步解决方案_第1张图片

以上图为例,我们发现CPU占用高的进程pid为85。

步骤二:top -Hp pid命令

虽然找到了占用 CPU 最高的进程 PID,但并不能直接就开始定位代码了,因为一个进程中有很多线程,不可能所有线程都占用了大量 CPU,所以我们现在要做的查看进程中的线程占用资源情况。执行top -Hp pid命令,pid 就是上面我们排查出来的进程 PID:95

面对CPU狂飙时的5步解决方案_第2张图片

从上图可以看到目前占用 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

执行结果如下图所示:
面对CPU狂飙时的5步解决方案_第3张图片

步骤五:定位到具体业务方法

根据步骤四得到的堆栈信息,我们即可定位到具体业务方法。可以看到,定位到了 highCpuThread 线程中的代码,具体在第 15 行。

到这里导致服务器CPU占用量飙升的原因就被找到了,结合堆栈信息对代码进行相应的优化即可。

总结

通过本文应该让你对线上服务器CPU占用量过高的问题有了一定的了解和处理思路。在碰到类似的问题时就不用慌。

你可能感兴趣的:(其他,java,开发语言)