CPU100%,怎么快速定位

275 阅读1分钟

微服务部署若干节点后,突然会收到监控服务的CPU异常告警,提示CPU使用率100%+。那应该如何快速定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,又是哪段代码导致的呢?

问题定位的步骤如下:

  • 找到CPU使用率较高的进程;
  • 找到CPU使用率最高的线程;
  • 查看堆栈信息,定位到相关代码;

模拟场景

编写死循环方法,模拟线上CPU过载问题场景。

public class Test {
    public static void main(String[] args) {
        String string = "";
        while (true){
            string.concat("abc");
        }
    }
}

步骤一、找到耗CPU的进程

  • 执行top -c,显示进程运行信息列表。

如上图 ,最耗CPU的进程PID为:6399

步骤二、找到耗CPU的线程

相关命令:top -Hp <进程PID>

  • top -Hp 6399,显示进程下线程运行信息列表。

如上图,最耗CPU的线程PID为:6400

步骤三、查看堆栈信息,定位相关代码

相关命令:jstack <进程PID> | grep '<16进制线程PID>' -C5 --color

  • printf "%x\n" 6400 ,查看线程PID的16进制。

如上图,6400对应的16进制是0x1900,在堆栈信息中,线程PID是用16进制表示的。

  • jstack 6399 | grep '0x1900' -C5 --color

如上图,定位到是“main”线程,代码是 Test.java 第5行异常导致。

到此,便可轻松定位并解决CPU100%问题。