一次线上 CPU 打满故障,如何 2 分钟定位?

CPU 打满故障

在生产环境中,CPU 突然被打满会直接影响服务可用性与用户体验。

一次线上 CPU 打满故障,如何 2 分钟定位?-mikechen

要在两分钟内完成定位,需要有条理的思路、预先准备的工具与清晰的优先级判断。

 

如何 2 分钟定位?

一次线上 CPU 打满故障,如何 2 分钟定位?-mikechen

第 1 步:定位耗 CPU 的进程 (30秒)
直接使用 top 命令查看系统资源,找出 CPU 占用率最高的进程。

命令:top

关键看点:输入 top 后,按大写 P 让进程按 CPU 使用率排序。记录下该进程的 PID。

第 2 步:定位耗 CPU 的线程 (30秒)
我们需要进入进程内部,看看到底是哪个线程在“作妖”。

命令:top -Hp <PID>

解释:-H 表示显示线程,-p 指定进程号。

关键看点:你会看到一堆线程。记录下排在最前面的线程 TID(它是十进制的)。

第 3 步:转换线程 ID 为十六进制 (10秒)
因为 Java 堆栈信息(jstack)中的线程 ID 是用十六进制(nid)表示的,所以需要转换。

命令:printf “%x\n” <TID>

示例:如果 TID 是 1024,输出就是 400。

第 4 步:在堆栈信息中锁定代码 (50秒)
使用 jstack 打印出线程快照,通过刚才的十六进制 ID 搜索。

命令:jstack <PID> | grep <十六进制TID> -A 30

关键看点:

业务线程状态为 RUNNABLE:grep 出来的代码行即为正在疯狂执行的逻辑(如死循环、复杂计算)。

线程名为 VM Thread 或 GC task thread:说明是频繁 Full GC 导致的 CPU 飙高。

评论交流
    说说你的看法