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