面试官:生产环境中 CPU 利用率飙高怎么办?
生产环境中 CPU 利用率飙高的情况该如何排查?你是否在面试的时候也被问到过类似的问题呢?今天,我们就一起研究一下。
问题排查
让 CPU 燥起来
首先,我们需要让 CPU 燥起来。写一个死循环来疯狂占用 CPU 资源:
查看 CPU 运行情况
然后,运行上面这个小程序,再通过 top 命令来查看一下系统资源的使用情况:

图中灰色背景的 %CPU 字段就是我们需要关注的指标,它表示每个进程对于 CPU(单个核)占用的时间百分比。可以看到,我们的程序对 CPU 的占用率为 75.1%。
定位作妖的线程
接下来我们再进一步查看具体是哪个线程占用了过多的 CPU 资源。执行如下命令:
top -Hp 1683
H 代表查看线程视图,p 用来指定具体的进程 ID,上面的命令就是用来查看进程1683 中所有线程的执行情况。

可以看到,占用 CPU 最多的线程就是那个 while (true) 线程——cpu test。
找出问题所在
找到了作妖的线程以后,就好办了,接下来通过 jstack 命令就可以看到该线程的运行栈信息了。不过在此之前,需要先做一个进制转换:
将十进制的线程 ID(17706)转换成十六进制(452a)
有了十六进制的线程 ID 以后,就可以通过 jstack 命令来精确定位导致 CPU 飙高的代码了。

OK,我们找到了导致 CPU 飙高的「罪魁祸首」,在 CPU.class 的第 8 行:

以上就是开头那个问题的标准答案了。中小型公司可能会这样来处理,但是,大型公司基本上不会这样搞。第一,不会让你随便登录生产服务器;第二,服务器太多,这种方式根本管不过来。所以,一般都会有成体系的监控平台。
TOP 命令相关指标
top 命令除了查看 CPU 的使用情况外,还有很多很有用的信息。下面对这些指标做一个简要说明,供参考。
概要信息

当然任务(进程/线程)情况

CPU 资源使用情况

内存情况
物理内存

swap

进程/线程详情
