1.如何排查?找到病因
起因是因为阿里云突然给我发了一个短信

结果我用SSH一看,我靠怎么CPU占用99%,咋回事???

这个时候就该使用我之前在网上逛论坛学到的,线上CPU飙升100%如何排查大法了。
具体步骤如下:
- 使用Top命令定位具体进程 ->
java进程PID - 再使用Top命令(
top -H -p <PID>)定位具体的线程 ->找到占用最高的线程 ID - 进行进制转换(
printf "%x\n" ID) ->拿到十六进制 - 使用
jstack抓包(jstack <进程PID> | grep -A 20 <十六进制线程ID>) - 通过堆栈的
Java类名和行号,定位Bug然后进行解决。
为什么要进行进制转换?主要是因为:
Linux top 输出的是十进制
Java jstack 输出的是十六进制
那么就来实操一下:

可以看到Java进程占的cpu最多,说明问题出在Java进程上。

查询线程发现居然没有这个进程,这是怎么回事?再次使用top命令查询发现,Java进程的PID变了。

这是怎么一回事呢?可以看到 Java进程的TIME+,发现每次存活时间都只有十几秒钟,
这是因为进程在反复重启,并没有在稳定运行。这样的话我们原来的排查思路就行不通了,因为我们原来是依赖一个稳定长期存在的PID进行查询,现在进程不断重启,PID是变动的,自然用不了我上面的排查思路。
2.出师不利,如何解决?
既然常规方法解决不了,那么我们可以直接查看 Java项目的启动日志来定位问题所在,由于我的服务器使用的是宝塔进行部署的,保存了日志记录。检查发现:


原来是因为我之前写了一个分库分表的功能,但是要上线我把它关掉了(因为反正也没什么人会访问我的网站,而且当前数据量并不大,没有单表瓶颈),而且还排除了依赖。
|
|
但是我忘记把分库分表管理器给注释掉了!。导致一直初始化失败,而我把这个推送上去也没关注,现在才发现。。。修改后:

搞了半天是乌龙,也是无语了😐,不过也是一次有价值的尝试吧。。。
那么是什么原因导致CPU占满呢?大概是因为宝塔后台配置了自动重启,这会大量的消耗CPU。