Linux中CPU占用率滿載問題排查


出現場景:

首先是收到雲上的測試項目突然出現了登陸不了的問題,所有的頁面都是空白,加載不出來.

 

 然后linux中的進行了top操作查看cpu使用情況:

 此時發現cpu已經的滿載的371%了.

排查過程:

 1.首先看了一下雲上tomcat的錯誤日志發現了這個錯誤:OutOfMemoryError: GC overhead limit exceeded

   總結了一下是jvm的內存溢出,當時我的代碼中有着許多的流操作,我第一時間懷疑的是流導致的內存溢出

 2.使用 printf "%x\n" 9673 打印對應進程的16進制代碼(雖然我后面的排查也沒有用上這個代碼)

  

 

 3.使用java虛擬機自帶的堆棧跟蹤工具 jstack 9673 > log.txt 打印jvm中的日志信息(建議sz到windows桌面看更直觀) 

   就是這個文件

 

   

 

 4.我看很多人都是使用進程16制的值搜索,更精確的搜索出對應的出錯位置,可是我發現這對我好像沒有什么幫助,我沒有找到具體的出錯位置.

   e.g:

   

 

   上面提到了我知道差不多是在哪個位置出現的問題,所以我直接使用了那個impl的名稱去搜索

   然后找到了關鍵所在

   

 

 5.之后重新閱讀了代碼發現因為邏輯太過復雜和繁瑣,有一處應該使用的map.replace(),測試時寫成了map.put()並且后來也沒有更正回來導致死循環.

    重新將代碼更正然后重新發布,不再出現問題.

留在最后:

也可以使用工具visualvm(性能分期)和工具tda.bat(網上看見有人推薦,可以打印出比jvm更詳細的日志方便閱讀),幫助排除錯誤,因為這次我碰到的錯誤比較低級也沒有那么復雜,所以也就不再過多深入了.

自己記錄一下,順便給碰到cpu滿載無從下手的朋友們參考一下.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM