線上CPU飆升100%問題排查

一、引子
對于互聯(lián)網(wǎng)公司奕锌,線上CPU飆升的問題很常見(例如某個活動開始衫贬,流量突然飆升時),按照本文的步驟排查歇攻,基本1分鐘即可搞定固惯!特此整理排查方法一篇,供大家參考討論提高缴守。

二葬毫、問題復(fù)現(xiàn)
線上系統(tǒng)突然運(yùn)行緩慢镇辉,CPU飆升,甚至到100%贴捡,以及Full GC次數(shù)過多忽肛,接著就是各種報警:例如接口超時報警等。此時急需快速線上排查問題烂斋。

三屹逛、問題排查
不管什么問題,既然是CPU飆升汛骂,肯定是查一下耗CPU的線程罕模,然后看看GC。

3.1 核心排查步驟

1.執(zhí)行“top”命令:查看所有進(jìn)程占系統(tǒng)CPU的排序帘瞭。極大可能排第一個的就是咱們的java進(jìn)程(COMMAND列)淑掌。PID那一列就是進(jìn)程號。

2.執(zhí)行“top -Hp 進(jìn)程號”命令:查看java進(jìn)程下的所有線程占CPU的情況蝶念。

3.執(zhí)行“printf "%x\n 10"命令 :后續(xù)查看線程堆棧信息展示的都是十六進(jìn)制抛腕,為了找到咱們的線程堆棧信息,咱們需要把線程號轉(zhuǎn)成16進(jìn)制媒殉。例如,printf "%x\n 10-》打拥5小:a,那么在jstack中線程號就是0xa.

4.執(zhí)行 “jstack 進(jìn)程號 | grep 線程ID” 查找某進(jìn)程下-》線程ID(jstack堆棧信息中的nid)=0xa的線程堆棧信息廷蓉。如果“"VM Thread" os_prio=0 tid=0x00007f871806e000 nid=0xa runnable”全封,第一個雙引號圈起來的就是線程名,如果是“VM Thread”這就是虛擬機(jī)GC回收線程了

5.執(zhí)行“jstat -gcutil 進(jìn)程號 統(tǒng)計間隔毫秒 統(tǒng)計次數(shù)(缺省代表一致統(tǒng)計)”苦酱,查看某進(jìn)程GC持續(xù)變化情況售貌,如果發(fā)現(xiàn)返回中FGC很大且一直增大-》確認(rèn)Full GC! 也可以使用“jmap -heap 進(jìn)程ID”查看一下進(jìn)程的堆內(nèi)從是不是要溢出了给猾,特別是老年代內(nèi)從使用情況一般是達(dá)到閾值(具體看垃圾回收器和啟動時配置的閾值)就會進(jìn)程Full GC疫萤。

6.執(zhí)行“jmap -dump:format=b,file=filename 進(jìn)程ID”,導(dǎo)出某進(jìn)程下內(nèi)存heap輸出到文件中敢伸〕度模可以通過eclipse的mat工具查看內(nèi)存中有哪些對象比較多。

3.2 原因分析

1.內(nèi)存消耗過大池颈,導(dǎo)致Full GC次數(shù)過多

執(zhí)行步驟1-5:

多個線程的CPU都超過了100%尾序,通過jstack命令可以看到這些線程主要是垃圾回收線程-》上一節(jié)步驟2
通過jstat命令監(jiān)控GC情況,可以看到Full GC次數(shù)非常多躯砰,并且次數(shù)在不斷增加每币。--》上一節(jié)步驟5
確定是Full GC,接下來找到具體原因:

生成大量的對象,導(dǎo)致內(nèi)存溢出-》執(zhí)行步驟6琢歇,查看具體內(nèi)存對象占用情況兰怠。
內(nèi)存占用不高梦鉴,但是Full GC次數(shù)還是比較多,此時可能是代碼中手動調(diào)用 System.gc()導(dǎo)致GC次數(shù)過多揭保,這可以通過添加 -XX:+DisableExplicitGC來禁用JVM對顯示GC的響應(yīng)肥橙。
2.代碼中有大量消耗CPU的操作,導(dǎo)致CPU過高秸侣,系統(tǒng)運(yùn)行緩慢存筏;

執(zhí)行步驟1-4:在步驟4jstack,可直接定位到代碼行味榛。例如某些復(fù)雜算法椭坚,甚至算法BUG,無限循環(huán)遞歸等等励负。

3.由于鎖使用不當(dāng)藕溅,導(dǎo)致死鎖。

執(zhí)行步驟1-4: 如果有死鎖继榆,會直接提示巾表。關(guān)鍵字:deadlock.步驟四,會打印出業(yè)務(wù)死鎖的位置略吨。

造成死鎖的原因:最典型的就是2個線程互相等待對方持有的鎖集币。

4.隨機(jī)出現(xiàn)大量線程訪問接口緩慢。

代碼某個位置有阻塞性的操作翠忠,導(dǎo)致該功能調(diào)用整體比較耗時鞠苟,但出現(xiàn)是比較隨機(jī)的;平時消耗的CPU不多秽之,而且占用的內(nèi)存也不高当娱。

思路:

首先找到該接口,通過壓測工具不斷加大訪問力度考榨,大量線程將阻塞于該阻塞點跨细。

執(zhí)行步驟1-4:

"http-nio-8080-exec-4" #31 daemon prio=5 os_prio=31 tid=0x00007fd08d0fa000 nid=0x6403 waiting on condition [0x00007000033db000]
java.lang.Thread.State: TIMED_WAITING (sleeping)-》期限等待
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
at com.*.user.controller.UserController.detail(UserController.java:18)-》業(yè)務(wù)代碼阻塞點

如上圖,找到業(yè)務(wù)代碼阻塞點河质,這里業(yè)務(wù)代碼使用了TimeUnit.sleep()方法冀惭,使線程進(jìn)入了TIMED_WAITING(期限等待)狀態(tài)。

5.某個線程由于某種原因而進(jìn)入WAITING狀態(tài)掀鹅,此時該功能整體不可用散休,但是無法復(fù)現(xiàn);

執(zhí)行步驟1-4:jstack多查詢幾次乐尊,每次間隔30秒戚丸,對比一直停留在parking 導(dǎo)致的WAITING狀態(tài)的線程。例如CountDownLatch倒計時器扔嵌,使得相關(guān)線程等待->AQS->LockSupport.park()限府。

"Thread-0" #11 prio=5 os_prio=31 tid=0x00007f9de08c7000 nid=0x5603 waiting on condition [0x0000700001f89000]
java.lang.Thread.State: WAITING (parking) ->無期限等待
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304)
at com..SyncTask.lambdamain0(SyncTask.java:8)-》業(yè)務(wù)代碼阻塞點
at com.
.SyncTask$$Lambda$1/1791741888.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)

原文鏈接:https://blog.csdn.net/m0_55849656/article/details/125234508

另:jstack命令詳解 https://zhuanlan.zhihu.com/p/475571849

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猴鲫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谣殊,更是在濱河造成了極大的恐慌拂共,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姻几,死亡現(xiàn)場離奇詭異宜狐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蛇捌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門抚恒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人络拌,你說我怎么就攤上這事俭驮。” “怎么了春贸?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵混萝,是天一觀的道長。 經(jīng)常有香客問我萍恕,道長逸嘀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任允粤,我火速辦了婚禮崭倘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘类垫。我一直安慰自己司光,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布悉患。 她就那樣靜靜地躺著残家,像睡著了一般。 火紅的嫁衣襯著肌膚如雪购撼。 梳的紋絲不亂的頭發(fā)上跪削,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天谴仙,我揣著相機(jī)與錄音迂求,去河邊找鬼。 笑死晃跺,一個胖子當(dāng)著我的面吹牛揩局,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掀虎,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼凌盯,長吁一口氣:“原來是場噩夢啊……” “哼付枫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起驰怎,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤阐滩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后县忌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掂榔,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年症杏,在試婚紗的時候發(fā)現(xiàn)自己被綠了装获。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡厉颤,死狀恐怖穴豫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逼友,我是刑警寧澤精肃,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站帜乞,受9級特大地震影響肋杖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挖函,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一状植、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怨喘,春花似錦津畸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至梳庆,卻和暖如春暖途,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膏执。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工驻售, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人更米。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓欺栗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子迟几,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容