記一次線上服務CPU 100%的處理過程

告警

正在開會陌凳,突然釘釘告警聲響個不停,同時市場人員反饋客戶在投訴系統(tǒng)登不進了,報504錯誤匿乃。查看釘釘上的告警信息桩皿,幾臺業(yè)務服務器節(jié)點全部報CPU超過告警閾值,達100%幢炸。

趕緊從會上下來泄隔,SSH登陸服務器,使用 top 命令查看宛徊,幾個Java進程CPU占用達到180%佛嬉,190%,這幾個Java進程對應同一個業(yè)務服務的幾個Pod(或容器)闸天。

定位

1. 使用 docker stats 命令查看本節(jié)點容器資源使用情況暖呕,對占用CPU很高的容器使用

?docker exec -it <容器ID> bash 進入。

2.?在容器內(nèi)部執(zhí)行 top 命令查看苞氮,定位到占用CPU高的進程ID湾揽,使用 top -Hp <進程ID> 定位到占用CPU高的線程ID。

3.?使用 jstack <進程ID> > jstack.txt 將進程的線程棧打印輸出

4.?退出容器笼吟, 使用 docker cp <容器ID>:/usr/local/tomcat/jstack.txt ./ 命令將jstack文件復制到宿主機库物,便于查看。獲取到jstack信息后贷帮,趕緊重啟服務讓服務恢復可用戚揭。

5.?將2中占用CPU高的線程ID使用 pringf '%x\n' <線程ID> 命令將線程ID轉(zhuǎn)換為十六進制形式。假設線程ID為133撵枢,則得到十六進制85毫目。在jstack.txt文件中定位到 nid=0x85的位置,該位置即為占用CPU高線程的執(zhí)行棧信息诲侮。如下圖所示

6.??與同事確認镀虐,該處為使用一個框架的excel導出功能,并且沟绪,導出excel時沒有分頁刮便,沒有限制!!!查看SQL查詢記錄,該導出功能一次導出50w條數(shù)據(jù)绽慈,并且每條數(shù)據(jù)都需要做轉(zhuǎn)換計算恨旱,更為糟糕的是,操作者因為導出時久久沒有響應坝疼,于是連續(xù)點擊搜贤,幾分鐘內(nèi)發(fā)起了10多次的導出請求……于是,CPU被打滿钝凶,服務崩潰了仪芒,我也崩潰了。

解決

對于此類耗資源的操作,一定要做好相應的限制掂名。比如可以限制請求量据沈,控制最大分頁大小,同時可以限制訪問頻率饺蔑,比如同一用戶一分鐘內(nèi)最多請求多少次锌介。

再發(fā)

服務重啟后恢復。到了下午猾警,又一臺服務器節(jié)點CPU告警孔祸,依前面步驟定位到占用CPU高的線程,如下

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007fa114020800 nid=0x10 runnable?"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007fa114022000 nid=0x11 runnable

使用命令 jstat -gcutil <進程ID> 2000 10 查看GC情況发皿,如圖


發(fā)現(xiàn)Full GC次數(shù)達到1000多次融击,且還在不斷增長,同時Eden區(qū)雳窟,Old區(qū)已經(jīng)被占滿(也可使用jmap -heap <進程ID>查看堆內(nèi)存各區(qū)的占用情況)尊浪,使用jmap將內(nèi)存使用情況dump出來,

jmap -dump:format=b,file=./jmap.dump 13

退出容器封救,使用 docker cp <容器ID>:/usr/local/tomcat/jmap.dump ./ 將dump文件復制到宿主機目錄拇涤,下載到本地,使用 MemoryAnalyzer誉结,如圖


如果dump文件比較大鹅士,需要增大MemoryAnalyzer.ini配置文件中的-Xmx值

發(fā)現(xiàn)占用內(nèi)存最多的是char[], String對象,通過右鍵可以查看引用對象惩坑,但點開貌似也看不出所以然來掉盅,進入內(nèi)存泄露報告頁面,如圖

該頁面統(tǒng)計了堆內(nèi)存的占用情況以舒,并且給出疑似泄露點趾痘,在上圖中點開“see stacktrace”鏈接,進入線程棧頁面蔓钟,


似曾熟悉的畫面永票,還是跟excel導出有關,數(shù)據(jù)太多滥沫,導致內(nèi)存溢出……于是GC頻繁侣集,于是CPU爆了。根源還是同一個兰绣。

總結(jié)

本文以處理一次線上服務CPU 100%的實戰(zhàn)過程示例了在遇到Java服務造成服務器CPU消耗過高或內(nèi)存溢出的一般處理方法世分,希望對大家定位線上類似問題提供參考。同時缀辩,開發(fā)實現(xiàn)功能時需要考慮的更深遠一些臭埋,不能停留在解決當前的場景踪央,需要考慮數(shù)據(jù)量不斷增大時,你的實現(xiàn)是否還能適用斋泄。俗話說杯瞻,初級程序員解決當前問題镐牺,中級程序員解決兩年后的問題炫掐,高級程序員解決五年后的問題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末睬涧,一起剝皮案震驚了整個濱河市募胃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畦浓,老刑警劉巖痹束,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異讶请,居然都是意外死亡祷嘶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門夺溢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來论巍,“玉大人,你說我怎么就攤上這事风响〖翁” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵状勤,是天一觀的道長鞋怀。 經(jīng)常有香客問我,道長持搜,這世上最難降的妖魔是什么密似? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮葫盼,結(jié)果婚禮上辛友,老公的妹妹穿的比我還像新娘。我一直安慰自己剪返,他們只是感情好废累,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脱盲,像睡著了一般邑滨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钱反,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天掖看,我揣著相機與錄音匣距,去河邊找鬼。 笑死哎壳,一個胖子當著我的面吹牛毅待,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播归榕,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼尸红,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了刹泄?” 一聲冷哼從身側(cè)響起外里,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎特石,沒想到半個月后盅蝗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡姆蘸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年墩莫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逞敷。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡狂秦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出兰粉,到底是詐尸還是另有隱情故痊,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布玖姑,位于F島的核電站愕秫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏焰络。R本人自食惡果不足惜戴甩,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闪彼。 院中可真熱鬧甜孤,春花似錦、人聲如沸畏腕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽描馅。三九已至把夸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铭污,已是汗流浹背恋日。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工膀篮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人岂膳。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓誓竿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谈截。 傳聞我的和親對象是個殘疾皇子筷屡,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

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