问题排查


问题排查

如何排查 CPU 100% 问题?

1. 找到最耗 CPU 的进程

执行 top -c 命令按照 CPU 占比显示进程信息。

其中 -c 命令表示显示进程的启动命令行参数。

如图所示,CPU 占比最高的是 PID 为 15913 的进程。

2. 找到最高 CPU 的线程

执行 top -Hp 15913 显示进程的线程列表。

其中 -p 参数表示只显示指定进程的线程列表。

其中 -H 参数表示显示进程内的线程列表,如果没有这个参数,则不会显示线程内容。

如上图所示,在进程 15913 中,CPU 占用最高的线程是 15926 和 15927 这两个。

3. 将线程 TID 转化为 16 进制

使用 printf "%x\n" 10804 命令,将 PID 转为 16 进制。其实 printf 命令是一个 linux 命令。

第一个参数 "%x\n" 中的 %x 表示按照 16 进制小写显示,随后的 \n 表示换行符。第二个参数,表示要显示的数值,这里填了一个十进制数值。所以这行命令最终就是将这个十进制数,换成小写十六进制去显示。

如上图所示,15926 转成十六进制是 3e36。

因为在 jstack 导出的栈信息中,线程 PID 是以 16 进制显示的。

4. 查看堆栈信息

使用 jstack 15913 | grep '0x3e36' -C 30 定位到具体的代码行。其中 -C 参数是 grep 命令的参数,表示显示前后各 30 行的内容。

如上图所示,我们可以定位到 HighCpuController.java 类的第 16 行,这个正是我们设置 while 循环的地方。

参考资料:

上次编辑于: 2022/7/30 09:07:48