Skip to content

CPU负载过高排查记录

解决线上微服务容器cpu占用100%问题(java进程占用100%问题)_容器cpu占用高_上树的蜗牛儿的博客-CSDN博客

平台发现问题

平台发现集群节点 node219 CPU利用率过高。

image.png

通过查看该节点下的 pod 发现,bookdemo 使用 CPU 过高。

image.png

主机排查

top 查看进程情况

使用 top 确认占用cpu过高的进程。

PID=17177 占用 CPU 最高。

查看进程 PID 对应的容器

由于该进程是个POD,需要找到对应容器,进入容器内部排查线程情况。

容器内部排查

top查看进程情况

可以看到 PID=1 进程使用CPU过高。

查看进程的线程资源情况

根据 PID = 1 查看该进程下的线程情况。

json
top -H -p1

可以看到有8个线程 CPU 使用率非常高。

jstack查看进程堆栈信息

json
jstack 17177

输出结果到文件

json
jstack 17177 > java.log

查看某个线程堆栈

比如查看线程 PID=1911 的堆栈。

堆栈里面的 id 是16进制,需要将拿到的 线程PID转换为16进制。比如 1911的16进制是 777。

十进制转换 - 在线进制转换器

可以看到堆栈信息中该线程的标识是 nid=0x777,可以根据该标识过滤。

json
cat java.log | grep 'nid=0x777' -C 10

可以看到代码关键位置,通过排查代码作进一步排查。

通过堆栈信息排查死锁

json
cat java.log |grep 'deadlock' -C 10

可以看到线程1 和 线程2 互相持有对方需要的锁,可以看到对应代码位置。

通过 lockId 可以快速查找该锁被谁持有。