top+jstack查找線上CPU占用最高的線程

1 場景

通過linux的top命令jdk的jstack命令來排查當前系統(tǒng)CPU占用最多的線程跑揉。

2 步驟

主要步驟如下圖:


1621513211543.png

2.1 測試代碼

SpringBoot中寫一個死循環(huán)

// package com.sa.jvm.admin.controller;
/**
 * 死循環(huán)測試
 */
@Controller
@RequestMapping("/infiniteLoop")
public class PowerController {
    @RequestMapping("test")
    public String test() {
        while (1 == 1) {
            System.out.println(new Random().nextInt(1000));
        }
    }   
}

當前訪問此請求路徑(/infiniteLoop/test)時啃勉,CPU將飆升。

發(fā)起請求后随闺,控制臺將無限輸出1000以內(nèi)的隨機數(shù)日川,如下:

http://192.168.0.11:8080/infiniteLoop/test

2.2 排查問題

(1)查找CPU占用最高的進程

linux系統(tǒng)中輸入如下命令,查看CPU占用最高的進程

top -c
1621426435098.png

如圖所示矩乐,PIP為3147的java進程的CPU占比最高龄句。此處已經(jīng)定位到有問題的進程PID為3147。

top -c含義:

每隔5秒顯式進程的資源占用情況绰精,并顯示進程的命令行參數(shù)(默認只有進程名)

另外TOP模式下,常用交互命令如下:

命令 說明
P 以 CPU 占用率大小的順序排列進程列表
M 以內(nèi)存占用率大小的順序排列進程列表

(2)查看進程中CPU占比最高的線程

已經(jīng)找到CPU占比最高的進程透葛,ID為3147笨使,繼續(xù)查找此進程對應的線程信息

linux系統(tǒng)中輸入如下命令僚害,查找指定進程中硫椰,CPU占用最高的線程

top -H -p 3147
1621426952921.png

如圖所示,該進程中CPU占比最高的進程的PID為:3168萨蚕,此處已經(jīng)定位到有問題的線程PID為3168靶草。

linux中通過如下命令,將線程的PID轉(zhuǎn)為小寫16進制岳遥。

printf '%x\n' 3168

得到16進制的線程ID為:c60

(3)導出進程堆棧信息

此處我們得到有問題的進程為3147奕翔,有問題的線程ID的16進制為c60

先使用jdk的jstack命令根據(jù)線程PID導出對應的線程棧信息浩蓉。

jstack 3147

此命令會輸出此java進程中的所有的線程棧信息派继,我們通過有問題的線程的16進制PID查找問題線程對應的棧信息宾袜。

可以使用如下命令進行線程棧信息過濾

jstack 3147 | grep c60 -A 50

或j將線程棧信息重定向到文件中,再進行查詢:

jstack 3147 > jstack.log

得到查詢結(jié)果如下:

1621427894361.png

如圖所示驾窟,此CPU占用主要為輸出打印內(nèi)容導致的CPU占用庆猫,有問題的代碼為:

at com.sa.jvm.admin.controller.PowerController.test(PowerController.java:18)

我們查看源碼,進行問題定位:

有問題的代碼第18行如下绅络,此時已經(jīng)定位到問題的代碼月培,和我們模擬的死循環(huán)代碼一致:

1621428181489.png

3 服務器CPU使用率高的情況

服務器CPU使用率高的情況,除了以上的業(yè)務代碼外恩急。此處對可能出現(xiàn)的原因進行分析杉畜。

3.1 CAS

使用AtomicIntegerCountdownLatch基于CAS的相關類時或者自己實現(xiàn)CAS時假栓,當值修改失敗時寻行,會一直高速循環(huán)

解決方案:

(1)限制重試次數(shù)

(2)間隔一段時間后重試

3.2 程序死循環(huán)

如本文的案例匾荆,當業(yè)務代碼出現(xiàn)死循環(huán)無法跳出的情況時拌蜘,會長時間大量占用CPU。

解決方案:

在代碼級別進行控制牙丽,保證代碼質(zhì)量和健壯性简卧,流程代碼需有退出循環(huán)的條件

3.3 tomcat并發(fā)量太高

tomcat默認線程池數(shù)量200烤芦,一般不會更改為太高举娩,大多數(shù)的請求都是快速響應

并發(fā)請求數(shù)暴增构罗,超過tomcat的負載能力后铜涉,web容器中會堆積大量的請求,會占用過多的CPU資源導致響應慢和卡頓遂唧。

解決方案:

(1)限流芙代、進行請求數(shù)量的控制

(2)負載均衡

(3)處理相應慢的請求業(yè)務代碼......

3.4 服務器被攻擊

當前服務器的端口被攻擊后(如redis的6379端口)。

如何排查:

查看服務器網(wǎng)路的帶寬情況和非法程序

解決方案:

(1)更改程序的通用端口為其他端口盖彭,防止被攻擊

(2)運行環(huán)境纹烹,盡量使用同一的局域網(wǎng),只對外部暴露可供訪問的程序端口召边。如使用阿里云等環(huán)境铺呵,需盡量使用同一的云環(huán)境,環(huán)境中的服務可通過局域網(wǎng)的方式訪問隧熙。

3.5 java虛擬機GC頻繁

當java虛擬機頻繁GC時片挂,根據(jù)本文的方法,查找到的CPU占用高的線程是JVM的GC線程,沒有對應的業(yè)務代碼宴卖,無法定位業(yè)務代碼滋将。

解決方案:

(1)加大堆內(nèi)存(臨時解決

(2)生成堆dump,通過MAT或jprofile排查大對象產(chǎn)生的代碼症昏。一般生產(chǎn)環(huán)境随闽,不會允許進行堆dump,此種情況肝谭,可以考慮使用本文的方法掘宪,查找僅CPU占用率前幾的線程棧信息或者CPU執(zhí)行時間前幾的線程棧信息

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載攘烛,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者魏滚。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坟漱,隨后出現(xiàn)的幾起案子鼠次,更是在濱河造成了極大的恐慌,老刑警劉巖芋齿,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腥寇,死亡現(xiàn)場離奇詭異,居然都是意外死亡赦役,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門栅炒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掂摔,“玉大人赢赊,你說我怎么就攤上這事乙漓。” “怎么了释移?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵叭披,是天一觀的道長。 經(jīng)常有香客問我秀鞭,道長趋观,這世上最難降的妖魔是什么扛禽? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任锋边,我火速辦了婚禮,結(jié)果婚禮上编曼,老公的妹妹穿的比我還像新娘豆巨。我一直安慰自己,他們只是感情好掐场,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布往扔。 她就那樣靜靜地躺著贩猎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萍膛。 梳的紋絲不亂的頭發(fā)上吭服,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音蝗罗,去河邊找鬼艇棕。 笑死,一個胖子當著我的面吹牛串塑,可吹牛的內(nèi)容都是我干的沼琉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼桩匪,長吁一口氣:“原來是場噩夢啊……” “哼打瘪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起傻昙,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤闺骚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后屋匕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體葛碧,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年过吻,在試婚紗的時候發(fā)現(xiàn)自己被綠了进泼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡纤虽,死狀恐怖乳绕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逼纸,我是刑警寧澤洋措,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站杰刽,受9級特大地震影響菠发,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贺嫂,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一滓鸠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧第喳,春花似錦糜俗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽珠月。三九已至,卻和暖如春楔敌,著一層夾襖步出監(jiān)牢的瞬間啤挎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工卵凑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留侵浸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓氛谜,卻偏偏與公主長得像掏觉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子值漫,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

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