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