微服务部署若干节点后,突然会收到监控服务的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%问题。