问题排查
问题排查
如何排查 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 循环的地方。
参考资料: