來(lái)源:北大青鳥(niǎo)總部 2023年08月07日 11:41
互聯(lián)網(wǎng)的發(fā)展推動(dòng)了越來(lái)越多的企業(yè)加入互聯(lián)網(wǎng),越來(lái)越多的產(chǎn)品出現(xiàn)在互聯(lián)網(wǎng),越來(lái)越多的網(wǎng)民涌現(xiàn)在互聯(lián)網(wǎng),除了提供基本的服務(wù)之外,還需要提供更好玩、更便捷穩(wěn)定的服務(wù),就像手機(jī)一樣,我們對(duì)它最基本的性能要求就是待機(jī)時(shí)間長(zhǎng),在互聯(lián)網(wǎng)的性能要求就是不慢不卡,因此性能優(yōu)化技術(shù)是互聯(lián)網(wǎng)程序員必須掌握的技術(shù)。
一套應(yīng)用程序能運(yùn)行起來(lái),除了最上層的前端服務(wù)、業(yè)務(wù)層算法之外,還有數(shù)據(jù)庫(kù)、操作系統(tǒng),因此性能優(yōu)化技術(shù)包含了負(fù)載均衡技術(shù)、緩存技術(shù)、數(shù)據(jù)庫(kù)技術(shù)、RPC技術(shù)(RemoteP)、進(jìn)程通信技術(shù)、IO多路復(fù)用技術(shù)、IO零拷貝技術(shù),互聯(lián)網(wǎng)程序員掌握了這些技術(shù),就像學(xué)好了數(shù)理化一樣,走到哪里都是香餑餑。
所謂負(fù)載均衡技術(shù),就是用來(lái)將計(jì)算資源、存儲(chǔ)資源、網(wǎng)絡(luò)資源根據(jù)實(shí)際情況進(jìn)行分配的一種技術(shù),通過(guò)多個(gè)節(jié)點(diǎn)承載服務(wù),用來(lái)達(dá)到最優(yōu)的資源利用、最快的響應(yīng)時(shí)間,實(shí)現(xiàn)了性能優(yōu)化。負(fù)載均衡的分類也有很多,有客戶端負(fù)載均衡、服務(wù)器端負(fù)載均衡、軟件負(fù)載均衡、硬件負(fù)載均衡。以服務(wù)端負(fù)載均衡為例,用戶在前端發(fā)起請(qǐng)求后,經(jīng)過(guò)網(wǎng)絡(luò)傳輸給服務(wù)端,再通過(guò)服務(wù)端的負(fù)載均衡算法去選擇對(duì)應(yīng)的服務(wù)器提供服務(wù),最常見(jiàn)的就是nginx算法了。
在負(fù)載均衡之后,便是緩存技術(shù),它是通過(guò)將訪問(wèn)的熱數(shù)據(jù)提前存起來(lái)供業(yè)務(wù)訪問(wèn),降低了數(shù)據(jù)庫(kù)壓力、降低了用戶響應(yīng)時(shí)間,實(shí)現(xiàn)了性能優(yōu)化。負(fù)載均衡把請(qǐng)求分擔(dān)為多個(gè)節(jié)點(diǎn)執(zhí)行,每個(gè)節(jié)點(diǎn)都承載著服務(wù)的提供,當(dāng)用戶請(qǐng)求從前端經(jīng)負(fù)載均衡算法分配過(guò)來(lái)后,如果直接去訪問(wèn)獲取磁盤的數(shù)據(jù)庫(kù)數(shù)據(jù),就會(huì)非常慢。如果有了緩存,在用戶請(qǐng)求到達(dá)之后,業(yè)務(wù)線程就會(huì)先訪問(wèn)緩存,如果緩存命中就直接返回用戶,如果沒(méi)有命中,則繼續(xù)請(qǐng)求磁盤數(shù)據(jù)庫(kù)數(shù)據(jù),獲取后返回用戶,同時(shí)將磁盤獲取的數(shù)據(jù)結(jié)果回寫到緩存系統(tǒng),為下次請(qǐng)求做好準(zhǔn)備。
在緩存之后便是數(shù)據(jù)庫(kù)技術(shù),緩存訪問(wèn)熱點(diǎn)數(shù)據(jù)后,執(zhí)行的交易操作需要對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行增刪改查,通過(guò)將數(shù)據(jù)庫(kù)分為主庫(kù)、讀庫(kù)、大表分為小表,讓每個(gè)用戶請(qǐng)求都能快速訪問(wèn)到數(shù)據(jù)、快速執(zhí)行操作,降低了用戶延遲,實(shí)現(xiàn)了性能優(yōu)化。數(shù)據(jù)庫(kù)的讀寫分離,使用一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器作為主數(shù)據(jù)庫(kù)(master),把業(yè)務(wù)數(shù)據(jù)都寫入該數(shù)據(jù)庫(kù),再另外使用另一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器來(lái)作為從數(shù)據(jù)庫(kù)(slave),將業(yè)務(wù)數(shù)據(jù)同步到該數(shù)據(jù)庫(kù)上,當(dāng)業(yè)務(wù)進(jìn)行讀操作時(shí)就讀取備數(shù)據(jù)庫(kù)的數(shù)據(jù)即可,這樣即緩解了數(shù)據(jù)庫(kù)壓力,又實(shí)現(xiàn)了備份。
在數(shù)據(jù)庫(kù)技術(shù)之后,便是操作系統(tǒng)級(jí)別的IO多路復(fù)用技術(shù)。我們知道一個(gè)程序運(yùn)行時(shí)是一個(gè)進(jìn)程,而程序里有很多的方法要去執(zhí)行,每個(gè)方法就是一個(gè)線程,通過(guò)并發(fā)處理客戶端的多個(gè)線程請(qǐng)求,并同時(shí)等待多個(gè)連接發(fā)送的請(qǐng)求,減少系統(tǒng)的開(kāi)銷、降低用戶延遲,實(shí)現(xiàn)了性能優(yōu)化。此外,IO多路復(fù)用也不需要額外創(chuàng)建和維護(hù)線程監(jiān)聽(tīng)客戶端的大量連接,減少了服務(wù)器的開(kāi)發(fā)和維護(hù)成本。典型的線程級(jí)別優(yōu)化技術(shù)有java線程池、數(shù)據(jù)庫(kù)連接池、PHP內(nèi)存池。
在IO多路復(fù)用技術(shù)之后,便是IO零拷貝技術(shù)。在操作系統(tǒng)一般把內(nèi)核劃分成內(nèi)核空間、用戶空間,Linux操作系統(tǒng)中讀取數(shù)據(jù)操作都是基于數(shù)據(jù)拷貝完成的,也就是說(shuō)數(shù)據(jù)會(huì)在內(nèi)核地址空間的緩沖區(qū)和用戶地址空間的緩沖區(qū)進(jìn)行拷貝,數(shù)據(jù)讀取流程一般包含四部分,
1.操作系統(tǒng)需要先從磁盤里讀取文件到內(nèi)核頁(yè)面的緩存;
2.用戶態(tài)的應(yīng)用程序從內(nèi)核態(tài)讀取數(shù)據(jù)到用戶空間緩存區(qū),由于內(nèi)核態(tài)的資源比較寶貴會(huì)經(jīng)常釋放;
3.用戶態(tài)的應(yīng)用程序還需要將數(shù)據(jù)寫回內(nèi)核空間并放入socket緩沖區(qū);
4.最后操作系統(tǒng)將數(shù)據(jù)從socket緩沖區(qū)復(fù)制到網(wǎng)卡接口,再經(jīng)由網(wǎng)絡(luò)發(fā)送給到消費(fèi)者進(jìn)程。
零拷貝技術(shù),將磁盤文件的數(shù)據(jù)復(fù)制到頁(yè)面緩存中,然后將數(shù)據(jù)從頁(yè)面緩存直接發(fā)送到網(wǎng)絡(luò)給到不同的訂閱者,避免了重復(fù)拷貝操作,極大的提高了速度,實(shí)現(xiàn)了性能優(yōu)化。
從負(fù)載均衡、緩存、數(shù)據(jù)庫(kù)到IO多路復(fù)用、IO零拷貝技術(shù),完成了單服務(wù)從業(yè)務(wù)級(jí)到操作系統(tǒng)級(jí)的性能優(yōu)化,但微服務(wù)技術(shù)的出現(xiàn)將單服務(wù)拆分成了多個(gè)微服務(wù),對(duì)于云原生、微服務(wù)時(shí)代的性能優(yōu)化,那便是RPC遠(yuǎn)程調(diào)用技術(shù)。
遠(yuǎn)程是相對(duì)本地而言的概念,本地調(diào)用存在的場(chǎng)景是在一個(gè)服務(wù)中有不同的函數(shù)實(shí)現(xiàn)不同的功能,一個(gè)函數(shù)要使用另一個(gè)函數(shù)的功能,那必然要調(diào)用它。在本地函數(shù)調(diào)用時(shí),一般會(huì)經(jīng)過(guò)這幾個(gè)步驟,即函數(shù)返回地址入棧、函數(shù)參數(shù)入棧、堆棧空間提升、函數(shù)參數(shù)復(fù)制、開(kāi)始函數(shù)調(diào)用、堆棧情況。
當(dāng)服務(wù)拆分成了微服務(wù)之后,函數(shù)是在不同的微服務(wù)、不同的機(jī)器上運(yùn)行,一臺(tái)機(jī)器想要調(diào)用另一臺(tái)機(jī)器的函數(shù)執(zhí)行某個(gè)功能,只能通過(guò)網(wǎng)絡(luò)請(qǐng)求來(lái)實(shí)現(xiàn)(借助兩個(gè)服務(wù)共同維護(hù)的關(guān)聯(lián)式容器stub),不能再像本地調(diào)用一樣使用函數(shù)指針實(shí)現(xiàn)了。有了RPC,不僅是微服務(wù)與微服務(wù)之間的調(diào)用變得簡(jiǎn)單,不同語(yǔ)言之間的調(diào)用也變得簡(jiǎn)單了。
以前JAVA語(yǔ)言想要調(diào)用C++語(yǔ)言,那是不可能的事,因?yàn)橛貌煌Z(yǔ)言寫的代碼,根本無(wú)法通信啊。而現(xiàn)在有了RPC,只要框架上支持該語(yǔ)言的解析,那么就可以了。Java語(yǔ)言傳遞過(guò)來(lái)函數(shù)1的參數(shù)1、參數(shù)2,通過(guò)RPC框架解析為C++語(yǔ)言可以識(shí)別的參數(shù)1、參數(shù)2。RPC技術(shù)通過(guò)降低了網(wǎng)絡(luò)延遲從而降低了用戶延遲,實(shí)現(xiàn)了性能優(yōu)化。
互聯(lián)網(wǎng)從網(wǎng)頁(yè)時(shí)代走向互聯(lián)網(wǎng)時(shí)代、移動(dòng)互聯(lián)網(wǎng)時(shí)代、物聯(lián)網(wǎng)時(shí)代,基礎(chǔ)設(shè)施從物理機(jī)走向虛擬機(jī)、容器,技術(shù)架構(gòu)也從單體式服務(wù)走向SOA、微服務(wù)、分布式,一切技術(shù)都在不斷的進(jìn)化演變,唯一不變的便是性能優(yōu)化技術(shù)。從單服務(wù)的負(fù)載均衡、緩存、數(shù)據(jù)庫(kù),到操作系統(tǒng)級(jí)別的IO多路復(fù)用、IO零拷貝技術(shù),再到微服務(wù)的RPC技術(shù),掌握了之后,任爾技術(shù)如何變遷,我自巋然不動(dòng)~