【Debug】如果一個應用卡死了,如何去排查卡死的原因?

1、首先查詢是不是前端和網絡的問題,查看網絡通信狀態是不是正常

2、如果網絡沒有問題就去使用Linux的top命令查看CPU和內存的使用情況,如果CPU和內存佔用飆升則可能是出現了死鎖的情況。還要使用iostat命令來查看系統的IO情況,如果IO頻繁就說明MySQL的SQL語句優化不夠好,造成了大量對硬盤的寫入讀取操作。

3、如果有死鎖現象,則需要定位死鎖位置,先使用jinfo來查看所有的Java進程和進程ID,再使用jstack查看相應的進程運行狀態,裏面有各個進程的狀態,其中就有Blocking阻塞狀態,來查看是不是死鎖,裏面會寫上在代碼中的相應位置。

4、如果沒有出現死鎖的問題,我們再查看MySQL是不是出現問題,查看MySQL的錯誤日誌以及慢查詢日誌,看看有沒有特殊的報錯信息跟大量的慢查詢sql語句,然後用explain進行分析是不是大量sql沒有索引,引起全表掃描,造成系統卡頓。

5、進入數據庫,用show processlist查看正在執行的語句,看看有沒有特殊的信息。比如出現大量的鎖表語句,我這邊就是查到數據庫出現大量的鎖表語句出現,說大量的寫跟讀都是再同一張表上一邊沒進行完另一邊還在請求等待就造成死鎖。查看MySQL的是指就可以確定是不是數據庫出現了死鎖現象

6、如果CPU佔用沒有很高,則使用Jmap -dump 命令導出JVM快照信息,將快叫導入GC easy中,可以顯示GC情況,停頓時間大小,來判斷是不是因爲GC太頻繁導致系統卡死。在日誌中也會有內存地址的指向,可以用來定位具體是因爲哪個對象而導致頻繁GC,可以定位一些大對象,或者判斷是因爲年輕態太小,或者老年代太小等原因導致頻繁GC

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章