目录
- 一、排查方案与思路
- 二、总结
一、排查方案与思路
1.一般我们查看 CPU 的使用情况,可以使用 TOP
命令:
top
执行结果如下所示,这里就可以按照 CPU 使用率进行排序。
2.通过 top 命令查看后,可以查看是哪一个 Java 进程占用 CPU 较高,上图所示的进程为:2266,CPU 的使用率是 90%,也就是接近占用了 1核的 CPU。
接下来,我们就需要定位到项目中具体是哪一行代码导致的这个问题。我们项目中这么多代码,该怎么排查呢?其实我们项目中的代码虽然多,但都是在线程中运行的,我们只需要找到对应的线程就能去定位这个问题了。
获取当前进程中的线程,我们可以使用如下命令:
ps H -eo pid,tid,%cpu | grep <pid>
执行结果如下所示:
这个执行结果中就展示了当前进程中所有线程占用 CPU 的情况了。可以看到,其中倒数第 2 个线程占用的 CPU 使用率比较高,这个就是我们要找的线程了。
然后我们还没有办法直接去查线程的情况,需要先使用之前介绍过的 jstack
命令来继续查看进程对应的线程情况:
jstack <pid>
执行之后,就会把当前进程对应的所有线程打印出来:
但是这么多线程,我们怎么才能找到具体是哪一个线程出了问题呢?我们还需要进一步地进行筛选。
刚才我们已经通过 ps 命令找到了 2276 线程消耗的 CPU 使用率比较高。这里面的 2276 是一个十进制的数字,我们使用 jstack 打印的线程ID 都是十六进程的,所以说我们需要进行一次转换:将十进制转换成十六进制。Linux 命令就可以支持,我们可以执行如下命令:
printf "%x\n" 2276
执行结果:
这样我们就得到了十六进制的线程ID,然后我们再根据 8e4 去刚才使用 jstack 命令打印的线程信息中进行查找:
找到对应的线程信息后,我们从线程信息中可以看出,在 Application.java 类中的第 9 行出现了问题。来到具体的代码中,我们可以看到:
代码中进行了一个死循环轮询,这就是导致 CPU 飙升的原因。
二、总结
CPU飙高的排查方案和思路:
- 通过 top 命令查看占用 cpu 的情况。
- 通过 top 命令查看后,可以查看是哪一个进程占用 cpu 较高。
- 使用 ps 命令查看进程中的线程信息。
- 使用 jstack 命令查看进程中哪些线程出现了问题,最终定位问题。
整理完毕,完结撒花~????