基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備及其設(shè)置方法
【專利摘要】本發(fā)明基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備及其設(shè)置方法,涉及網(wǎng)絡(luò)數(shù)據(jù)傳輸領(lǐng)域,本發(fā)明是由多核計(jì)算機(jī)處理器、處理器內(nèi)存、PCIeI/O控制器、n(n≥1)個(gè)進(jìn)程模塊以及網(wǎng)卡等部分組成,并通過對(duì)系統(tǒng)的NUMA節(jié)點(diǎn)與相關(guān)部件綁定后形成運(yùn)行域,以保證進(jìn)程和網(wǎng)卡只使用離自己最近的內(nèi)存。本發(fā)明充分利用了NUMA系統(tǒng)的特性,在系統(tǒng)正常運(yùn)行的情況下,運(yùn)行域是相互獨(dú)立運(yùn)行的,一個(gè)運(yùn)行域中的進(jìn)程和網(wǎng)卡不會(huì)訪問另外一個(gè)運(yùn)行域的內(nèi)存。這樣就能發(fā)揮NUMA系統(tǒng)的最大效率。
【專利說明】基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備及其設(shè)置方法
[0001]本發(fā)明涉及網(wǎng)絡(luò)數(shù)據(jù)傳輸領(lǐng)域,特別涉及一種基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備及其設(shè)置方法。
【背景技術(shù)】
[0002]NUMACNon Uniform Memory Access Achitecture,非一致性內(nèi)存訪問或者非統(tǒng)一內(nèi)存架構(gòu))是一種用于多處理器計(jì)算機(jī)的內(nèi)存設(shè)計(jì)方案。在NUMA系統(tǒng)中,內(nèi)存訪問時(shí)間取決于處理器與內(nèi)存相對(duì)位置。也就是說,處理器訪問它自己的本地存儲(chǔ)器的速度要比訪問非本地存儲(chǔ)器的速度要塊。
[0003]英特爾公司的最新處理器,比如代號(hào)為Nehalem, Sandy Bridge和ivy bridge等至強(qiáng)處理器,都使用的是這種NUMA架構(gòu)。這些系統(tǒng)中的一個(gè)最大的變化是在處理器中整合了內(nèi)存控制器,而不像以前的處理器,把內(nèi)存控制器放在北橋芯片組中。因此,當(dāng)一個(gè)處理器要訪問另一個(gè)處理器所帶的內(nèi)存時(shí),首先要通過處理器間的鏈路才能訪問到對(duì)方的內(nèi)存,這就比訪問本地內(nèi)存所花費(fèi)的時(shí)間多。
[0004]英特爾公司的另外一項(xiàng)技術(shù):QuickPath interconnect (QPI)互聯(lián)技術(shù),來連接處理器與處理器,以及處理器和外部I/O的連接。這是一種點(diǎn)對(duì)點(diǎn)的連接方式,替代了以前的總線共享方式。這種技術(shù)雖然能減輕訪問遠(yuǎn)端節(jié)點(diǎn)的耗費(fèi),但并不能完全去掉,因此從本質(zhì)上說,訪問本地和遠(yuǎn)程內(nèi)存的差異使得這些多核處理器系統(tǒng)成為了符合NUMA架構(gòu)的系統(tǒng)。
[0005]另外,代號(hào)為sandy bridge處理器還把PC1-express I/O (新一代的總線接口)子系統(tǒng)集成到芯片中,并與芯片中的其他部分,如:處理器核心,處理器的高速緩存,集成的內(nèi)存控制器,以及QPI代理,通過一個(gè)32位的雙向環(huán)直接相連。這種連接方式大大減少了PC1-express設(shè)備的訪問延遲。根據(jù)英特爾公司的測(cè)量的數(shù)據(jù),讀取本地的數(shù)據(jù)會(huì)減少32%延遲。除此之外,英特爾的DD1技術(shù)(Data Direct 1/0,直接的I/O的橋)可以使PCIe網(wǎng)卡直接讀寫處理器的高速緩存,而不必先寫到內(nèi)存,再到高速緩存。這樣不但減少了功耗,還進(jìn)一步減少了訪問的延遲。在這種架構(gòu)下,處理器很容易處理萬兆級(jí)別的以太網(wǎng)絡(luò)。如圖1中顯示的是兩個(gè)NUMA節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)包含了一個(gè)六個(gè)核心的處理器以及與它直連的內(nèi)存。
[0006]為了適應(yīng)上述硬件系統(tǒng)的發(fā)展,現(xiàn)代操作系統(tǒng),比如linux/FreeBSD,做了很多改進(jìn)。與NUMA方面的相關(guān)改進(jìn)有:①實(shí)現(xiàn)了根據(jù)NUMA節(jié)點(diǎn)信息來分配內(nèi)存。②進(jìn)程的綁定:當(dāng)進(jìn)程需要運(yùn)行時(shí),操作系統(tǒng)會(huì)根據(jù)某種調(diào)度算法來選擇一個(gè)計(jì)算機(jī)核給這個(gè)進(jìn)程,當(dāng)運(yùn)行一段時(shí)間或者需要睡眠時(shí),又會(huì)被調(diào)度出去,等待再次被調(diào)度運(yùn)行。但進(jìn)程調(diào)度往往不會(huì)考慮已使用的內(nèi)存在哪個(gè)節(jié)點(diǎn)上,因此進(jìn)程有個(gè)可能會(huì)從一個(gè)處理器的核心遷移到另外一個(gè)處理器的核心。如果進(jìn)程在第一個(gè)處理器中分配內(nèi)存,而在調(diào)度到第二個(gè)處理器使用這些內(nèi)存,那就會(huì)影響系統(tǒng)的性能。操作系統(tǒng)提供的綁定功能是指進(jìn)程只能在所指定的幾個(gè)處理器核心上運(yùn)行,這樣可以使得被綁定的進(jìn)程訪問數(shù)據(jù)都在本地節(jié)點(diǎn)中。
[0007]作為網(wǎng)絡(luò)設(shè)備,必須盡快地處理包,提高網(wǎng)絡(luò)的吞吐,減少延遲。目前該領(lǐng)域已有技術(shù)中,有的采用虛擬化技術(shù)來使用NUMA服務(wù)器,根據(jù)NUMA節(jié)點(diǎn)把系統(tǒng)分成幾個(gè)獨(dú)立的系統(tǒng),雖然實(shí)現(xiàn)起來簡(jiǎn)單,但多個(gè)虛擬系統(tǒng)整合起來很不方便,性能方面也會(huì)有不少損失。
[0008]另外的方法是采用操作系統(tǒng)提供有些基本功能,比如進(jìn)程綁定和NUMA內(nèi)存分配功能,來對(duì)系統(tǒng)進(jìn)行調(diào)優(yōu),以減少對(duì)遠(yuǎn)程系統(tǒng)內(nèi)存的訪問所帶來的開銷。但這些只是些通用的功能,并沒有為網(wǎng)絡(luò)產(chǎn)品提供完整的解決方案。目前的操作系統(tǒng),例如linux/unix雖然都支持了此方法,但都不能有效的解決NUMA所引起的內(nèi)存訪問沖突的問題,從而不能100%的有效發(fā)揮硬件的性能。
[0009]再次,上述已有技術(shù)沒充分利用現(xiàn)有處理器架構(gòu),即把PCIe總線控制器集成到處理器的特性。目前網(wǎng)卡技術(shù)已經(jīng)發(fā)展到采用PCIe接口,上述已有技術(shù)尚未充分利用這點(diǎn)來提高網(wǎng)口的性能。
【發(fā)明內(nèi)容】
[0010]為克服已有技術(shù)中存在的問題,本發(fā)明的目的是提供一種基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備及設(shè)置方法,在充分發(fā)揮現(xiàn)有硬件技術(shù)發(fā)展性能的基礎(chǔ)上使得訪問系統(tǒng)高效率、且用戶操作方便。
[0011]基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備,包括多核計(jì)算機(jī)處理器、處理器內(nèi)存、PCIel/O控制器、n (n ^ I)個(gè)進(jìn)程模塊以及網(wǎng)卡,所述的進(jìn)程模塊或稱工作進(jìn)程模塊,可以是內(nèi)核線程,以下統(tǒng)稱進(jìn)程,所述的進(jìn)程綁定在一個(gè)核心或者同一個(gè)處理器上的不同核心上。其中η個(gè)進(jìn)程模塊并發(fā)處理不同網(wǎng)絡(luò)協(xié)議的數(shù)據(jù)包,每個(gè)進(jìn)程模塊綁定在所述多核處理器的一個(gè)核心或者同一個(gè)處理器的m(m> I)個(gè)核心上,并同時(shí)與所述多核處理器的PCIel/O控制器綁定,以形成由多核處理器、處理器內(nèi)存及PCIel/O控制器構(gòu)成的運(yùn)行域。
[0012]進(jìn)一步地,所述的運(yùn)行域間保持相互獨(dú)立,所述的η個(gè)進(jìn)程在所述的運(yùn)行域中處理各自的數(shù)據(jù)包。
[0013]進(jìn)一步地,所述的運(yùn)行域根據(jù)多核計(jì)算機(jī)處理器的NUMA節(jié)點(diǎn)情況劃分,每個(gè)運(yùn)行域至少包括一個(gè)NUMA節(jié)點(diǎn)以保證進(jìn)程和網(wǎng)卡使用離自己較近的內(nèi)存。
[0014]進(jìn)一步地,所述的網(wǎng)卡和與其相連的、內(nèi)嵌于處理器的PCIe I/O控制器所在的運(yùn)行域綁定,由該運(yùn)行域的進(jìn)程來處理所述網(wǎng)卡的數(shù)據(jù)包。
[0015]基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備設(shè)置方法,包括以下步驟:
[0016]步驟1,根據(jù)主板提供的信息,確定系統(tǒng)的NUMA節(jié)點(diǎn)數(shù)、每個(gè)節(jié)點(diǎn)的處理器核心、以及每個(gè)節(jié)點(diǎn)所帶的物理內(nèi)存地址的范圍,并記錄這些信息以供內(nèi)存分配的時(shí)候使用;
[0017]步驟2,初始化網(wǎng)卡:根據(jù)PCI總線探測(cè)的結(jié)果,獲得所述網(wǎng)卡屬于哪個(gè)主橋(HostBridge,主板上離CPU最近的芯片)下,找到該主橋?qū)?yīng)的處理器,從而確定它所在的運(yùn)行域;
[0018]步驟3,啟動(dòng)進(jìn)程:根據(jù)配置把進(jìn)程綁定到相應(yīng)的處理器核心上,進(jìn)程初始化全局變量。
[0019]進(jìn)一步地,上述步驟3所述的進(jìn)程,它們的主函數(shù)操作包括以下分步驟:
[0020]—通過查詢的方式,看本進(jìn)程綁定的網(wǎng)卡隊(duì)列中是否接收到了網(wǎng)絡(luò)數(shù)據(jù)包,如果有,則從該隊(duì)列中拿出來,然后根據(jù)固定的算法,把網(wǎng)絡(luò)數(shù)據(jù)包放在某個(gè)進(jìn)程的接收隊(duì)列中,等待它做網(wǎng)絡(luò)協(xié)議層方面的處理,算法根據(jù)網(wǎng)絡(luò)協(xié)議有所不同;
[0021]—上面的操作會(huì)使網(wǎng)卡的接收隊(duì)列空出新的空間,所以需要用新的空閑內(nèi)存來填,進(jìn)程從網(wǎng)卡所屬的運(yùn)行域中獲得內(nèi)存,并把內(nèi)存地址寫到網(wǎng)卡的接收隊(duì)列中;
[0022]—查詢網(wǎng)卡發(fā)送隊(duì)列是否有數(shù)據(jù)包已經(jīng)發(fā)出去了,有的話,則釋放相應(yīng)的內(nèi)存;
[0023]—如果進(jìn)程的發(fā)送隊(duì)列中有數(shù)據(jù)包要發(fā)送,則把數(shù)據(jù)包發(fā)到網(wǎng)卡的發(fā)送隊(duì)列中;
[0024]—進(jìn)程從自己的接收隊(duì)列中獲得數(shù)據(jù)包,并對(duì)其進(jìn)行網(wǎng)絡(luò)協(xié)議層方面的處理。如果有數(shù)據(jù)包需要發(fā)出去,先放在進(jìn)程的發(fā)送隊(duì)列中,進(jìn)程發(fā)送隊(duì)列的數(shù)據(jù)包通過所述網(wǎng)卡發(fā)送隊(duì)列發(fā)送出去。
[0025]進(jìn)一步地,上述步驟I中所述的內(nèi)存分配包括普通內(nèi)存分配和網(wǎng)絡(luò)內(nèi)存分配,所述普通內(nèi)存分配包括以下分步驟:
[0026]——先確定從哪個(gè)運(yùn)行域中分配內(nèi)存,如果輸入?yún)?shù)中沒指定,則根據(jù)當(dāng)前進(jìn)程所在的運(yùn)行域中分配內(nèi)存,否則,從指定的運(yùn)行域中分配;
[0027]——如果該運(yùn)行域中有內(nèi)存,則從系統(tǒng)的該運(yùn)行域中分配所需內(nèi)存,否則,
[0028]——如果遠(yuǎn)端域中有內(nèi)存,則從其他運(yùn)行域中獲得,否則,
[0029]——分配失敗。
[0030]進(jìn)一步地,所述的網(wǎng)絡(luò)內(nèi)存為每個(gè)并行處理的進(jìn)程配置網(wǎng)絡(luò)內(nèi)存緩存模塊,以便于高速處理網(wǎng)絡(luò)數(shù)據(jù)包。
[0031]進(jìn)一步地,所述的為每個(gè)進(jìn)程配置網(wǎng)絡(luò)內(nèi)存緩存模塊分為鏈表和環(huán)形隊(duì)列兩級(jí):
[0032]第一級(jí)是個(gè)鏈表,包括有頭指針,鏈表長度和這個(gè)鏈表允許的最大長度等字段。釋放內(nèi)存的時(shí)候,如果長度不超過鏈表的最大長度,則都插到鏈表中。否則,就掛到自己的隊(duì)列中(如果隊(duì)列也沒滿)。分配內(nèi)存的時(shí)候,如果鏈表中有內(nèi)存就從鏈表中分配。如果沒有,就從其他進(jìn)程的環(huán)形隊(duì)列轉(zhuǎn)移一些網(wǎng)絡(luò)內(nèi)存到自己的鏈表中,然后再從鏈表中分配內(nèi)存。
[0033]第二級(jí)為環(huán)形隊(duì)列,環(huán)形隊(duì)列是進(jìn)程間用來交換內(nèi)存的,因?yàn)橛锌赡苣承┻M(jìn)程累積的內(nèi)存多,有些累積的少。少的進(jìn)程就可以從多的進(jìn)程的隊(duì)列里獲得內(nèi)存,而不必從系統(tǒng)中獲得內(nèi)存。環(huán)形隊(duì)列本質(zhì)上是個(gè)指針數(shù)組,有寫指針和讀指針。寫指針由自己來控制(因此不需要互斥鎖來避免并發(fā)),當(dāng)所述自己的鏈表已滿,則把內(nèi)存插入到本進(jìn)程的隊(duì)列中。讀指針由其它的進(jìn)程操作,因此有個(gè)互斥鎖來避免并發(fā)操作產(chǎn)生的沖突。其它的進(jìn)程操作前必須獲得隊(duì)列的互斥鎖,然后才能從隊(duì)列中獲得內(nèi)存,并移動(dòng)讀指針。
[0034]進(jìn)一步地,所述的為每個(gè)進(jìn)程配置網(wǎng)絡(luò)內(nèi)存緩存模塊的分步驟如下:
[0035]—如果本進(jìn)程鏈表內(nèi)有空閑的內(nèi)存,則分配并返回;否則,
[0036]—從本進(jìn)程的環(huán)形隊(duì)列開始,依次遍歷同運(yùn)行域中的所有進(jìn)程的環(huán)形隊(duì)列:首先嘗試獲得該環(huán)形隊(duì)列的互斥鎖:如果能拿到互斥鎖,則把該隊(duì)列上所有的空閑內(nèi)存移到本進(jìn)程的鏈表中,然后分配一個(gè)內(nèi)存并退出。如果隊(duì)列中沒有空閑內(nèi)存或則是不能拿到互斥鎖,則嘗試下一個(gè)進(jìn)程的環(huán)形隊(duì)列,直到遍歷完所有進(jìn)程的環(huán)形隊(duì)列;
[0037]—如果所有的環(huán)形隊(duì)列都沒有空閑內(nèi)存,則從該運(yùn)行域的系統(tǒng)內(nèi)存中獲得。
[0038]進(jìn)一步地,所述的進(jìn)程釋放內(nèi)存的分步驟如下:
[0039]——如果本進(jìn)程的鏈表長度小于設(shè)定的最大長度,則把要釋放的內(nèi)存插到鏈表中;否則,
[0040]—如果本進(jìn)程的環(huán)形隊(duì)列還沒滿,則把空閑隊(duì)列掛上去,并修改寫指針;否則,
[0041]——把所述內(nèi)存釋放到系統(tǒng)中。
[0042]本發(fā)明充分利用了 NUMA系統(tǒng)的特性,在系統(tǒng)正常運(yùn)行的情況下,運(yùn)行域是相互獨(dú)立運(yùn)行的,一個(gè)運(yùn)行域中的進(jìn)程和網(wǎng)卡不會(huì)訪問另外一個(gè)運(yùn)行域的內(nèi)存。這樣就能發(fā)揮NUMA系統(tǒng)的最大效率。本發(fā)明設(shè)計(jì)從硬件結(jié)構(gòu)入手,改造系統(tǒng)軟件,讓它更符合NUMA系統(tǒng)的特性,以減少內(nèi)存訪問所帶來的損耗,有效發(fā)揮硬件所能提供的性能。
【專利附圖】
【附圖說明】
[0043]圖1是已有技術(shù)中NUMA系統(tǒng)結(jié)構(gòu)示意圖;
[0044]圖2是本發(fā)明NUMA系統(tǒng)的網(wǎng)絡(luò)設(shè)備結(jié)構(gòu)示意圖;
[0045]圖3是本發(fā)明系統(tǒng)的運(yùn)行域?yàn)槊總€(gè)進(jìn)程配置網(wǎng)絡(luò)內(nèi)存緩存模塊的流程框圖?!揪唧w實(shí)施方式】
[0046]在以下的敘述中,為了使讀者更好地理解本申請(qǐng)而提出了許多技術(shù)細(xì)節(jié)。但是,本領(lǐng)域的普通技術(shù)人員可以理解,即使沒有這些技術(shù)細(xì)節(jié)和基于以下各實(shí)施方式的種種變化和修改,也可以實(shí)現(xiàn)本申請(qǐng)各權(quán)利要求所要求保護(hù)的技術(shù)方案。
[0047]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對(duì)本發(fā)明的實(shí)施方式作進(jìn)一步地詳細(xì)描述。
[0048]如圖2所示,基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備,包括多核計(jì)算機(jī)處理器110、處理器內(nèi)存120、PCIEI/0控制器140、η (η≥1)個(gè)進(jìn)程模塊130以及網(wǎng)卡150,其中η個(gè)進(jìn)程模塊并發(fā)處理不同網(wǎng)絡(luò)協(xié)議的數(shù)據(jù)包,所述的進(jìn)程或稱工作進(jìn)程可以是內(nèi)核線程,每個(gè)進(jìn)程模塊綁定在所述多核處理器的一個(gè)核心或者同一個(gè)處理器的m(m> I)個(gè)不同核心上,并同時(shí)與所述多核處理器的PCIEI/0控制器綁定,以形成由多核處理器、處理器內(nèi)存及PCIEI/0控制器構(gòu)成的運(yùn)行域100,所述的運(yùn)行域間保持相互獨(dú)立,所述的η個(gè)進(jìn)程在所述的運(yùn)行域中處理各自的數(shù)據(jù)包。所述的運(yùn)行域根據(jù)多核計(jì)算機(jī)處理器的NUMA節(jié)點(diǎn)情況劃分,每個(gè)運(yùn)行域至少包括一個(gè)NUMA節(jié)點(diǎn)以保證進(jìn)程和網(wǎng)卡使用離自己較近的內(nèi)存。由于進(jìn)程屬于一個(gè)運(yùn)行域,通過這種方法很容易把網(wǎng)卡綁定到離它較近的運(yùn)行域中,所述的網(wǎng)卡應(yīng)采用PCIe接口的網(wǎng)卡。一般來說,萬兆網(wǎng)卡都有多個(gè)發(fā)送和接收隊(duì)列,如上所述可以把不同的一對(duì)發(fā)送和接收隊(duì)列綁定到同一個(gè)運(yùn)行域的不同進(jìn)程中。
[0049]進(jìn)一步地,所述的網(wǎng)卡和與其相連的、內(nèi)嵌于處理器的PCIe PCIEI/0控制器所在的運(yùn)行域綁定,由該運(yùn)行域的進(jìn)程來處理所述網(wǎng)卡的數(shù)據(jù)包。
[0050]上述進(jìn)程和網(wǎng)卡的運(yùn)行域固定下來以后,我們就能根據(jù)就近原則從它們所屬的運(yùn)行域中分配內(nèi)存。一方面,避免訪問遠(yuǎn)程節(jié)點(diǎn)所帶來的額外延遲;另一方面,減少不同處理器訪問同一個(gè)內(nèi)存所帶來的訪問沖突。為此,我們改造了系統(tǒng)內(nèi)存的分配函數(shù),以便從指定的運(yùn)行域中分配內(nèi)存,當(dāng)指定的運(yùn)行域中沒有可用內(nèi)存以后,才到其它運(yùn)行域中獲取內(nèi)存,例如較遠(yuǎn)端的運(yùn)行域中獲取內(nèi)存。
[0051]同時(shí),為了排除操作系統(tǒng)對(duì)加載進(jìn)程的影響,每個(gè)進(jìn)程使用的全局變量數(shù)組應(yīng)當(dāng)動(dòng)態(tài)分配,通過改造后的內(nèi)存分配函數(shù),從它所屬的運(yùn)行域中分配。此外,進(jìn)程的運(yùn)行棧也必須從它所在運(yùn)行域的內(nèi)存中分配??偟脑瓌t是,進(jìn)程所需要的內(nèi)存都從它所屬的運(yùn)行域中獲得。
[0052]基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備設(shè)置方法,包括以下步驟:
[0053]步驟1,根據(jù)主板提供的信息,確定系統(tǒng)的NUMA節(jié)點(diǎn)數(shù)、每個(gè)節(jié)點(diǎn)的處理器核心、以及每個(gè)節(jié)點(diǎn)所帶的物理內(nèi)存地址的范圍,并記錄這些信息以供內(nèi)存分配的時(shí)候使用;
[0054]步驟2,初始化網(wǎng)卡:根據(jù)PCI總線探測(cè)的結(jié)果,獲得所述網(wǎng)卡屬于哪個(gè)主橋(HostBridge,主板上離CPU最近的芯片)下,也就可以知道它與哪個(gè)處理器離得近,從而確定它所在的運(yùn)行域;此步驟用于確定網(wǎng)卡與進(jìn)程的關(guān)系,也就是確定由哪個(gè)進(jìn)程來處理網(wǎng)卡的流量,原則是網(wǎng)卡必須由同一個(gè)運(yùn)行域中的進(jìn)程來處理;
[0055]步驟3,啟動(dòng)進(jìn)程:根據(jù)配置把進(jìn)程綁定到相應(yīng)的處理器核心上,進(jìn)程初始化全局變量,在這個(gè)時(shí)候可以從進(jìn)程所屬的運(yùn)行域中獲得。一般來說,每個(gè)處理器核心上都有一個(gè)進(jìn)程,我們給在同一個(gè)運(yùn)行域的進(jìn)程從“O”開始統(tǒng)一編號(hào)。
[0056]進(jìn)一步地,步驟3所述的在同一個(gè)運(yùn)行域的進(jìn)程,它們的主函數(shù)操作包括以下分步驟:
[0057]—通過查詢的方式,看自己綁定的網(wǎng)卡隊(duì)列中是否接收到了網(wǎng)絡(luò)數(shù)據(jù)包,如果有,則從該隊(duì)列中拿出來,然后根據(jù)固定的算法,把網(wǎng)絡(luò)數(shù)據(jù)包放在某個(gè)進(jìn)程的接收隊(duì)列中,等待它做網(wǎng)絡(luò)協(xié)議層方面的處理,算法根據(jù)網(wǎng)絡(luò)協(xié)議有所不同,例如,對(duì)于TCP和UDP,可以根據(jù)數(shù)據(jù)包的源端口和目的端口相加,然后與運(yùn)行域中總進(jìn)程數(shù)取模來獲得目的進(jìn)程的編號(hào);
[0058]—上面的操作會(huì)使網(wǎng)卡的接收隊(duì)列空出新的空間,所以需要用新的空閑內(nèi)存來填,進(jìn)程從網(wǎng)卡所屬的運(yùn)行域中獲得內(nèi)存,并把內(nèi)存地址寫到網(wǎng)卡的接收隊(duì)列中;
[0059]—查詢網(wǎng)卡發(fā)送隊(duì)列是否有數(shù)據(jù)包已經(jīng)發(fā)出去了,有的話,則釋放相應(yīng)的內(nèi)存;
[0060]—如果進(jìn)程的發(fā)送隊(duì)列中有數(shù)據(jù)包要發(fā)送,則把數(shù)據(jù)包發(fā)到網(wǎng)卡的發(fā)送隊(duì)列中;
[0061]—進(jìn)程從自己的接收隊(duì)列中獲得數(shù)據(jù)包,并對(duì)其進(jìn)行網(wǎng)絡(luò)協(xié)議層方面的處理。如果有數(shù)據(jù)包需要發(fā)出去,先放在進(jìn)程的發(fā)送隊(duì)列中,進(jìn)程發(fā)送隊(duì)列的數(shù)據(jù)包通過所述網(wǎng)卡發(fā)送隊(duì)列發(fā)送出去。
[0062]進(jìn)一步地,上述步驟I中所述的內(nèi)存分配包括普通內(nèi)存分配和網(wǎng)絡(luò)內(nèi)存分配,網(wǎng)絡(luò)內(nèi)存是給網(wǎng)絡(luò)模塊用的,用于保存網(wǎng)卡收發(fā)的數(shù)據(jù)包,它有固定大小,例如2048字節(jié),大于以太網(wǎng)幀的最大長度。除了網(wǎng)絡(luò)內(nèi)存,就是普通內(nèi)存。所述普通內(nèi)存分配包括以下分步驟:
[0063]——先確定從哪個(gè)運(yùn)行域中分配內(nèi)存,如果輸入?yún)?shù)中沒指定,則根據(jù)當(dāng)前進(jìn)程所在的運(yùn)行域中分配內(nèi)存,否則,從指定的運(yùn)行域中分配;
[0064]—如果該運(yùn)行域中有內(nèi)存,則從系統(tǒng)的該運(yùn)行域中分配所需內(nèi)存,否則,
[0065]——如果遠(yuǎn)端域中有內(nèi)存,則從其他運(yùn)行域中獲得,否則,
[0066]——分配失敗。
[0067]一般高速網(wǎng)絡(luò)每秒要處理幾百萬個(gè)包,上述普通內(nèi)存的分配方式明顯不能適應(yīng)這樣的網(wǎng)絡(luò)狀況。因此為了更有效的發(fā)送和接收數(shù)據(jù)包,我們給每個(gè)并行處理的進(jìn)程增加了一層內(nèi)存緩存模塊。當(dāng)需要內(nèi)存的時(shí)候,先看該緩存中有沒有,如果有就從中分配,否則按上面說的普通內(nèi)存分配方式從系統(tǒng)中分配。當(dāng)釋放內(nèi)存的時(shí)候,先釋放到內(nèi)存緩存模塊中,當(dāng)內(nèi)存緩存模塊已滿則釋放到系統(tǒng)中。
[0068]進(jìn)一步地,所述的網(wǎng)絡(luò)內(nèi)存為每個(gè)并行處理的進(jìn)程配置網(wǎng)絡(luò)內(nèi)存緩存模塊,以便于高速處理網(wǎng)絡(luò)數(shù)據(jù)包。
[0069]進(jìn)一步地,所述的為每個(gè)進(jìn)程配置網(wǎng)絡(luò)內(nèi)存緩存模塊分為鏈表和環(huán)形隊(duì)列兩級(jí):
[0070]第一級(jí)是個(gè)鏈表,包括有頭指針,鏈表長度和這個(gè)鏈表允許的最大長度等字段。釋放內(nèi)存的時(shí)候,如果長度不超過鏈表的最大長度,則都插到鏈表中。否則,就掛到自己的隊(duì)列中(如果隊(duì)列也沒滿)。分配內(nèi)存的時(shí)候,如果鏈表中有內(nèi)存就從鏈表中分配。如果沒有,就從其他進(jìn)程的環(huán)形隊(duì)列轉(zhuǎn)移一些網(wǎng)絡(luò)內(nèi)存到自己的鏈表中,然后再從鏈表中分配內(nèi)存。
[0071]第二級(jí)為環(huán)形隊(duì)列,環(huán)形隊(duì)列是進(jìn)程間用來交換內(nèi)存的,因?yàn)橛锌赡苣承┻M(jìn)程累積的內(nèi)存多,有些累積的少。少的進(jìn)程就可以從多的進(jìn)程的隊(duì)列里獲得內(nèi)存,而不必從系統(tǒng)中獲得內(nèi)存。環(huán)形隊(duì)列本質(zhì)上是個(gè)指針數(shù)組,有寫指針和讀指針。寫指針由自己來控制(因此不需要互斥鎖來避免并發(fā)),當(dāng)所述自己的鏈表已滿,則把內(nèi)存插入到本進(jìn)程的隊(duì)列中。讀指針由其它的進(jìn)程操作,因此有個(gè)互斥鎖來避免并發(fā)操作產(chǎn)生的沖突。其它的進(jìn)程操作前必須獲得隊(duì)列的互斥鎖,然后才能從隊(duì)列中獲得內(nèi)存,并移動(dòng)讀指針。
[0072]進(jìn)一步地,如圖3所示,所述的為每個(gè)進(jìn)程配置網(wǎng)絡(luò)內(nèi)存緩存模塊的分步驟如下:
[0073]—如果本進(jìn)程鏈表內(nèi)有空閑的內(nèi)存,則分配并返回;否則,
[0074]從本進(jìn)程的環(huán)形隊(duì)列開始,依次遍歷同運(yùn)行域中的所有進(jìn)程的環(huán)形隊(duì)列:首先嘗試獲得該環(huán)形隊(duì)列的互斥鎖:如果能拿到互斥鎖,則把該隊(duì)列上所有的空閑內(nèi)存移到本進(jìn)程的鏈表中,然后分配一個(gè)內(nèi)存并退出。如果隊(duì)列中沒有空閑內(nèi)存或則是不能拿到互斥鎖,則嘗試下一個(gè)進(jìn)程的環(huán)形隊(duì)列,直到遍歷完所有進(jìn)程的環(huán)形隊(duì)列;
[0075]—如果所有的環(huán)形隊(duì)列都沒有空閑內(nèi)存,則從該運(yùn)行域的系統(tǒng)內(nèi)存中獲得。
[0076]進(jìn)一步地,所述的進(jìn)程釋放內(nèi)存的分步驟如下:
[0077]——如果本進(jìn)程的鏈表長度小于設(shè)定的最大長度,則把要釋放的內(nèi)存插到鏈表中;否則,
[0078]—如果本進(jìn)程的環(huán)形隊(duì)列還沒滿,則把空閑隊(duì)列掛上去,并修改寫指針;否則,
[0079]——把所述內(nèi)存釋放到系統(tǒng)中。
[0080]采用本發(fā)明的網(wǎng)絡(luò)產(chǎn)品使用的是通用服務(wù)器主板,比其他專業(yè)網(wǎng)絡(luò)處理平臺(tái)相t匕,它的優(yōu)點(diǎn)是成本低,設(shè)計(jì)靈活。雖然硬件上沒專業(yè)的網(wǎng)絡(luò)處理器強(qiáng)大,但如果能隨著英特爾公司硬件的發(fā)展,采用多核多進(jìn)程技術(shù),并充分利用新的NUMA架構(gòu)平臺(tái)優(yōu)勢(shì),也可以達(dá)到理想的性能。本發(fā)明設(shè)計(jì)從硬件結(jié)構(gòu)入手,改造系統(tǒng)軟件,讓它更符合NUMA系統(tǒng)的特性,以減少內(nèi)存訪問所帶來的損耗,有效發(fā)揮硬件所能提供的性能。
[0081]需要說明的是,本發(fā)明各設(shè)備實(shí)施方式中提到的各單元都是邏輯單元,在物理上,一個(gè)邏輯單元可以是一個(gè)物理單元,也可以是一個(gè)物理單元的一部分,還可以以多個(gè)物理單元的組合實(shí)現(xiàn),這些邏輯單元本身的物理實(shí)現(xiàn)方式并不是最重要的,這些邏輯單元所實(shí)現(xiàn)的功能的組合才是解決本發(fā)明所提出的技術(shù)問題的關(guān)鍵。此外,為了突出本發(fā)明的創(chuàng)新部分,本發(fā)明沒有引入上述各設(shè)備實(shí)施方式以及與解決本發(fā)明所提出的技術(shù)問題關(guān)系不太密切的單元,但這并不表明不存在上述設(shè)備實(shí)施方式以及其它有關(guān)實(shí)施單元。
[0082]雖然通過參照本發(fā)明的某些優(yōu)選實(shí)施方式,已經(jīng)對(duì)本發(fā)明進(jìn)行了圖示和描述,但本領(lǐng)域的普通技術(shù)人員應(yīng)該明白,可以在形式上和細(xì)節(jié)上對(duì)其作各種改變,而不偏離本發(fā)明的精神和范圍。
【權(quán)利要求】
1.一種基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備,包括多核計(jì)算機(jī)處理器、處理器內(nèi)存、PCIel/O控制器、η (η ^ I)個(gè)進(jìn)程模塊以及網(wǎng)卡,其特征是η個(gè)進(jìn)程模塊并發(fā)處理不同網(wǎng)絡(luò)協(xié)議的數(shù)據(jù)包,每個(gè)進(jìn)程模塊綁定在所述多核處理器的一個(gè)核心或者同一個(gè)處理器的m(m≥I)個(gè)核心上,并同時(shí)與所述多核處理器的PCIel/O控制器綁定,以形成由多核處理器、處理器內(nèi)存及PCIel/O控制器構(gòu)成的運(yùn)行域。
2.根據(jù)權(quán)利要求1所述的基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備,其特征是所述的運(yùn)行域間保持相互獨(dú)立,所述的η個(gè)進(jìn)程模塊在所述的運(yùn)行域中處理各自的數(shù)據(jù)包。
3.根據(jù)權(quán)利要求1或2所述的基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備,其特征是所述的運(yùn)行域根據(jù)多核計(jì)算機(jī)處理器的NUMA節(jié)點(diǎn)情況劃分,每個(gè)運(yùn)行域至少包括一個(gè)NUMA節(jié)點(diǎn)以保證進(jìn)程和網(wǎng)卡使用離自己較近的內(nèi)存。
4.根據(jù)權(quán)利要求1或2所述的基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備,其特征是所述的網(wǎng)卡和與其相連的、內(nèi)嵌于處理器的PCIe I/O控制器所在的運(yùn)行域綁定,由該運(yùn)行域的進(jìn)程來處理所述網(wǎng)卡的數(shù)據(jù)包。
5.一種基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備設(shè)置方法,其特征是包括以下步驟: 步驟1,根據(jù)主板提供的信息,確定系統(tǒng)的NUMA節(jié)點(diǎn)數(shù)、每個(gè)節(jié)點(diǎn)的處理器核心、以及每個(gè)節(jié)點(diǎn)所帶的物理內(nèi)存地址的范圍,并記錄這些信息以供內(nèi)存分配的時(shí)候使用; 步驟2,初始化網(wǎng)卡:根據(jù)PCI總線探測(cè)的結(jié)果,獲得所述網(wǎng)卡屬于哪個(gè)主橋下,找到該主橋?qū)?yīng)的處理器,從而確定它所在的運(yùn)行域; 步驟3,啟動(dòng)進(jìn)程:根據(jù)配置把進(jìn)程綁定到相應(yīng)的處理器核心上,進(jìn)程初始化全局變量。
6.根據(jù)權(quán)利要求5所述的基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備設(shè)置方法,其特征是上述步驟3所述的進(jìn)程,其主函數(shù)操作包括以下分步驟: —通過查詢的方式,看自己綁定的網(wǎng)卡隊(duì)列中是否接收到了網(wǎng)絡(luò)數(shù)據(jù)包,如果有,則從該隊(duì)列中拿出來,然后根據(jù)固定的算法,把網(wǎng)絡(luò)數(shù)據(jù)包放在某個(gè)進(jìn)程的接收隊(duì)列中,等待它做網(wǎng)絡(luò)協(xié)議層方面的處理,算法根據(jù)網(wǎng)絡(luò)協(xié)議有所不同; —上面的操作會(huì)使網(wǎng)卡的接收隊(duì)列空出新的空間,所以需要用新的空閑內(nèi)存來填,進(jìn)程從網(wǎng)卡所屬的運(yùn)行域中獲得內(nèi)存,并把內(nèi)存地址寫到網(wǎng)卡的接收隊(duì)列中; —查詢網(wǎng)卡發(fā)送隊(duì)列是否有數(shù)據(jù)包已經(jīng)發(fā)出去了,有的話,則釋放相應(yīng)的內(nèi)存; —如果進(jìn)程的發(fā)送隊(duì)列中有數(shù)據(jù)包要發(fā)送,則把數(shù)據(jù)包發(fā)到網(wǎng)卡的發(fā)送隊(duì)列中;——進(jìn)程從自己的接收隊(duì)列中獲得數(shù)據(jù)包,并對(duì)其進(jìn)行網(wǎng)絡(luò)協(xié)議層方面的處理。如果有數(shù)據(jù)包需要發(fā)出去,先放在進(jìn)程的發(fā)送隊(duì)列中,進(jìn)程發(fā)送隊(duì)列的數(shù)據(jù)包通過所述網(wǎng)卡發(fā)送隊(duì)列發(fā)送出去。
7.根據(jù)權(quán)利要求5所述的基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備設(shè)置方法,其特征是上述步驟I中所述的內(nèi)存分配包括普通內(nèi)存分配和網(wǎng)絡(luò)內(nèi)存分配,所述普通內(nèi)存分配包括以下分步驟: ——先確定從哪個(gè)運(yùn)行域中分配內(nèi)存,如果輸入?yún)?shù)中沒指定,則根據(jù)當(dāng)前進(jìn)程所在的運(yùn)行域中分配內(nèi)存,否則,從指定的運(yùn)行域中分配; ——如果該運(yùn)行域中有內(nèi)存,則從系統(tǒng)的該運(yùn)行域中分配所需內(nèi)存,否則, ——如果遠(yuǎn)程運(yùn)行域中有內(nèi)存,則從其他運(yùn)行域中獲得,否則,—分配失敗。
8.根據(jù)權(quán)利要求7所述的基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備設(shè)置方法,其特征是所述的網(wǎng)絡(luò)內(nèi)存為每個(gè)并行處理的進(jìn)程配置網(wǎng)絡(luò)內(nèi)存緩存模塊,以便于高速處理網(wǎng)絡(luò)數(shù)據(jù)包。
9.根據(jù)權(quán)利要求8所述的基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備設(shè)置方法,其特征是所述的為每個(gè)并行處理的進(jìn)程配置網(wǎng)絡(luò)內(nèi)存緩存模塊分為鏈表和環(huán)形隊(duì)列兩級(jí),其中 第一級(jí)是個(gè)鏈表,包括有頭指針,鏈表長度和這個(gè)鏈表允許的最大長度等字段。釋放內(nèi)存的時(shí)候,如果長度不超過鏈表的最大長度,則都插到鏈表中。否則,就掛到自己的隊(duì)列中(如果隊(duì)列也沒滿)。分配內(nèi)存的時(shí)候,如果鏈表中有內(nèi)存就從鏈表中分配。如果沒有,就從其他進(jìn)程的環(huán)形隊(duì)列轉(zhuǎn)移一些網(wǎng)絡(luò)內(nèi)存到自己的鏈表中,然后再從鏈表中分配內(nèi)存。 第二級(jí)為環(huán)形隊(duì)列,環(huán)形隊(duì)列是進(jìn)程間用來交換內(nèi)存的,因?yàn)橛锌赡苣承┻M(jìn)程累積的內(nèi)存多,有些累積的少。少的進(jìn)程就可以從多的進(jìn)程的隊(duì)列里獲得內(nèi)存,而不必從系統(tǒng)中獲得內(nèi)存。環(huán)形隊(duì)列本質(zhì)上是個(gè)指針數(shù)組,有寫指針和讀指針。寫指針由自己來控制(因此不需要互斥鎖來避免并發(fā)),當(dāng)所述自己的鏈表已滿,則把內(nèi)存插入到本進(jìn)程的隊(duì)列中。讀指針由其它的進(jìn)程操作,因此有個(gè)互斥鎖來避免并發(fā)操作產(chǎn)生的沖突。其它的進(jìn)程操作前必須獲得隊(duì)列的互斥鎖,然后才能從隊(duì)列中獲得內(nèi)存,并移動(dòng)讀指針。
10.根據(jù)權(quán)利要求9所述的基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備設(shè)置方法,其特征是所述的為每個(gè)并行處理的進(jìn)程配置網(wǎng)絡(luò)內(nèi)存緩存模塊的分步驟如下: —如果本進(jìn)程鏈表內(nèi)有空閑的內(nèi)存,則分配并返回;否則, —從本進(jìn)程的環(huán)形隊(duì)列開始,依次遍歷同運(yùn)行域中的所有進(jìn)程的環(huán)形隊(duì)列,首先嘗試獲得該環(huán)形隊(duì)列的互斥鎖,如果能拿到互斥鎖,則把該隊(duì)列上所有的空閑內(nèi)存移到本進(jìn)程的鏈表中,然后分配一個(gè)內(nèi)存并退出;如果隊(duì)列中沒有空閑內(nèi)存或則是不能拿到互斥鎖,則嘗試下一個(gè)進(jìn)程的環(huán)形隊(duì)列,直到遍歷完所有進(jìn)程的環(huán)形隊(duì)列; ——如果所有的環(huán)形隊(duì)列都沒有空閑內(nèi)存,則從該運(yùn)行域的系統(tǒng)內(nèi)存中獲得。
11.根據(jù)權(quán)利要求9所述的基于非一致性內(nèi)存訪問系統(tǒng)的網(wǎng)絡(luò)設(shè)備設(shè)置方法,其特征是所述的進(jìn)程釋放內(nèi)存的分步驟如下: ——如果本進(jìn)程的鏈表長度小于設(shè)定的最大長度,則把要釋放的內(nèi)存插到鏈表中;否則, —如果本進(jìn)程的環(huán)形隊(duì)列還沒滿,則把空閑隊(duì)列掛上去,并修改寫指針;否則, ——把所述內(nèi)存釋放到系統(tǒng)中。
【文檔編號(hào)】G06F15/177GK104050091SQ201210585985
【公開日】2014年9月17日 申請(qǐng)日期:2012年12月28日 優(yōu)先權(quán)日:2012年12月28日
【發(fā)明者】劉劍波 申請(qǐng)人:華耀(中國)科技有限公司