Java性能優(yōu)化隨記

性能調(diào)優(yōu)是我們在日常開發(fā)過程中必然會遇到的一個問題逊抡,本文總結(jié)了常見的性能相關(guān)的指標(biāo)和影響因素,以及常見的調(diào)優(yōu)方法静暂,如有不合理之處還請各位指出搏熄。

1.了解性能

1.1性能指標(biāo)

一般情況下我們會從以下維度去衡量負(fù)責(zé)系統(tǒng)的性能優(yōu)劣:

? ??響應(yīng)時間:有AVG、TP99来惧、MAX等多個指標(biāo)冗栗,衡量一段特定時間內(nèi)不同程度的請求處理時長;

? ??吞吐量:有QPS供搀、TPS等多個指標(biāo)隅居,衡量單位時間內(nèi)能夠處理請求的數(shù)量;

? ??資源消耗:有CPU使用率葛虐、平均負(fù)載胎源、磁盤I/O等多個指標(biāo);

? ??錯誤率:很多開發(fā)同學(xué)都會忽略這個指標(biāo)屿脐,但如果一個系統(tǒng)吞吐量或者響應(yīng)時間的提升是以錯誤率上升為代價涕蚤,那么這是沒有意義的。

1.2 性能的影響因素

資源是影響性能的決定性因素的诵。從本質(zhì)上說一次請求就是用特定的資源換取對請求的處理赞季,對服務(wù)器來說通常需要消耗的資源包括CPU、內(nèi)存奢驯、網(wǎng)絡(luò)IO申钩、磁盤IO等,具體如下:

性能影響因素分析圖

2.性能診斷工具

工欲善其事瘪阁,必先利其器撒遣。在討論具體討論性能優(yōu)化的方法之前,先來看下我們有哪些可用的性能診斷工具管跺。

2.1?常用系統(tǒng)命令/工具

常見的性能診斷命令主要分為兩層:OS 層面和 Java 應(yīng)用層面(包括應(yīng)用代碼診斷和 GC 診斷)

常用性能診斷命令總結(jié)

3.?性能優(yōu)化的SOP

1.確立目標(biāo)和現(xiàn)狀分析

? ? 目標(biāo)可以分為兩個部分:一是優(yōu)化對象义黎;二是要在什么指標(biāo)上達(dá)到什么樣的結(jié)果,比如查詢服務(wù)達(dá)到單機(jī)QPS 2000且AVG在50ms以內(nèi)豁跑。

在具體優(yōu)化前廉涕,應(yīng)該了解下整體現(xiàn)狀,包括現(xiàn)有系統(tǒng)架構(gòu)艇拍、當(dāng)前性能指標(biāo)以及與目標(biāo)的實(shí)際差距狐蜕。

對于已經(jīng)在線上運(yùn)行的系統(tǒng),現(xiàn)有的性能指標(biāo)又會影響到整個優(yōu)化目標(biāo)的設(shè)立卸夕。

3.2 發(fā)現(xiàn)瓶頸

對于已上線且面對高并發(fā)場景的系統(tǒng)层释,一般性能瓶頸可以通過日常運(yùn)維過程中通過監(jiān)控平臺上峰值流量時的表現(xiàn)或者異常記錄從而發(fā)現(xiàn):比如log4j2在AOP情況下error記錄堆棧信息時會因?yàn)闋帗屾i而導(dǎo)致應(yīng)用性能明顯下降。

對于未上線或流量不足的系統(tǒng)快集,那么通常只能通過壓測的方式來明確當(dāng)前性能指標(biāo)和發(fā)現(xiàn)問題贡羔,由于壓測不再本次討論范圍內(nèi)廉白,故不做闡述。

3.3 分析并解決

性能問題分析如同霧里看花乖寒,根因(RootCause)需要開發(fā)人員耐著性子一層一層地去揭示猴蹂,有些問題甚至不是業(yè)務(wù)代碼本身引入的,而是物理機(jī)器抖動或者中間件所引入的楣嘁。問題分析可以說是即考驗(yàn)RD技術(shù)功底和經(jīng)驗(yàn)磅轻,又磨礪耐心。好在日常實(shí)際工作中马澈,問題分析的難易度也遵守二八原則:八成的性能問題都能通過較為定式的套路分析得出原因,剩下兩成的疑難雜癥就需要依靠團(tuán)隊(duì)老司機(jī)弄息、外部工具痊班、甚至奇技淫巧才能得以解決。

定位瓶頸應(yīng)該由大到小摹量,先確定是項(xiàng)目本身的瓶頸涤伐、DB還是緩存。然后再進(jìn)一步分析具體是哪個模塊缨称、哪個原因凝果。要想能夠快速分析問題,前面介紹的各類診斷工具需要熟練掌握睦尽,并且應(yīng)該通過自己摸索器净、積累建立一套屬于自己分析的SOP。

結(jié)合日常工作經(jīng)驗(yàn)將常見的性能問題進(jìn)行了歸類当凡,如下:

性能問題分類

3.4 驗(yàn)證效果

應(yīng)該盡可能還原發(fā)現(xiàn)問題時的現(xiàn)場山害,這里包括請求量級、壓測數(shù)據(jù)沿量、上下游機(jī)器配比浪慌、機(jī)器配置(CPU\MEM\DISK)、機(jī)房分布等等朴则。只有相同的現(xiàn)場在才能最大程度證明優(yōu)化的效果权纤,兩者差距越小,那么優(yōu)化的效果才越是可信乌妒。比如優(yōu)化CPU密集型項(xiàng)目:發(fā)現(xiàn)問題時所在機(jī)器是4核的汹想,效果驗(yàn)證時隨手選了8核,那么就很難辨別是因?yàn)閮?yōu)化還是因?yàn)樘嵘藱C(jī)器配置提升解決的問題撤蚊。

具體驗(yàn)證方式包括:

直接觀察指標(biāo):適用于訪問量欧宜、AVG、TP999拴魄、CPU等現(xiàn)有監(jiān)控平臺直接提供指標(biāo)的優(yōu)化后驗(yàn)證冗茸。

單機(jī)吞吐量:壓測席镀。如果對于壓測數(shù)據(jù)沒有特殊的要求并且線上流量足夠,可以直接通過調(diào)整集群中機(jī)器的負(fù)載均衡來驗(yàn)證夏漱。否則豪诲,就需要按照正規(guī)的壓測流量在Quake上進(jìn)行壓測。

極端情況的優(yōu)化:針對問題的不同挂绰,可能需要準(zhǔn)備專門的數(shù)據(jù)屎篱,專門的時間,甚至專門的機(jī)器進(jìn)行驗(yàn)證葵蒂。

如果驗(yàn)證效果后整體未能達(dá)到預(yù)期目標(biāo)交播,那么應(yīng)該去發(fā)現(xiàn)新的瓶頸進(jìn)行新一輪的優(yōu)化;如果是該優(yōu)化點(diǎn)未能有明顯效果践付,那么要重新去分析原有問題秦士,是之前判斷錯了,還是優(yōu)化本身沒有到位永高。

3.5 經(jīng)驗(yàn)輸出

性能優(yōu)化的經(jīng)驗(yàn)輸出隧土,對于團(tuán)隊(duì)而言,無論是作為日后相同問題解決方案的歷史依據(jù)命爬,還是作為新人培訓(xùn)的材料都大有裨益曹傀。具體可以包括:

針對一些典型的性能問題或者較為少見的問題應(yīng)該及時文檔化,作為技術(shù)沉淀將排查過程饲宛、分析思路皆愉、解決方案逐一記錄下來。

4.性能優(yōu)化的另一個思路:鏈路優(yōu)化

當(dāng)系統(tǒng)性能優(yōu)化成本較大甚至已經(jīng)達(dá)到極限的情況下艇抠,不妨換一個思路:在支撐同樣業(yè)務(wù)目標(biāo)的情況下亥啦,對鏈路進(jìn)行梳理、重構(gòu)以減少外部對瓶頸資源的訪問量练链,我們將這類優(yōu)化統(tǒng)稱為鏈路優(yōu)化翔脱。

4.1 明確瓶頸

鏈路優(yōu)化是一個成本較高的手段,通常不會發(fā)生在整個優(yōu)化任務(wù)的早期媒鼓。當(dāng)你選擇該手段時届吁,往往已經(jīng)明確系統(tǒng)瓶頸了。一方面绿鸣,系統(tǒng)瓶頸通常出現(xiàn)在整個鏈路的最底層疚沐;另一方面,絕大多數(shù)的業(yè)務(wù)系統(tǒng)所在集群具備水平擴(kuò)展的能力潮模,因此數(shù)據(jù)庫是最為常見的系統(tǒng)性能瓶頸亮蛔。

4.2 范圍選定

通常情況下一個完整的業(yè)務(wù)場景請求鏈路是非常長的,即使不考慮前端團(tuán)隊(duì)擎厢,僅后端就能橫跨多個團(tuán)隊(duì)究流,十幾個甚至幾十個項(xiàng)目辣吃。鏈路優(yōu)化范圍越是大,成本越是高芬探、周期越是長神得!如果一股腦進(jìn)行全鏈路優(yōu)化,那么項(xiàng)目將會變得難以控制偷仿。因此哩簿,建議優(yōu)化范圍從瓶頸出發(fā),由小到大酝静,如果小范圍難以達(dá)到效果节榜,再進(jìn)一步擴(kuò)大范圍,逐層遞進(jìn)别智。

4.3 梳理現(xiàn)狀

這是整個鏈路優(yōu)化中最為核心重要的環(huán)節(jié)宗苍,后續(xù)的所有優(yōu)化都將建立在梳理后業(yè)務(wù)和系統(tǒng)現(xiàn)狀的認(rèn)知之上。要得到如下結(jié)果:

完整的調(diào)用鏈路圖亿遂;

鏈路中各應(yīng)用間調(diào)用的放大系數(shù)浓若,最終推出算出對瓶頸資源的放大渺杉;

各應(yīng)用間調(diào)用業(yè)務(wù)意義蛇数。

4.4 分析與優(yōu)化

鏈路分析的方法本身不難,就是針對每次調(diào)用問兩個問題:1.這次調(diào)用是否多余是越?2.這次調(diào)用是否可以合并耳舅?

何謂多余?比如每個業(yè)務(wù)活動已經(jīng)停止了倚评,但是上游依舊每次都來查詢浦徊。又比如業(yè)務(wù)校驗(yàn)需要查詢DB,而這個校驗(yàn)在每一層都做了天梧,那么可以適當(dāng)犧牲校驗(yàn)的前置性或者信賴上游舍去其中一些校驗(yàn)盔性,當(dāng)然這個要看具體的業(yè)務(wù)場景來定。

參考:https://blog.csdn.net/moakun/article/details/80660518

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呢岗,一起剝皮案震驚了整個濱河市冕香,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌后豫,老刑警劉巖悉尾,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異挫酿,居然都是意外死亡构眯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門早龟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惫霸,“玉大人猫缭,你說我怎么就攤上這事∷剩” “怎么了饵骨?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長茫打。 經(jīng)常有香客問我居触,道長,這世上最難降的妖魔是什么老赤? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任轮洋,我火速辦了婚禮,結(jié)果婚禮上抬旺,老公的妹妹穿的比我還像新娘弊予。我一直安慰自己,他們只是感情好开财,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布汉柒。 她就那樣靜靜地躺著,像睡著了一般责鳍。 火紅的嫁衣襯著肌膚如雪碾褂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天历葛,我揣著相機(jī)與錄音正塌,去河邊找鬼。 笑死恤溶,一個胖子當(dāng)著我的面吹牛乓诽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咒程,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼鸠天,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了帐姻?” 一聲冷哼從身側(cè)響起稠集,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卖宠,沒想到半個月后巍杈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扛伍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年筷畦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡鳖宾,死狀恐怖吼砂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鼎文,我是刑警寧澤渔肩,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站拇惋,受9級特大地震影響周偎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撑帖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一蓉坎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胡嘿,春花似錦蛉艾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缴罗,卻和暖如春助琐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞒爬。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工弓柱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沟堡,地道東北人侧但。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像航罗,于是被迫代替她去往敵國和親禀横。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

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