CPU飆高系統(tǒng)反應(yīng)慢怎么排查

首先CPU是整個電腦的核心計算資源,對于一個應(yīng)用程序來說CPU的最小執(zhí)行單元是線程,導(dǎo)致CPU飆高的原因有兩個方面。

第一個是CPU的上下文切換過多對CPU來說同一個時刻下每個CPU核心只能運行一個線程,如果有多個線程要去被執(zhí)行怎么辦,CPU只能通過上下文切換的方式來執(zhí)行調(diào)度不同的線程,上下文切換需要做兩個事情。第一個是保存運行中線程的執(zhí)行狀態(tài),第二個讓處于等待中的線程恢復(fù)執(zhí)行。這兩個過程需要CPU執(zhí)行內(nèi)核相關(guān)指令,去實現(xiàn)狀態(tài)的保存和恢復(fù),如果較多的上下文切換會占據(jù)大量的CPU資源從而使得CPU無法去執(zhí)行用戶進程中的真正指令導(dǎo)致響應(yīng)速度下降。在java中文件IO、網(wǎng)絡(luò)IO、鎖等待,這些都會去造成線程阻塞,而線程阻塞就會去導(dǎo)致CPU的上下文切換。

第二個是GPU資源過度消耗,也就是在程序中創(chuàng)建了大量的線程或者有線程一直占據(jù)GPU資源無法被釋放,比如說像死循環(huán)。CPU利用率過高之后導(dǎo)致應(yīng)用程序中的線程無法去獲得CPU的調(diào)度從而影響程序的執(zhí)行效率,所以既然是這兩個問題導(dǎo)致CPU利用率較高,于是我們可以通過‘top’命令,找到CPU利用率較高的進程,再通過’Shift+H‘找到進程中CPU消耗過高的線程。這里有兩種情況,第一種情況:CPU利用率過高的線程一直是同一個也就是線程ID沒有變化,說明在程序中存在長期占用CPU沒有釋放的一個情況,那么這種情況直接可以通過jstack獲得線程的Dump日志定位到線程目志后就可以找到問題的代碼。第二種情況:CPU利用率過高的線程ID不斷變化,那么說明線程創(chuàng)建過多需要去挑選幾個線程ID,通過jstack去線程dump中去進行排查,最后有可能定位的結(jié)果是程序正常,只是在CPU飆高的那一刻,用戶訪問量非常大導(dǎo)致系統(tǒng)資源不夠,那么這個時候我們需要采取的手段是去增加系統(tǒng)資源。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容