系统 CPU 突然飙升且 GC 频繁,如何排查
參考:https://mp.weixin.qq.com/s/g8KJhOtiBHWb6wNFrCcLVg
對于線上系統突然產生的運行緩慢問題,如果該問題導致線上系統不可用,那么首先需要做的就是,導出jstack和內存信息,然后重啟系統,盡快保證系統的可用性。
這種情況可能的原因主要有兩種:
-
代碼中某個位置讀取數據量較大,導致系統內存耗盡,從而導致Full GC次數過多,系統緩慢;
-
代碼中有比較耗CPU的操作,導致CPU過高,系統運行緩慢;相對來說,這是出現頻率最高的兩種線上問題,而且它們會直接導致系統不可用。
另外有幾種情況也會導致某個功能運行緩慢,但是不至于導致系統不可用:
-
代碼某個位置有阻塞性的操作,導致該功能調用整體比較耗時,但出現是比較隨機的;
-
某個線程由于某種原因而進入WAITING狀態,此時該功能整體不可用,但是無法復現;
-
由于鎖使用不當,導致多個線程進入死鎖狀態,從而導致系統整體比較緩慢。
對于這三種情況,通過查看CPU和系統內存情況是無法查看出具體問題的,因為它們相對來說都是具有一定阻塞性操作,CPU和系統內存使用情況都不高,但是功能卻很慢。
小結
本文主要講解了線上可能出現的五種導致系統緩慢的情況,詳細分析了每種情況產生時的現象,已經根據現象我們可以通過哪些方式定位得到是這種原因導致的系統緩慢。
簡要的說,我們進行線上日志分析時,主要可以分為如下步驟:
-
通過?top命令查看CPU情況,如果CPU比較高,則通過?top-Hp命令查看當前進程的各個線程運行情況,找出CPU過高的線程之后,將其線程id轉換為十六進制的表現形式,然后在jstack日志中查看該線程主要在進行的工作。這里又分為兩種情況
-
如果是正常的用戶線程,則通過該線程的堆棧信息查看其具體是在哪處用戶代碼處運行比較消耗CPU;
-
如果該線程是?VMThread,則通過?jstat-gcutil命令監控當前系統的GC狀況,然后通過?jmapdump:format=b,file=導出系統當前的內存數據。導出之后將內存情況放到eclipse的mat工具中進行分析即可得出內存中主要是什么對象比較消耗內存,進而可以處理相關代碼;
-
如果通過?top?命令看到CPU并不高,并且系統內存占用率也比較低。此時就可以考慮是否是由于另外三種情況導致的問題。具體的可以根據具體情況分析
-
如果是接口調用比較耗時,并且是不定時出現,則可以通過壓測的方式加大阻塞點出現的頻率,從而通過?jstack查看堆棧信息,找到阻塞點;
-
如果是某個功能突然出現停滯的狀況,這種情況也無法復現,此時可以通過多次導出?jstack日志的方式對比哪些用戶線程是一直都處于等待狀態,這些線程就是可能存在問題的線程;
-
如果通過?jstack可以查看到死鎖狀態,則可以檢查產生死鎖的兩個線程的具體阻塞點,從而處理相應的問題。
?
?
?
?
總結
以上是生活随笔為你收集整理的系统 CPU 突然飙升且 GC 频繁,如何排查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: log4j.xml配置文件
- 下一篇: Intellij IDEA 2019 自