運(yùn)維中性能優(yōu)化的常見(jiàn)模式及趨勢(shì)
作者介紹
陳顯銘(螞蟻金服技術(shù)專家,藝名山丘,公眾號(hào):loopfork)
專注碼磚七年之久,喜歡碼磚,喜歡扔錘子(山丘之王出自寒冰王座)。?;燠E中生代技術(shù)群(公眾號(hào):freshmanTechnology)、高效運(yùn)維(公眾號(hào):greatops)等高大上社群。專注高可用、分布式、性能優(yōu)化、穩(wěn)定性、高效運(yùn)維等方向。自我評(píng)價(jià):不算出名,但是對(duì)于技術(shù)有一點(diǎn)點(diǎn)情懷,愛(ài)交友,歡迎技術(shù)討論。
性能優(yōu)化的價(jià)值
從上圖可以看出幾個(gè)優(yōu)點(diǎn):
◆ 成本降低
◆ 穩(wěn)定性提升
◆ 用戶體驗(yàn)體驗(yàn)提升
性能優(yōu)化的缺點(diǎn)有:維護(hù)成本增加,代碼可能變復(fù)雜,結(jié)構(gòu)可能變復(fù)雜,技術(shù)??赡茏儚?fù)雜。
性能優(yōu)化的兩種模式
個(gè)人總結(jié),性能優(yōu)化整體上可以分為兩類:?jiǎn)螒?yīng)用優(yōu)化和結(jié)構(gòu)型優(yōu)化。
◆ 單應(yīng)用優(yōu)化,關(guān)注單系統(tǒng)瓶頸,通過(guò)解決單系統(tǒng)瓶頸提升性能。
◆ 結(jié)構(gòu)型優(yōu)化,通過(guò)改造鏈路結(jié)構(gòu)和配比,進(jìn)行整體性能的優(yōu)化。
單應(yīng)用優(yōu)化常見(jiàn)步驟
優(yōu)化基本思路(閉環(huán)):
1.確定性能瓶頸/熱點(diǎn);
2.確定優(yōu)化方案;
3.實(shí)施、反饋優(yōu)化情況。
確定性能瓶頸/熱點(diǎn)的常見(jiàn)方法:
1.性能壓測(cè):通過(guò)工具/人肉等方式,量化運(yùn)行時(shí)的性能情況。
2.業(yè)務(wù)/代碼梳理:通過(guò)代碼走讀,發(fā)現(xiàn)資源消耗熱點(diǎn)(牛B的人可以這么干);通過(guò)統(tǒng)計(jì)代碼對(duì)資源的操作,量化代碼對(duì)資源的消耗(比如一個(gè)業(yè)務(wù)操作會(huì)進(jìn)行多少次數(shù)據(jù)庫(kù)調(diào)用,會(huì)進(jìn)行多少次服務(wù)運(yùn)算等方式)。
壓測(cè)時(shí)常觀察的內(nèi)容及工具有(舉例Java應(yīng)用):
1.壓測(cè)工具:jmeter
2.內(nèi)存的使用情況:mat,gc日志,vmstat
3.IO情況:iostat
4.網(wǎng)絡(luò)情況:netstat
5.熱點(diǎn)代碼:jprofile,btrace,jstack,jstat
6.CPU情況:top
優(yōu)化的常見(jiàn)手段或模式:
1.靜態(tài)化:動(dòng)態(tài)數(shù)據(jù)和靜態(tài)數(shù)據(jù)分離。
2.異步化:使用異步化減少主流程中的非關(guān)鍵業(yè)務(wù)邏輯。
3.并行化:使用多線程并發(fā)處理,縮短響應(yīng)時(shí)間。
4.內(nèi)存優(yōu)化:減少對(duì)象大小,減少對(duì)象創(chuàng)造,數(shù)據(jù)模型優(yōu)化。
5.去重復(fù)運(yùn)算:業(yè)務(wù)邏輯優(yōu)化,或者使用緩存。
6.減少數(shù)據(jù)庫(kù)操作:數(shù)據(jù)冗余,數(shù)據(jù)緩存等。
7.縮短數(shù)據(jù)庫(kù)事務(wù):短事務(wù),異步化,最終一致性等方式可以考慮。
8.精簡(jiǎn)代碼邏輯:去除冗余代碼,諸如過(guò)度設(shè)計(jì)檢查等代碼。
9.精簡(jiǎn)日志操作:日志大小要關(guān)注,注意IO上的瓶頸;日志太多,說(shuō)明生成的string也會(huì)多,也增加了gc負(fù)擔(dān)。
等等。
結(jié)構(gòu)型優(yōu)化常見(jiàn)步驟
此部分介紹的內(nèi)容,在很多網(wǎng)站架構(gòu)變遷的文章中介紹過(guò),這里通過(guò)圖的方式展現(xiàn)出來(lái)。
每個(gè)階段都有適用的軟件架構(gòu),基于成本、建設(shè)復(fù)雜度、維護(hù)成本的考慮,不必強(qiáng)求一開始建設(shè)很完整的技術(shù)體系。
個(gè)人認(rèn)為,性能是驅(qū)動(dòng)應(yīng)用體系研究的重要驅(qū)動(dòng)力,可以通過(guò)下面應(yīng)用結(jié)構(gòu)演進(jìn)看出來(lái)。
1.單應(yīng)用時(shí)代常見(jiàn)瓶頸先發(fā)生在DB?!?/p>
2.單應(yīng)用時(shí)代常見(jiàn)***個(gè)解法是使用緩存(偏向應(yīng)用級(jí)別緩存)。
3.單應(yīng)用時(shí)代常見(jiàn)***個(gè)解法是獨(dú)立緩存服務(wù)(集中式緩存,如memcache)。
4.單應(yīng)用集中式部署帶來(lái)應(yīng)用集群處理能力提升。
5.單應(yīng)用集中式部署部署后的DB瓶頸。
6.單應(yīng)用集中式部署部署后的DB瓶頸解法(數(shù)據(jù)庫(kù)拆分、讀寫分離)。
7.服務(wù)化拆分應(yīng)對(duì)更大范圍請(qǐng)求量。
8.服務(wù)化集群部署模式。
兩個(gè)結(jié)構(gòu)優(yōu)化的案例
◆ 處理單點(diǎn)/網(wǎng)絡(luò)瓶頸的可行方式
◆ 處理數(shù)據(jù)庫(kù)連接池瓶頸的可行手段
總結(jié):性能/應(yīng)用優(yōu)化的幾個(gè)趨勢(shì)