最近生產環境中出現了一起CPU突然飆升的事件,下面介紹一下 CPU飆升問題排查的過程和解決方法。
該方案參考自:https://www.jianshu.com/p/e96c74133be6,感謝路遙Neo的分享
一、查看導致CPU飆升的線程
首先需要定位到是服務里的那些線程導致CPU飆升的。具體查找方法:
1、在服務器上通過命令行輸入 top 命令可以查到服務的進程號。
(輸入top回車,然后按下大寫M按照memory排序,按下大寫P按照CPU排序)
如上,占用CPU最多的進程ID是:18507
2、查到對應的進程號,通過top -H -p $pid,可以看到具體是哪個線程占用了CPU,記下該線程的id。
這里查詢結果列PID 就是線程ID 如上占用CPU最多的線程ID是: 18599
二、查看對應線程的java堆棧信息
1. 在服務器上 使用 jstack pid > /tmp/log.txt 命令查看線程堆棧信息
如:jstack 18507 > /tmp/log.txt
2. 根據線程id 查詢在日志文件中,查看堆棧信息
(由於堆棧日志 線程id是16進制的,所以需要先將10進制的線程id轉為16進制)
如 18599 的16 進制是 ox48a7,根據關鍵詞:nid=0x48a7 搜索日志