32-一條SQL引發(fā)的系統(tǒng)卡死(上)-數(shù)據(jù)分析

歡迎關(guān)注公眾號(hào)OpenCoder力九,來和我做朋友吧~??????

今天給大家分享一個(gè)真實(shí)的案例,這是我之前一個(gè)朋友公司的項(xiàng)目在開發(fā)完畢后上線發(fā)現(xiàn)整個(gè)項(xiàng)目在線上的體驗(yàn)非常不好邑闺,有明顯的頻繁卡頓跌前,后來經(jīng)過一連串的排查、定位陡舅、分析和優(yōu)化才發(fā)現(xiàn)原來是一條SQL引發(fā)的問題抵乓,而且該SQL語句是一位剛?cè)肼毑痪玫墓こ處熕鶎憽?/p>

通過這次事故的教訓(xùn)也讓這個(gè)團(tuán)隊(duì)在后續(xù)的開發(fā)中更加注重了JVM參數(shù)的設(shè)置以及GC的監(jiān)控。

該案例肯定涉及到整個(gè)項(xiàng)目的代碼關(guān)聯(lián)蹭沛,無法給到大家具體代碼的展示臂寝,我們本案例還是通過畫圖的方式給大家進(jìn)行講解。對(duì)于該案例的分析和優(yōu)化的過程大家如果能理解透徹摊灭,舉一反三咆贬,對(duì)于大家以后在自己公司的項(xiàng)目以及遇到類似的情況,能夠結(jié)合我們講解的Jvm知識(shí)和掌握的工具自己去進(jìn)行排查和優(yōu)化肯定是有幫助的帚呼。

JVM性能分析-找問題

那么針對(duì)類似這種系統(tǒng)上線后就比較卡頓的問題掏缎,我們應(yīng)該如何下手去進(jìn)行排查呢?

我們之前已經(jīng)介紹過 jstat工具了煤杀,這個(gè)工具是非常好用眷蜈、實(shí)用的一個(gè)工具,希望大家重視起來沈自。

由于很多中小型公司其實(shí)都沒有可視化的監(jiān)控平臺(tái)酌儒,沒法直接可視化的看到JVM各個(gè)區(qū)域的內(nèi)存變化,GC次數(shù)和GC耗時(shí)枯途。

當(dāng)然忌怎,如果有辦法的話籍滴,我建議大家可以給自己所在公司推薦一下類似Zabbix、Ganglia榴啸、Open-Falcon孽惰、Prometheus之類的可視化監(jiān)控平臺(tái),其實(shí)接入都非常簡(jiǎn)單鸥印,如果把線上系統(tǒng)接入了這些平臺(tái)勋功,可以直接圖形化看到JVM的表現(xiàn)。

但是哪怕你有了可視化監(jiān)控平臺(tái)库说,有時(shí)候直接對(duì)線上系統(tǒng)進(jìn)行分析的時(shí)候狂鞋,還是jstat更加好用和直接。

OK潜的,具體如何通過 jstat工具進(jìn)行數(shù)據(jù)分析和打印要销,請(qǐng)查看或回顧:28-虛擬機(jī)性能監(jiān)控&故障處理工具

jstat排查后的數(shù)據(jù)統(tǒng)計(jì)

  • 機(jī)器配置:2核4G
  • JVM堆內(nèi)存大小:2G
  • 系統(tǒng)運(yùn)行時(shí)間:3天
  • 系統(tǒng)運(yùn)行3天內(nèi)發(fā)生的Full GC次數(shù)和耗時(shí):125次夏块,30多秒
  • 系統(tǒng)運(yùn)行3天內(nèi)發(fā)生的Young GC次數(shù)和耗時(shí):1.3萬次疏咐,700秒

該系統(tǒng)通過jstat工具監(jiān)測(cè)三天后得到的數(shù)據(jù)統(tǒng)計(jì)如上,我們發(fā)現(xiàn)基本上每天就會(huì)發(fā)生40多次Full GC脐供,每一個(gè)小時(shí)大概2次Full GC浑塞,每次Full GC耗時(shí)300ms左右; 每天發(fā)生4000多次Yong GC政己,基本每分鐘就發(fā)生3次酌壕,每次GC 50ms左右。

根據(jù)以上數(shù)據(jù)分析我們可以看出這個(gè)系統(tǒng)的性能是相當(dāng)?shù)牟盍诵桑还苁荵ong GC還是Full GC的頻率太頻繁了卵牍!必須進(jìn)行優(yōu)化。

未優(yōu)化前的線上JVM參數(shù)

下面是未優(yōu)化前的線上JVM參數(shù)沦泌,大致如下:

-Xms1536M -Xmx1536M -Xmn512M -Xss256K 
-XX:SurvivorRatio=5 -XX:+UseParNewGC 
-XX:+UseConcMarkSweepGC 
-XX:CMSInitiatingOccupancyFraction=68
-XX:+CMSParallelRemarkEnabled 
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC

可以看到糊昙,4G的機(jī)器,給JVM內(nèi)存分配了1.5G谢谦,新生代分配了512M释牺,老年代1G。

這里關(guān)鍵的是“-XX:SurvivorRatio”設(shè)置為了5回挽,也就是說没咙,Eden:Survivor1:Survivor2的比例是5:1:1。

那么可以推出:Eden區(qū)域大致為 366M千劈,每個(gè)Survior區(qū)域大致為 70M祭刚。

如下圖所示:

image

系統(tǒng)運(yùn)行推導(dǎo)

1.新生代每秒分配對(duì)象的大小

由之前的統(tǒng)計(jì)分析可知:每分鐘3次Yong GC,那么大概20s就會(huì)發(fā)生一次Yong GC,那么也就是20秒Eden區(qū)域基本就滿了涡驮,20S共產(chǎn)生300多MB的對(duì)象宜鸯,每秒大概產(chǎn)生 20MB的對(duì)象進(jìn)Eden.

2.老年代分配對(duì)象時(shí)間
每一個(gè)小時(shí)大概2次Full GC,那么半小時(shí)就是一個(gè)Full GC遮怜,要想觸發(fā)Full GC,需要達(dá)到老年代觸發(fā)的閾值鸿市,而上述JVM參數(shù)中有一個(gè)

-XX:CMSInitiatingOccupancyFraction=68

參數(shù)的設(shè)置锯梁,那么也就是老年代空間大概在達(dá)到600多MB的時(shí)候就直接觸發(fā)Full GC了。

總結(jié)下如下圖所示:

image

那么分析到這兒焰情,可能有多同學(xué)就會(huì)立馬給出解決方案了:

  • 換機(jī)器:換成4核8G
  • 增大Survior區(qū)域的大小

請(qǐng)注意:并不是所有的問題都是可以通過增大機(jī)器內(nèi)存陌凳,增大JVM內(nèi)存,增大新生代內(nèi)存内舟,增大Survior區(qū)域大小就可以解決了合敦,我們一定要先分析清楚到底是什么原因?qū)е挛覀兊南到y(tǒng)會(huì)發(fā)生卡頓,是不是由于我們自己的代碼問題所導(dǎo)致验游? 特別是在機(jī)器內(nèi)存小的物理機(jī)上更容易檢測(cè)出來我們代碼的質(zhì)量問題充岛,這類問題如果不解決,而是一味的增大機(jī)器內(nèi)存耕蝉,根本是解決不了本質(zhì)問題的崔梗!

這里真正的Full GC是真的由于Survior區(qū)域太小,導(dǎo)致每次Yong GC后剩余存活對(duì)象直接進(jìn)入到了老年代垒在?

還是有很多長(zhǎng)時(shí)間存活對(duì)象蒜魄,始終存活在老年代,導(dǎo)致無法回收场躯?加上老年代觸發(fā)Full GC的閾值只有68%谈为,導(dǎo)致速度更快?

分析到這里踢关,絕不能輕易草率的給出結(jié)論和解決方案伞鲫!

那么我們到底應(yīng)該如何繼續(xù)分析以及排查問題,請(qǐng)大家積極思考可以在我們的技術(shù)交流群中給出自己的答案和分析計(jì)劃签舞。我們下篇文章再繼續(xù)給出問題所在和解決方案榔昔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瘪菌,隨后出現(xiàn)的幾起案子撒会,更是在濱河造成了極大的恐慌,老刑警劉巖师妙,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诵肛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)怔檩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門褪秀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人薛训,你說我怎么就攤上這事媒吗。” “怎么了乙埃?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵闸英,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我介袜,道長(zhǎng)甫何,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任遇伞,我火速辦了婚禮辙喂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸠珠。我一直安慰自己巍耗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布渐排。 她就那樣靜靜地躺著芍锦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪飞盆。 梳的紋絲不亂的頭發(fā)上娄琉,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音吓歇,去河邊找鬼孽水。 笑死,一個(gè)胖子當(dāng)著我的面吹牛城看,可吹牛的內(nèi)容都是我干的女气。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼测柠,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼炼鞠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起轰胁,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤谒主,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后赃阀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霎肯,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了观游。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搂捧。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖懂缕,靈堂內(nèi)的尸體忽然破棺而出允跑,到底是詐尸還是另有隱情,我是刑警寧澤搪柑,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布聋丝,位于F島的核電站,受9級(jí)特大地震影響拌屏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜术荤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一倚喂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓣戚,春花似錦端圈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仑嗅,卻和暖如春宴倍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仓技。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國打工鸵贬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脖捻。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓阔逼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親地沮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嗜浮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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