使用Arthas分析高CPU問題

Arthas是阿里開源的Java診斷工具坏逢,相比JDK內(nèi)置的診斷工具,要更人性化妙黍,并且功能強(qiáng)大悴侵,可以實現(xiàn)許多問題的一鍵定位,而且可以一鍵反編譯類查看源碼拭嫁,甚至是直接進(jìn)行生產(chǎn)代碼熱修復(fù)可免,實現(xiàn)在一個工具內(nèi)快速定位和修復(fù)問題的一站式服務(wù)。今天做粤,我就帶你使用Arthas定位一個CPU使用高的問題浇借,系統(tǒng)學(xué)習(xí)下這個工具的使用。

首先怕品,下載并啟動Arthas:

curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
image.png

dashboard命令用于整體展示進(jìn)程所有線程妇垢、內(nèi)存、GC等情況肉康,其輸出如下:


image.png

可以看到闯估,CPU高并不是GC引起的,占用CPU較多的線程有8個吼和,其中7個是ForkJoinPool.commonPool涨薪。ForkJoinPool.commonPool是并行流默認(rèn)使用的線程池。所以纹安,此次CPU高的問題尤辱,應(yīng)該出現(xiàn)在某段并行流的代碼上砂豌。

接下來,要查看最繁忙的線程在執(zhí)行的線程棧光督,可以使用thread?-n命令阳距。這里,我們查看下最忙的8個線程:


image.png

可以看到结借,由于這些線程都在處理MD5的操作筐摘,所以占用了大量CPU資源。我們希望分析出代碼中哪些邏輯可能會執(zhí)行這個操作船老,所以需要從方法棧上找出我們自己寫的類咖熟,并重點(diǎn)關(guān)注。由于主線程也參與了ForkJoinPool的任務(wù)處理柳畔,因此我們可以通過主線程的椻晒埽看到需要重點(diǎn)關(guān)注
org.geekbang.time.commonmistakes.troubleshootingtools.highcpu.HighCPUApplication類的doTask方法。接下來薪韩,使用jad命令直接對HighCPUApplication類反編譯:

jad org.geekbang.time.commonmistakes.troubleshootingtools.highcpu.HighCPUApplication

可以看到确沸,調(diào)用路徑是main->task()->doTask(),當(dāng)doTask方法接收到的int參數(shù)等于某個常量的時候俘陷,會進(jìn)行1萬次的MD5操作罗捎,這就是耗費(fèi)CPU的來源。那么拉盾,這個魔法值到底是多少呢桨菜?


image.png

你可能想到了,通過jad命令繼續(xù)查看User類即可捉偏。這里因為是Demo倒得,所以我沒有給出很復(fù)雜的邏輯。在業(yè)務(wù)邏輯很復(fù)雜的代碼中告私,判斷邏輯不可能這么直白屎暇,我們可能還需要分析出doTask的“慢”會慢在什么入?yún)⑸稀?/p>

這時,我們可以使用watch命令來觀察方法入?yún)⒆に凇H缦旅罡浚硎拘枰O(jiān)控耗時超過100毫秒的doTask方法的入?yún)ⅲ⑶逸敵鋈雲(yún)⑹癯牛归_2層入?yún)?shù):


image.png

最后挤巡,我們使用ognl命令來運(yùn)行一個表達(dá)式,直接查詢User類的ADMIN_ID靜態(tài)字段來驗證是不是這樣酷麦,得到的結(jié)果果然是0:

image.png

需要額外說明的是矿卑,由于monitor、trace沃饶、watch等命令是通過字節(jié)碼增強(qiáng)技術(shù)來實現(xiàn)的母廷,會在指定類的方法中插入一些切面來實現(xiàn)數(shù)據(jù)統(tǒng)計和觀測轻黑,因此診斷結(jié)束要執(zhí)行shutdown來還原類或方法字節(jié)碼,然后退出Arthas琴昆。

在這個案例中氓鄙,我們通過Arthas工具排查了高CPU的問題:

  • 首先,通過dashboard?+?thread命令业舍,基本可以在幾秒鐘內(nèi)一鍵定位問題抖拦,找出消耗CPU最多的線程和方法棧;
  • 然后舷暮,直接jad反編譯相關(guān)代碼态罪,來確認(rèn)根因;
  • 此外下面,如果調(diào)用入?yún)⒉幻鞔_的話复颈,可以使用watch觀察方法入?yún)ⅲ⒏鶕?jù)方法執(zhí)行時間來過濾慢請求的入?yún)ⅰ?/li>

可?沥割,使用Arthas來定位生產(chǎn)問題根本用不著原始代碼券膀,也用不著通過增加日志來幫助我們分析入?yún)ⅲ粋€工具即可完成定位問題驯遇、分析問題的全套流程。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蓄髓,一起剝皮案震驚了整個濱河市叉庐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌会喝,老刑警劉巖陡叠,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肢执,居然都是意外死亡枉阵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門预茄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兴溜,“玉大人,你說我怎么就攤上這事耻陕∽净眨” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵诗宣,是天一觀的道長膘怕。 經(jīng)常有香客問我,道長召庞,這世上最難降的妖魔是什么岛心? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任来破,我火速辦了婚禮,結(jié)果婚禮上忘古,老公的妹妹穿的比我還像新娘徘禁。我一直安慰自己,他們只是感情好存皂,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布晌坤。 她就那樣靜靜地躺著,像睡著了一般旦袋。 火紅的嫁衣襯著肌膚如雪骤菠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天疤孕,我揣著相機(jī)與錄音商乎,去河邊找鬼。 笑死祭阀,一個胖子當(dāng)著我的面吹牛鹉戚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播专控,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼抹凳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伦腐?” 一聲冷哼從身側(cè)響起赢底,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柏蘑,沒想到半個月后幸冻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咳焚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年洽损,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片革半。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡碑定,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出又官,到底是詐尸還是另有隱情不傅,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布赏胚,位于F島的核電站访娶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏觉阅。R本人自食惡果不足惜崖疤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一秘车、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧劫哼,春花似錦叮趴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至般码,卻和暖如春妻率,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背板祝。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工宫静, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人券时。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓孤里,卻偏偏與公主長得像,于是被迫代替她去往敵國和親橘洞。 傳聞我的和親對象是個殘疾皇子捌袜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345