一個load過高的故障排查案例

現象: 6臺4核機器load 全部在30以上,cpu使用us在90%, mem使用在90%,swap使用了100K,機器緩慢,前臺瀏覽器頁面打開緩慢,超時後白屏。
措施: top, shift+h ,shift + p, 找出消耗cpu時間最多的線程ID,dump 堆棧信息,找到該線程,看在做什麼,發現有多個線程在執行同一個方法。該方法內有一個循環,從一個node節點向上找其父節點,並不斷將該節點數據放入List,猜測該節點的父節點ID肯定與該節點形成死循環了,導致while不能跳出。修改代碼限制向上尋找的層級,達到一定數量後,從循環中跳出,重新發布後,問題解決。


總結:1,排查cpu消耗類故障方法。
1)top shift+h shift+p ,找到java 進程編號,在列出所有線程按cpu消耗排序,找到執行時間最長的線程ppid。
2)java/bin/jstack PID > /tmp/jstack.log 導出堆棧信息。
3)將10進制的PID轉換成16進制(a-f字符要小寫),在該文件中尋找該16進制的PPID,並查看該線程堆棧信息,看這些線程在做什麼。
4)找到堆棧中對應代碼查看,是否有消耗cpu的大循環,修改,發佈會解決問題。
2,同時,如果內存消耗過大導致頻繁full gc,可以按照如下方法排查:
1)使用jmap dump jvm內存到指定目錄,可引起full GC , 慎重操作。
2)使用ftp或其他方法,將文件拉到本地機器。使用mat,分析堆內存,利用leak suspect找出可能的內存泄漏。

發佈了90 篇原創文章 · 獲贊 2 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章