java cpu过高排查_论线上如何排查一次CPU100%的情况
記錄如何排查CPU100%問題。
當我們把服務發布到服務器器,可能會因為一些問題造成我們的服務器CPU被打滿甚至超過100%,那如果我們想知道到底上在做什么操作導致CPU持續過高呢?因為在線上,我們只能通過日志看問題,或者排查到哪個進程或者哪個線程持續占用CPU。然后才能找到具體問題在哪里才能進行解決。
所以這里我們模擬一個死循環導致CPU過高的情況,然后如何快速的找到問題在哪。
問題代碼案列
我們這里只是寫了一段死循環的代碼,我們把它放到服務器上門直接用java命令跑起來。
public在服務拍起來可以看到不斷的在打印
不過在服務器上,如果只是一個死循環,其實上用不了多少CPU的,我們就假設這是一個有問題的代碼。
排查問題
查找進程
當發現CPU過高之后,首先我們要找出哪個進程占用了CPU。我們可以使用top命令
top -c在顯示模式下,然后我們可以通過切換到大寫,不斷的按大寫P就能進行排序,找到最大的CPU看看上哪個進程。
可以看到進程PID 為 26045的消耗最高。
查找線程
我們已經找到了哪個進程最消耗CPU了,接下來,我們當然要找到該進程下,哪個線程CPU消耗最高咯。這里的進程PID是26045,使用命令
top -Hp PID 顯示進程PID下所有的線程到此我們已經定位到線程了,接下來我們就該用上jvm的命令工具了。
定位問題代碼
定位到線程26046消耗CPU最高,但是這里我們需要將26046這個線程轉為16進制的。因為jvm的進程快照中線程顯示是16進制的。
然后我們使用jstack命令,拉到26045進程快照信息,輸出到文件中,方便我們查看。
jstack -l 26045 > ./26045.stack然后我們cat該文件,并且grep通過16進制找一下該線程
cat 26045.stack | grep '65be' -C 20至此我們就已經找到了問題代碼在哪了。接下來的事情就是去分析代碼為啥有問題咯,完美收公。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java cpu过高排查_论线上如何排查一次CPU100%的情况的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git 使用_Git使用总结
- 下一篇: 两个不同的进程 虚拟地址相同_记一次阿里