kali2020进入单模式_蚂蚁集团技术专家山丘:性能优化的常见模式及趋势
陳顯銘(山丘)
讀完需要
6分鐘速讀僅需 2 分鐘
陳顯銘,花名山丘,就職于螞蟻集團(tuán),對(duì)分布式應(yīng)用架構(gòu)、服務(wù)化、性能優(yōu)化等有深入的理解。參與支付寶支付鏈路核心系統(tǒng),設(shè)計(jì)、調(diào)優(yōu)應(yīng)用系統(tǒng)關(guān)鍵能力, 高效、穩(wěn)定保障系統(tǒng)平穩(wěn)支撐大促。曾歷經(jīng)多年雙十一大促,對(duì)于性能調(diào)優(yōu)、構(gòu)建高可用系統(tǒng)有豐富的實(shí)戰(zhàn)經(jīng)驗(yàn)。熟悉常見的性能優(yōu)化模式,比如應(yīng)用結(jié)構(gòu)優(yōu)化、鏈路級(jí)、單系統(tǒng)優(yōu)化等多種優(yōu)化方式。對(duì)于常見的壓測(cè)模式,如單機(jī)壓測(cè)、鏈路級(jí)壓測(cè)都有深厚的積累。作為一名性能專家,以追求性能最大化為己任,與之相伴的自然是高技巧、高難度的代碼優(yōu)化。這也是一名性能專家的畢生追求。
本章希望通過對(duì)性能優(yōu)化的模式進(jìn)行總結(jié),使讀者了解常見的性能招式,并能通過這些招式,找到自己系統(tǒng)中的性能瓶頸點(diǎn),或者當(dāng)前應(yīng)用所處的發(fā)展階段及下一步可能演進(jìn)的模式。
性能是驅(qū)動(dòng)應(yīng)用結(jié)構(gòu)演進(jìn)的主要?jiǎng)恿χ?#xff0c;本文會(huì)通過應(yīng)用結(jié)構(gòu)的變化揭示性能是如何在不同階段、以不同的結(jié)構(gòu)驅(qū)動(dòng)應(yīng)用結(jié)構(gòu)朝著下一個(gè)結(jié)構(gòu)演進(jìn)的。通過應(yīng)用結(jié)構(gòu)的發(fā)展也可以揭示,如何不做過度的設(shè)計(jì),在應(yīng)用盡量簡(jiǎn)化且不浪費(fèi)企業(yè)資源的情況下支撐企業(yè)業(yè)務(wù)的發(fā)展。首先說明性能優(yōu)化的價(jià)值。
1
? ?
性能優(yōu)化的優(yōu)缺點(diǎn)
對(duì)性能進(jìn)行優(yōu)化有如下幾個(gè)優(yōu)點(diǎn):
降低業(yè)務(wù)成本。
提升系統(tǒng)穩(wěn)定性。
提升用戶體驗(yàn)。
性能優(yōu)化的缺點(diǎn)是可能會(huì)使維護(hù)成本增加,增加代碼、結(jié)構(gòu)及技術(shù)棧的復(fù)雜度。以上所講到的性能優(yōu)化的優(yōu)缺點(diǎn)如圖 17.1 所示。
圖 17.1
2
? ?
性能優(yōu)化的兩種模式
縱觀性能優(yōu)化案例,性能優(yōu)化整體上可以分為兩類:單應(yīng)用優(yōu)化和結(jié)構(gòu)型優(yōu)化。
單應(yīng)用優(yōu)化:關(guān)注單系統(tǒng)瓶頸,通過解決單系統(tǒng)瓶頸提升性能。
結(jié)構(gòu)型優(yōu)化:通過改造鏈路結(jié)構(gòu)和配比進(jìn)行整體性能的優(yōu)化。
3
? ?
單應(yīng)用優(yōu)化
3.1
? ?
優(yōu)化基本思路
圖 17.2
如圖 17.2 所示,優(yōu)化基本思路包含如下幾個(gè)方面。
確定性能瓶頸/熱點(diǎn)。
確定優(yōu)化方案。
實(shí)施優(yōu)化方案并反饋優(yōu)化情況。
3.2
? ?
確定性能瓶頸點(diǎn)/熱點(diǎn)的常見方法
確定性能瓶頸點(diǎn)/熱點(diǎn)的常見方法有如下兩種。
性能壓測(cè):通過工具、人工等方式量化運(yùn)行時(shí)的性能情況。
業(yè)務(wù)/代碼梳理:通過代碼走讀發(fā)現(xiàn)資源消耗熱點(diǎn),通過統(tǒng)計(jì)代碼對(duì)資源的操作量化代碼對(duì)資源的消耗(比如一個(gè)業(yè)務(wù)操作會(huì)進(jìn)行多少次數(shù)據(jù)庫(kù)調(diào)用,進(jìn)行多少次服務(wù)運(yùn)算等方式)。
3.3
? ?
壓測(cè)時(shí)通常觀察的內(nèi)容及其所使用的工具
以 Java 環(huán)境為例,壓測(cè)時(shí)通常使用 JMeter 及 LoadRunner 發(fā)起壓力測(cè)試并收集壓測(cè)指標(biāo),使用 nmon 來檢測(cè) Linux 的性能情況。nmon 是一種在 AIX 與各種 Linux 操作系統(tǒng)上被廣泛使用的監(jiān)控與分析工具。除此之外,壓測(cè)時(shí)通常觀察的內(nèi)容及其所使用的工具如下:
內(nèi)存的使用情況:MAT、GC 日志、vmstat。
I/O 情況:iostat。
網(wǎng)絡(luò)情況:Netstat。
熱點(diǎn)代碼:JProfiler、BTrace、JStack、JStat。
CPU 情況:Linux top 命令。
3.4
? ?
常見的優(yōu)化手段及模式
常見的優(yōu)化手段及模式大概有如下幾種。
靜態(tài)化:動(dòng)態(tài)數(shù)據(jù)和靜態(tài)數(shù)據(jù)分離。
異步化:使用異步化減少主流程中的非關(guān)鍵業(yè)務(wù)邏輯。
并行化:使用多線程并發(fā)處理,縮短響應(yīng)時(shí)間。
內(nèi)存優(yōu)化:減小對(duì)象所占空間,減少對(duì)象創(chuàng)建的數(shù)量,優(yōu)化數(shù)據(jù)模型。
去重復(fù)運(yùn)算:優(yōu)化業(yè)務(wù)邏輯,或者使用緩存。
減少數(shù)據(jù)庫(kù)操作:為此,需要減少數(shù)據(jù)冗余、數(shù)據(jù)緩存等。
縮短數(shù)據(jù)庫(kù)事務(wù):可以考慮使用短事務(wù)、異步化、最終一致性等方式。
精簡(jiǎn)代碼邏輯:去除冗余代碼,諸如重復(fù)判斷的代碼。
精簡(jiǎn)日志操作:要關(guān)注日志大小,注意 I/O 上的瓶頸。日志太多,說明生成的 String 也會(huì)很多,會(huì)增加 GC 的負(fù)擔(dān)。
4
? ?
結(jié)構(gòu)型優(yōu)化
此部分介紹的內(nèi)容在很多網(wǎng)站架構(gòu)變遷的文章中都會(huì)提到,下面通過圖示的方式展現(xiàn)出來。每個(gè)階段都有適用的軟件架構(gòu),出于對(duì)建設(shè)復(fù)雜度、維護(hù)成本的考慮,不必強(qiáng)求一開始就建設(shè)出很完整的技術(shù)體系。個(gè)人認(rèn)為,性能是驅(qū)動(dòng)應(yīng)用體系演進(jìn)的重要驅(qū)動(dòng)力,可以通過下面的應(yīng)用結(jié)構(gòu)演進(jìn)看出來。單應(yīng)用時(shí)代的常見瓶頸先發(fā)生在數(shù)據(jù)庫(kù)上。由于所有的業(yè)務(wù)都存儲(chǔ)在一個(gè)數(shù)據(jù)庫(kù)(DB) 上,因此數(shù)據(jù)庫(kù)的讀寫和性能是可能遇到的第一個(gè)問題,如圖 17.3 所示。
圖 17.3
單應(yīng)用時(shí)代對(duì)此問題的第一個(gè)常見解決辦法是使用緩存(偏向應(yīng)用級(jí)別的緩存)。為了防止所有的數(shù)據(jù)讀寫都集中在數(shù)據(jù)庫(kù)上進(jìn)行,首先想到的就是通過緩存減少對(duì)數(shù)據(jù)庫(kù)的壓力,比如將配置數(shù)據(jù)全部加載到緩存(某些場(chǎng)景可以使用類似 LRU 的緩存)中,如圖 17.4 所示。
圖 17.4
單應(yīng)用時(shí)代解決此問題的第二個(gè)辦法是使用獨(dú)立緩存服務(wù)(集中式緩存,如 MemCache),如圖 17.5 所示。
圖 17.5
單應(yīng)用集中式部署帶來了應(yīng)用集群處理能力的提升,可以使應(yīng)用進(jìn)行水平擴(kuò)展,如圖 17.6 所示。
圖 17.6
單應(yīng)用集中式部署后的數(shù)據(jù)庫(kù)瓶頸如圖 17.7 所示。
圖 17.7
單應(yīng)用集中式部署后的數(shù)據(jù)庫(kù)瓶頸的解決辦法是對(duì)數(shù)據(jù)庫(kù)進(jìn)行拆分及讀寫分離,如圖 17.8 所示。
圖 17.8
為了應(yīng)對(duì)更大范圍的請(qǐng)求量,需要進(jìn)行服務(wù)化拆分,由此進(jìn)入多應(yīng)用分布式服務(wù)化時(shí)代,如圖 17.9 所示。
圖 17.9
隨著業(yè)務(wù)及數(shù)據(jù)的規(guī)模不斷擴(kuò)大,又逐漸進(jìn)入多應(yīng)用分布式服務(wù)集群化時(shí)代,此時(shí)依然存在一些問題需要解決,如圖 17.10 所示。
圖 17.10
5
? ?
兩個(gè)結(jié)構(gòu)優(yōu)化的案例
5.1
? ?
處理單點(diǎn)/網(wǎng)絡(luò)瓶頸的可行方式
通過去分布式調(diào)用進(jìn)行去中心化,可以規(guī)避網(wǎng)絡(luò)設(shè)備成為瓶頸和單點(diǎn)故障,如圖 17.11 所示。
圖 17.11
5.2
? ?
處理數(shù)據(jù)庫(kù)連接池瓶頸的可行手段
增加數(shù)據(jù)處理中間層可以緩解數(shù)據(jù)庫(kù)連接池的瓶頸,最好的處理方式是對(duì)架構(gòu)進(jìn)行服務(wù)化和單元化,將數(shù)據(jù)量大的數(shù)據(jù)庫(kù)進(jìn)行拆分,分散壓力,如圖 17.12 所示。
圖 17.12
6
? ?
總結(jié)
對(duì)于小型企業(yè)的業(yè)務(wù),通過進(jìn)行較為簡(jiǎn)單的單系統(tǒng)優(yōu)化,并輔助結(jié)構(gòu)性優(yōu)化,便能滿足大部分企業(yè)的要求,如圖 17.13 所示。但隨著企業(yè)的業(yè)務(wù)量不斷增加,單獨(dú)的單機(jī)優(yōu)化已經(jīng)不能滿足需求。分布式部署是中大型企業(yè)的必經(jīng)之路,水平擴(kuò)展、垂直拆分、服務(wù)化等方式是實(shí)現(xiàn)分布式部署的方式。
圖 17.13
近年來,像阿里巴巴這類的大型一線互聯(lián)網(wǎng)公司已經(jīng)不再滿足固定模式的水平擴(kuò)展, 那么當(dāng)一個(gè)機(jī)房的容量不足時(shí)要如何應(yīng)對(duì)呢?一個(gè)城市的機(jī)房容量不足時(shí)又要如何應(yīng)對(duì)?綜合不斷增長(zhǎng)的業(yè)務(wù)述求,阿里巴巴這類公司正在實(shí)施單元化進(jìn)程,根據(jù)一定的數(shù)據(jù)分片規(guī)則,使特定分片規(guī)則下的用戶訪問到特定單元化的應(yīng)用系統(tǒng),并通過不同城市的單元實(shí)現(xiàn)流量的自由切換和容災(zāi)。技術(shù)總是在不斷更迭,今天的解決辦法是明天的問題,也許單元化也不是最終的解決辦法,總會(huì)涌現(xiàn)出越來越多的新挑戰(zhàn)和應(yīng)用模式。
- EOF -
想要加入中生代架構(gòu)群的小伙伴,請(qǐng)?zhí)砑尤汉匣锶?strong>大白的微信
申請(qǐng)備注(姓名+公司+技術(shù)方向)才能通過哦!
擴(kuò)展閱讀
? ?
阿里專家馬飛翔:一文讀懂架構(gòu)整潔之道2020-10-16DDD專家張逸:構(gòu)建領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)知識(shí)體系2020-10-13京東架構(gòu)師閆文廣:訂單系統(tǒng)高可用架構(gòu)及演變過程2020-10-12架構(gòu)師,是否需要寫代碼?2020-09-18阿里高級(jí)技術(shù)專家簫逸:如何畫好一張架構(gòu)圖?2020-09-07大神手把手教你設(shè)計(jì)秒殺架構(gòu)模型2020-09-06阿里巴巴閑魚架構(gòu)負(fù)責(zé)人王樹彬:萬億交易規(guī)模技術(shù)架構(gòu)實(shí)踐2020-09-05阿里高級(jí)技術(shù)專家張建飛:應(yīng)用架構(gòu)分離業(yè)務(wù)邏輯和技術(shù)細(xì)節(jié)之道2020-08-31波波老師大解密:如何成為優(yōu)秀的架構(gòu)師?2020-06-25微信支付軟件架構(gòu)重構(gòu)之旅2020-06-08一個(gè)思維習(xí)慣,讓你成為架構(gòu)師2020-06-03阿里P9專家右軍:以終為始的架構(gòu)設(shè)計(jì)2020-04-27? ?END ? ??
#架構(gòu)師必備#
點(diǎn)分享點(diǎn)點(diǎn)贊點(diǎn)在看
總結(jié)
以上是生活随笔為你收集整理的kali2020进入单模式_蚂蚁集团技术专家山丘:性能优化的常见模式及趋势的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028年中国散热产业深度调研
- 下一篇: 差分法的应用