开篇
在简书看到一篇公众号讲如何排查CPU问题,想了想在日常工作中也偶尔遇到这样的问题,所以在网上搜了搜该方面的文章,特意拷贝了一篇文章作日后排查参考。
整体来说是按照三步走:
- 1、top命令发现占用cpu最多的进程PID;
- 2、ps命令查看该进程下占用cpu最多的线程tid并转换为16进制;
- 3、jstack -l pid 保存进程堆栈并通过16进制的tid查找对应的代码块。
步骤
- 1、top命令发现某个进程占用了100%的CPU
![img_53af1437eb4c8de75ef01830cc1101be.png](https://i-blog.csdnimg.cn/blog_migrate/671ee3e24a37a15920f714d72fe4206d.png)
- 2、通过ps命令,进一步确定哪个进程出了问题
![img_bb26d04efb60b2876d50eafaaecbea1d.png](https://i-blog.csdnimg.cn/blog_migrate/b998cede6fea07e37cad9020bdaec11b.png)
- 3、再查看线程占用CPU的列表
ps -mp PID(进程号) -o THREAD,tid,time
说明:
-m Show threads after processes
![img_ca7c8d956438265aed3f310223663acd.png](https://i-blog.csdnimg.cn/blog_migrate/b9f7da114ef03b280718ed143b7f1b0a.png)
- 4、找到占用CPU最高的线程,查看TID,将其转换为16进制格式
printf "%x\n" TID
- 5、而后查看堆栈信息
jstack PID |grep 16进制TID -A 60
![img_63a52188bb87ceb6bb49f92483af60a3.png](https://i-blog.csdnimg.cn/blog_migrate/053898ce0366b314c9cfd50dd1c2b0e7.png)