一種面向云架構(gòu)的高性能網(wǎng)絡(luò)接口實(shí)現(xiàn)技術(shù)
1. 2.2內(nèi)存訪問效率
本文引用地址:http://butianyuan.cn/article/270287.htm在絕大多數(shù)情況下,應(yīng)用程序并不直接通過物理內(nèi)存地址來訪問內(nèi)存,而是采用虛擬地址,當(dāng)CPU收到內(nèi)存訪問指令時(shí)會(huì)先把虛擬地址轉(zhuǎn)換成實(shí)際的物理地址,然后進(jìn)行內(nèi)存的訪問操作。這種方式已經(jīng)被普遍接受,甚至被稱作是IT時(shí)代最杰出的發(fā)明之一,但是這種非直接內(nèi)存訪問方式并不是沒有代價(jià)的,地址的翻譯需要通過頁(yè)表來完成,頁(yè)表通常情況下是儲(chǔ)存在內(nèi)存當(dāng)中的,訪問速度很慢,為了解決這個(gè)問題,大部分系統(tǒng)都采用了TLB(Tralaslation Lookaside Buffer)的方式,最近觸發(fā)的一些地址翻譯結(jié)果都會(huì)保存在TLB中,TLB實(shí)際上使用的是CPU的緩存(cache),訪問速度非???,然而cache容量小,只有最近訪問的一部分頁(yè)表項(xiàng)能保存下來,因此出現(xiàn)了“TLB Miss”;當(dāng)CPU發(fā)現(xiàn)當(dāng)前虛擬地址無(wú)法在TLB里面找到相對(duì)應(yīng)的表項(xiàng)時(shí),就引入了一個(gè)TLB Miss,此時(shí)CPU需要回到內(nèi)存當(dāng)中的頁(yè)表進(jìn)行查找,性能會(huì)顯著降低。因此當(dāng)程序需要進(jìn)行頻繁的內(nèi)存操作時(shí),需要盡量減少TLBMiss的次數(shù)。當(dāng)前系統(tǒng)定義的頁(yè)面大小一般是4k字節(jié),當(dāng)應(yīng)用程序使用比如2G這樣的大內(nèi)存時(shí),總共需要50多萬(wàn)個(gè)頁(yè)表項(xiàng),這個(gè)數(shù)目是相當(dāng)龐大的,同時(shí)因?yàn)橹挥幸恍〔糠值谋眄?xiàng)能夠裝載在TLB中,因此TLB Miss的幾率也很大。另外,一般情況下程序的虛擬內(nèi)存空間都是連續(xù)的,但其對(duì)應(yīng)的物理內(nèi)存空間卻不一定是連續(xù)的,這樣會(huì)導(dǎo)致一次虛擬內(nèi)存尋址操作可能需要進(jìn)行多次物理內(nèi)存尋址操作才能完成,這也會(huì)成倍地增加內(nèi)存訪問消耗的時(shí)間。
1.3多核親和力
多核系統(tǒng)對(duì)提高系統(tǒng)的性能有很大的幫助,當(dāng)前大部分系統(tǒng)的調(diào)度算法會(huì)把當(dāng)前的任務(wù)放到最空閑的核上執(zhí)行,這樣的好處是能夠增加CPU資源的利用率,但因?yàn)槊總€(gè)CPU核心都有自己獨(dú)立的寄存器和cache,當(dāng)任務(wù)從一個(gè)核心遷移到另一個(gè)核心時(shí),會(huì)引發(fā)大量的核問切換開銷,比如上下文切換,cache miss等等。另外,對(duì)于使用NUMA(Non-Uniform Memory Access)架構(gòu)的系統(tǒng)而言,核間切換的開銷會(huì)更大,在SMP(Svmmetric Multiprocessing)架構(gòu)下,所有核心是通過共享接口訪問內(nèi)存的,因此每個(gè)核心訪問內(nèi)存的速度是一樣的,但在NUMA架構(gòu)下,核心對(duì)內(nèi)存的訪問分為本地訪問和遠(yuǎn)程訪問。核心訪問本地內(nèi)存的速度要比訪問遠(yuǎn)端內(nèi)存的速度快很多,當(dāng)任務(wù)從核心A切換到核心B的時(shí)候,如果它仍然使用之前在A上分配的內(nèi)存,那么其內(nèi)存訪問模式會(huì)從本地模式切換成遠(yuǎn)程模式,從而引起內(nèi)存訪問速度的下降。
1.4共享隊(duì)列的訪問
當(dāng)把數(shù)據(jù)包從一個(gè)任務(wù)傳遞到另外一個(gè)任務(wù)的時(shí)候,需要用到共享隊(duì)列。通常情況下,在訪問共享隊(duì)列的時(shí)候會(huì)用到Mutex鎖來保證訪問的一致性。當(dāng)應(yīng)用程序申請(qǐng)Mutex鎖失敗之后會(huì)陷入內(nèi)核態(tài)中睡眠,當(dāng)鎖可用之后再?gòu)膬?nèi)核態(tài)切換到用戶態(tài)執(zhí)行,這里也引入了上下文切換的開銷,而且當(dāng)數(shù)據(jù)流量很大的時(shí)候,相應(yīng)的開銷也會(huì)非常大。為了消除這類開銷,業(yè)界也提出了一些改進(jìn)的方法,比如自旋鎖(spinlock),自旋鎖一直在用戶態(tài)運(yùn)行,不會(huì)陷入內(nèi)核態(tài)中,因此也不會(huì)產(chǎn)生上下文切換的開銷,但是它還是存在一些弊端:一方面可能造成死鎖,如果一個(gè)線程拿到鎖之后被意外銷毀,其它等待此鎖的線程會(huì)發(fā)生死鎖;另一方面,當(dāng)共享隊(duì)列和線程數(shù)量猛增時(shí),鎖的數(shù)量也會(huì)同時(shí)增加,對(duì)鎖的管理會(huì)給系統(tǒng)帶來很大的負(fù)擔(dān)。
2 HPNI實(shí)現(xiàn)原理
2.1傳統(tǒng)網(wǎng)絡(luò)接口實(shí)現(xiàn)模式的不足
從上述分析可以得出傳統(tǒng)網(wǎng)絡(luò)接口的實(shí)現(xiàn)主要有以下幾點(diǎn)不足:
(1)上下文切換開銷太多,這些開銷主要是由中斷、系統(tǒng)調(diào)用、鎖以及核間切換引入;
(2)內(nèi)存拷貝的開銷太多;
(3)內(nèi)存訪問效率不高,缺乏相應(yīng)的優(yōu)化;
(4)采用帶鎖共享隊(duì)列進(jìn)行數(shù)據(jù)共享,引入額外開銷;
(5)收發(fā)包操作必須經(jīng)過Linux內(nèi)核單線程完成,無(wú)法擴(kuò)展成多核多線程模式從而提高性能。
2. 2 HPNI的原理
針對(duì)上述不足,提出了一種新型的網(wǎng)絡(luò)接口實(shí)現(xiàn)模式,如圖3所示。
圖3 HPNI網(wǎng)絡(luò)接口實(shí)現(xiàn)
評(píng)論