线上cpu 100%排查过程

线上cpu 100%排查过程

目录

线上cpu 100%排查过程

一、模拟死循环

 二、排查

1. 使用top命令,查看进程情况。

2. 使用 top -Hp pid 查看某进程的线程情况

3. 使用jvm指令 jstack -l pid 查看虚拟机当前时刻的堆栈快照。

四.排查代码


一、模拟死循环

首先模拟一个死循环,然后调用该接口。 

@RestController
public class AController {

    @GetMapping("/add")
    public void add(){
        int i = 0;
        while (true){
            i++;
        }
    }
}

发现cpu占用率一直保持在100%左右。

线上cpu 100%排查过程_第1张图片

 二、排查

1. 使用top命令,查看进程情况-》定位高占用cpu进程。

 在linux使用 top 命令经常用来监控Linux的系统状况,比如每个进程cpu、内存的使用情况。可以看到java命令的那个pid为50839的进程cpu利用率最高达到了90%左右,并且一直长时间高占用cpu。

线上cpu 100%排查过程_第2张图片

2. 使用 top -Hp pid 查看某进程的线程情况-》定位高占用cpu线程

线上cpu 100%排查过程_第3张图片

可以发现 pid 为50601的线程占用cpu资源。

将 50601转化为16进制为 c991。

3. 使用jvm指令 jstack -l pid 查看虚拟机当前时刻的堆栈快照-》定位代码。

会打印除当前时刻的堆栈快照如下所示。贴了一部分。

线上cpu 100%排查过程_第4张图片

此时我们应该寻找 nid=0xc991的线程,这个nid就是我们第二步中找出的占cup最多的线程pid的16进制。

线上cpu 100%排查过程_第5张图片

可以看出AController类中的add方法一直处于运行状态,行号为20行。

四.排查代码

线上cpu 100%排查过程_第6张图片

20行代码出现死循环,导致cpu高占用率。解决代码问题,问题解决。 

 

 

 

 

 

你可能感兴趣的:(线上cpu 100%排查过程)