线上cpu 100%排查过程
目录
3. 使用jvm指令 jstack -l pid 查看虚拟机当前时刻的堆栈快照。
一、模拟死循环
首先模拟一个死循环,然后调用该接口。
@RestController
public class AController {
@GetMapping("/add")
public void add(){
int i = 0;
while (true){
i++;
}
}
}
发现cpu占用率一直保持在100%左右。
二、排查
1. 使用top命令,查看进程情况-》定位高占用cpu进程。
在linux使用 top 命令经常用来监控Linux的系统状况,比如每个进程cpu、内存的使用情况。可以看到java命令的那个pid为50839的进程cpu利用率最高达到了90%左右,并且一直长时间高占用cpu。
2. 使用 top -Hp pid 查看某进程的线程情况-》定位高占用cpu线程
可以发现 pid 为50601的线程占用cpu资源。
将 50601转化为16进制为 c991。
3. 使用jvm指令 jstack -l pid 查看虚拟机当前时刻的堆栈快照-》定位代码。
会打印除当前时刻的堆栈快照如下所示。贴了一部分。
此时我们应该寻找 nid=0xc991的线程,这个nid就是我们第二步中找出的占cup最多的线程pid的16进制。
可以看出AController类中的add方法一直处于运行状态,行号为20行。
四.排查代码
20行代码出现死循环,导致cpu高占用率。解决代码问题,问题解决。