楊虎斌,李嘉翔,陳玉聰,劉 剛,張紅濤,周 睿,周慶國(guó)
(蘭州大學(xué) 信息科學(xué)與工程學(xué)院,甘肅 蘭州 730000)
動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(Dynamic Random Access Memory, DRAM)被廣泛地應(yīng)用于嵌入式設(shè)備、個(gè)人電腦和服務(wù)器[1]。在現(xiàn)代計(jì)算機(jī)內(nèi)存體系結(jié)構(gòu)中,當(dāng)處理器核(Core)通過(guò)內(nèi)存控制器訪問(wèn)DRAM中的數(shù)據(jù)時(shí),需要將線性的物理地址轉(zhuǎn)換為由通道(Channel)、DIMM、Rank、Bank、行(Row)和列(Column)組成的多維的DRAM地址[2]。為了提高訪問(wèn)內(nèi)存的速度,在每個(gè)Bank中都有一個(gè)行緩沖區(qū)(Row Buffer)[3-4],它一次可以存儲(chǔ)Bank中的一行數(shù)據(jù)。特別地,應(yīng)用程序的局部性越好,行緩沖區(qū)起到的效果就越好。
在多核平臺(tái)上,DRAM由系統(tǒng)中所有的Core共享,因此,只有在不同Core上運(yùn)行的進(jìn)程并發(fā)訪問(wèn)同一個(gè)Bank中的同一行數(shù)據(jù),或者并發(fā)訪問(wèn)不同Bank中的數(shù)據(jù)時(shí),才不會(huì)發(fā)生行緩沖區(qū)沖突。但是,當(dāng)不同Core上運(yùn)行的進(jìn)程并發(fā)訪問(wèn)同一個(gè)Bank中不同行中的數(shù)據(jù)時(shí),會(huì)引發(fā)行緩沖區(qū)沖突,從而導(dǎo)致該行緩沖區(qū)的頻繁刷新。因此,行緩沖區(qū)沖突導(dǎo)致的內(nèi)存訪問(wèn)延遲使整個(gè)系統(tǒng)的性能下降。
目前已有一些解決方案利用DRAM Bank分區(qū)技術(shù)緩解這個(gè)問(wèn)題[5-13]。這些解決方案的主要設(shè)計(jì)思想是利用Bank分區(qū)技術(shù)將DRAM中指定的Bank分配給指定的進(jìn)程,因此,不同的進(jìn)程只能訪問(wèn)位于自己的Bank中的物理內(nèi)存,從而可以有效地緩解Bank行緩沖區(qū)沖突。然而,由于共享庫(kù)是一種進(jìn)程間的共享資源,它們被加載到內(nèi)存后,通常隨機(jī)地分布在不同的DRAM Bank中。因此,雖然基于DRAM Bank分區(qū)技術(shù)的解決方案可以有效地緩解由進(jìn)程訪問(wèn)私有內(nèi)存導(dǎo)致的Bank行緩沖區(qū)沖突問(wèn)題,但是,無(wú)法解決訪問(wèn)共享庫(kù)引起的Bank行緩沖區(qū)沖突問(wèn)題。
該文提出了一種在多核系統(tǒng)中利用DRAM Bank分區(qū)技術(shù)實(shí)現(xiàn)共享庫(kù)隔離的方案(Isolation of Shared Libraries in MultiCore Systems via Bank Partitioning,ISMB)。ISMB為每個(gè)Core提供了一個(gè)共享庫(kù)的副本,并使運(yùn)行在相同Core上的所有進(jìn)程共享只屬于該Core的共享庫(kù)的副本。
具體地,ISMB首先將共享庫(kù)的副本分別加載到位于對(duì)應(yīng)的Core的Bank中的物理頁(yè)面中,然后利用Bank分區(qū)技術(shù)使運(yùn)行在同一個(gè)Core上的所有進(jìn)程只能訪問(wèn)屬于該Core的共享庫(kù)的副本。因此,ISMB消除了共享庫(kù)導(dǎo)致的Bank行緩沖區(qū)沖突問(wèn)題,從而提升了系統(tǒng)整體的性能。
從表1中可以看出,與其他沒(méi)有考慮共享庫(kù)的Bank分區(qū)方案相比,ISMB的創(chuàng)新性在于:在涉及共享庫(kù)的兩種情況下,ISMB都可以提供有效的隔離。例如,在情況2下,假設(shè)為Core 0和Core 1分別分配的是Bank 0和Bank 1,則運(yùn)行在Core 0上的應(yīng)用程序的二進(jìn)制可執(zhí)行代碼被加載到Bank 0中,而運(yùn)行在Core1上的共享庫(kù)的代碼被加載到Bank 1中,因此,當(dāng)Core 0和Core 1并發(fā)訪問(wèn)內(nèi)存時(shí),不會(huì)導(dǎo)致Bank行緩存區(qū)沖突。
表1 ISMB與其他不考慮共享庫(kù)的Bank分區(qū)機(jī)制在共享庫(kù)隔離方面的對(duì)比
對(duì)比實(shí)驗(yàn)結(jié)果表明,ISMB能夠有效地提升系統(tǒng)隔離性能。與未使用ISMB的Linux相比,在高負(fù)載的情況下,所有SPEC CPU2006基準(zhǔn)測(cè)試程序的減速率平均降低了3.9%,最大降低了26.3%。在混合負(fù)載的情況下,減速率平均降低了6%,最大降低了15.7%。
目前已有一些研究[14-16]通過(guò)優(yōu)化DRAM控制器調(diào)度算法來(lái)解決多核平臺(tái)上Bank行緩沖區(qū)沖突問(wèn)題,從而實(shí)現(xiàn)提高系統(tǒng)吞吐量或公平性的目的。雖然DRAM控制器調(diào)度算法優(yōu)化方案可以提高系統(tǒng)吞吐量或公平性,但是這些方案有以下三個(gè)缺點(diǎn):第一,涉及到內(nèi)存控制器硬件的修改;第二,這些方案的有效性受到諸多因素的限制,例如調(diào)度算法緩沖區(qū)的大小等等;第三,當(dāng)運(yùn)行在不同Core上的多個(gè)進(jìn)程共享DRAM時(shí),優(yōu)化后的DRAM控制器調(diào)度算法可能會(huì)導(dǎo)致饑餓現(xiàn)象的產(chǎn)生[11]。因此,利用優(yōu)化DRAM控制器調(diào)度算法來(lái)解決多核平臺(tái)上DRAM Bank行緩沖區(qū)沖突問(wèn)題,所能達(dá)到的效果有限。
DRAM Bank分區(qū)技術(shù)是通過(guò)軟件的方式緩解多核平臺(tái)上Bank行緩沖區(qū)沖突問(wèn)題的機(jī)制?;贒RAM Bank分區(qū)的方案[5-13]主要分為靜態(tài)分區(qū)和動(dòng)態(tài)分區(qū)兩類。其中,Bank靜態(tài)分區(qū)技術(shù)對(duì)DRAM中的Bank進(jìn)行靜態(tài)分區(qū),并將指定的Bank分配給指定的進(jìn)程,以減少Bank的行緩沖區(qū)沖突,從而提高系統(tǒng)性能。Bank動(dòng)態(tài)分區(qū)技術(shù)首先會(huì)根據(jù)進(jìn)程對(duì)Bank數(shù)量的需求,動(dòng)態(tài)地對(duì)DRAM中的Bank進(jìn)行分區(qū),然后在進(jìn)程運(yùn)行的不同階段,為其分配數(shù)量不等的Bank。
目前已有一些為共享庫(kù)提供隔離機(jī)制的解決方案,這些解決方案通常是將共享庫(kù)獨(dú)立地運(yùn)行在隔離環(huán)境中,例如不同的上下文環(huán)境[17]或獨(dú)立的虛擬機(jī)[18-19]中。在這些解決方案中,調(diào)用共享庫(kù)中函數(shù)需要進(jìn)行上下文環(huán)境或虛擬機(jī)的切換,因此,在函數(shù)調(diào)用很頻繁的情況下,這會(huì)造成很大的系統(tǒng)開(kāi)銷。除此之外,Kim等人提出了一種稱為選擇性共享的策略[20]。該策略首先為每個(gè)共享庫(kù)創(chuàng)建n+2個(gè)副本,其中n表示系統(tǒng)中Core的數(shù)量;然后將n個(gè)副本分別由運(yùn)行在n個(gè)Core上的高優(yōu)先級(jí)實(shí)時(shí)任務(wù)共享訪問(wèn);其次,將另外2個(gè)副本分別由運(yùn)行在所有Core上的低優(yōu)先級(jí)實(shí)時(shí)任務(wù)和非實(shí)時(shí)任務(wù)共享訪問(wèn)。由于低優(yōu)先級(jí)實(shí)時(shí)任務(wù)和非實(shí)時(shí)任務(wù)分別共享的2個(gè)共享庫(kù)仍然可以導(dǎo)致Bank行緩沖區(qū)沖突問(wèn)題,因此,該策略沒(méi)有徹底地解決共享庫(kù)引發(fā)的Bank行緩沖區(qū)沖突問(wèn)題。
ISMB的核心設(shè)計(jì)思想是:首先,為每個(gè)Core創(chuàng)建一個(gè)共享庫(kù)的副本;然后,利用Bank分區(qū)技術(shù)使運(yùn)行在某Core上的所有進(jìn)程只能訪問(wèn)該Core對(duì)應(yīng)的共享庫(kù)副本。
如圖1所示,假設(shè)為Core 0和Core 1分別分配的是Bank 0和Bank 1,則運(yùn)行在Core 0上的進(jìn)程只能訪問(wèn)Bank 0中的進(jìn)程的私有內(nèi)存和Core 0的共享庫(kù)副本的共享內(nèi)存。因此,ISMB可以同時(shí)消除進(jìn)程訪問(wèn)私有內(nèi)存和共享庫(kù)導(dǎo)致的Bank行緩沖區(qū)沖突問(wèn)題,從而提升系統(tǒng)的整體性能。
圖1 ISMB的共享庫(kù)隔離示意圖
在Linux內(nèi)核中,ISMB為系統(tǒng)中所有的Core維護(hù)了一個(gè)空閑物理頁(yè)面鏈表數(shù)組pcpu_list,數(shù)組中鏈表的數(shù)量等于系統(tǒng)中Core的數(shù)量。除此之外,ISMB將系統(tǒng)中的所有DRAM Bank進(jìn)行分區(qū),并為每個(gè)Core分配了一組固定的Bank,因此,pcpu_list數(shù)組中每個(gè)鏈表存放的空閑物理頁(yè)面位于該鏈表對(duì)應(yīng)的Core的Bank中。例如,為Core 0分配的是Bank 0,則pcpu_list[0]鏈表中存放的空閑物理頁(yè)面都位于Bank 0中。當(dāng)運(yùn)行在Core 0上的進(jìn)程在運(yùn)行過(guò)程中發(fā)生缺頁(yè)異常,進(jìn)入異常處理程序后,ISMB通過(guò)修改Linux內(nèi)核函數(shù)_rmqueue,實(shí)現(xiàn)了直接從pcpu_list[0]鏈表而不是Linux伙伴系統(tǒng)中為進(jìn)程申請(qǐng)空閑物理頁(yè)面的操作。
圖2是從pcpu_list[0]鏈表中為運(yùn)行在Core 0上的進(jìn)程申請(qǐng)空閑物理頁(yè)面的流程。如果pcpu_list[0]鏈表不為空,那么ISMB直接從pcpu_list[0]鏈表中取出第一個(gè)空閑物理頁(yè)面后,返回該物理頁(yè)面。否則,ISMB首先從Linux伙伴系統(tǒng)中申請(qǐng)一個(gè)空閑物理頁(yè)面,然后將其插入pcpu_list[0]鏈表。最后,從pcpu_list[0]鏈表中取出空閑物理頁(yè)面后,返回該物理頁(yè)面。在這個(gè)過(guò)程中,若從Linux伙伴系統(tǒng)申請(qǐng)的空閑物理頁(yè)面不位于Bank 0中,則把這些物理頁(yè)面分別插入適當(dāng)?shù)膒cpu_list鏈表,從而可以減少在將來(lái)申請(qǐng)空閑物理頁(yè)面的時(shí)間開(kāi)銷。
圖2 從pcpu_list[0]鏈表中申請(qǐng)空閑物理頁(yè)面的流程
為了把從Linux伙伴系統(tǒng)中申請(qǐng)的空閑頁(yè)面插入適當(dāng)?shù)膒cpu_list鏈表,需要知道將物理地址轉(zhuǎn)換為DRAM地址的映射信息,從而確定一個(gè)物理頁(yè)面位于哪個(gè)DRAM Bank。對(duì)于沒(méi)有公開(kāi)地址映射信息的體系結(jié)構(gòu)(例如Intel),可以利用逆向技術(shù)獲取這些地址映射信息[21-27]。目前已有的逆向技術(shù)主要分為兩類:基于軟件的方法和基于硬件的方法。
由于文中的實(shí)驗(yàn)平臺(tái)基于AMD架構(gòu),并且該架構(gòu)在其架構(gòu)手冊(cè)中明確地公開(kāi)了DRAM地址映射信息,因此,通過(guò)查詢AMD架構(gòu)手冊(cè)可知:物理地址中的Rank和Bank位的信息分別存放在“F2x[1,0][6C:60] DRAM CS Mask Registers”和“F2x[1,0]80 DRAM Bank Address Mapping Register”兩個(gè)寄存器中[28-29]。如表2所示,文中使用的實(shí)驗(yàn)平臺(tái)有1個(gè)通道,每個(gè)通道有2個(gè)DIMM,每個(gè)DIMM有2個(gè)Rank,每個(gè)Rank有8個(gè)Bank,因此,系統(tǒng)中總共有32個(gè)Bank,即在物理地址中,總共有5個(gè)比特位用來(lái)表示Bank的編號(hào)。
圖3顯示了文中使用的實(shí)驗(yàn)平臺(tái)的DRAM Bank映射信息。由圖可知,比特位16~17用于表示Rank的編號(hào),比特位13~15用于表示Bank的編號(hào)。綜上,ISMB使用物理頁(yè)面的起始地址中的比特位13~17,來(lái)確定物理頁(yè)面所在的Bank的編號(hào)。例如,一個(gè)物理頁(yè)面的起始地址中的比特位13~17全為0,表示該物理頁(yè)面位于Bank 0中。
圖3 文中實(shí)驗(yàn)平臺(tái)的DRAM Bank映射信息
在已經(jīng)對(duì)DRAM Bank進(jìn)行分區(qū),并將指定的Bank分配給指定Core的情況下,為了使進(jìn)程只能訪問(wèn)屬于運(yùn)行該進(jìn)程的Core的共享庫(kù)的副本,ISMB需要將屬于某個(gè)Core的共享庫(kù)的副本加載到位于該Core的Bank的物理頁(yè)面。
ISMB使用了一種簡(jiǎn)單有效的方法[20]對(duì)共享庫(kù)進(jìn)行Core間的隔離。首先,在磁盤(pán)上為每個(gè)Core創(chuàng)建一個(gè)用于存放共享庫(kù)副本的目錄,并將共享庫(kù)分別復(fù)制到每個(gè)目錄中。然后,在運(yùn)行綁定在指定Core上的應(yīng)用程序前,將該Core對(duì)應(yīng)的存放共享庫(kù)副本的目錄添加到環(huán)境變量LD_LIBRARY_PATH。故該應(yīng)用程序在運(yùn)行過(guò)程中,只能使用該Core對(duì)應(yīng)目錄中的共享庫(kù)副本。因此,在已經(jīng)將指定Bank分配給指定Core的情況下,屬于某Core的共享庫(kù)副本只能被加載到位于該Core的Bank的物理頁(yè)面,并被該Core上運(yùn)行的所有進(jìn)程共享。
文中使用的實(shí)驗(yàn)平臺(tái)的參數(shù)如表2所示,如2.2節(jié)所述,實(shí)驗(yàn)平臺(tái)上總共有32個(gè)Bank。由于物理內(nèi)存的總大小為16 GB,因此,每個(gè)Bank的大小為512 MB。在所有實(shí)驗(yàn)中,為每個(gè)Core靜態(tài)地分配8個(gè)Bank。操作系統(tǒng)使用Ubuntu 18.04,其中Linux內(nèi)核版本為5.3。此外,在所有實(shí)驗(yàn)過(guò)程中,通過(guò)禁用不相關(guān)的服務(wù)(桌面服務(wù)和網(wǎng)絡(luò)服務(wù))以提高實(shí)驗(yàn)精度。
表2 實(shí)驗(yàn)平臺(tái)參數(shù)
在文中實(shí)驗(yàn)中,使用SPEC CPU2006[30]作為實(shí)驗(yàn)基準(zhǔn)測(cè)試程序,表3對(duì)每個(gè)SPEC CPU2006基準(zhǔn)測(cè)試程序使用的共享庫(kù)進(jìn)行了全面的統(tǒng)計(jì)。使用減速率(slowdown ratio)作為評(píng)估ISMB實(shí)現(xiàn)的性能隔離程度的指標(biāo)[12],其定義如下:
表3 SPEC CPU2006基準(zhǔn)測(cè)試程序的共享庫(kù)使用統(tǒng)計(jì)信息
其中,IPCalone表示在無(wú)負(fù)載的情況下,SPEC CPU2006基準(zhǔn)測(cè)試程序運(yùn)行時(shí),每個(gè)時(shí)鐘周期執(zhí)行的指令條數(shù)(Instructions Per Clock,IPC);IPCshared表示在有負(fù)載的情況下的IPC。減速率的值越小,說(shuō)明隔離性能越好。
實(shí)驗(yàn)中將SPEC CPU2006基準(zhǔn)測(cè)試程序中的訪存密集型(Memory intensive)程序470.lbm作為負(fù)載[12],來(lái)評(píng)估ISMB實(shí)現(xiàn)的性能隔離程度。實(shí)驗(yàn)過(guò)程如下:首先,在沒(méi)有負(fù)載的情況下,在Core 0上運(yùn)行所有SPEC CPU2006基準(zhǔn)測(cè)試程序,并獲取它們的IPC作為IPCalone;然后,在Core 1~3上分別運(yùn)行三個(gè)470.lbm基準(zhǔn)測(cè)試程序作為負(fù)載,在Core 0上運(yùn)行所有SPEC CPU2006基準(zhǔn)測(cè)試程序,并獲取它們的IPC作為IPCshared;最后,利用公式(1)計(jì)算出SPEC CPU2006基準(zhǔn)測(cè)試程序的減速率。
圖4顯示了將470.lbm作為負(fù)載的情況下,所有SPEC CPU2006基準(zhǔn)測(cè)試程序的規(guī)范化減速率。從圖中可以看出,在使用ISMB時(shí),大部分基準(zhǔn)測(cè)試程序的性能較好,除了如471.omnetpp之類的少數(shù)基準(zhǔn)測(cè)試程序,這些基準(zhǔn)測(cè)試程序的性能下降的原因主要是Bank數(shù)量減少導(dǎo)致的性能下降抵消了Bank分區(qū)技術(shù)帶來(lái)的性能提升。實(shí)驗(yàn)結(jié)果表明,在使用ISMB的情況下,SPEC CPU2006基準(zhǔn)測(cè)試程序的減速率平均降低了3.9%,最大降低了26.3%(470.lbm基準(zhǔn)測(cè)試程序,規(guī)范化減速率為0.737)。
圖4 以470.lbm作為負(fù)載的SPEC CPU2006基準(zhǔn)測(cè)試程序的規(guī)范化減速率
為了模擬更加真實(shí)的運(yùn)行環(huán)境,如表4所示,從所有SPEC CPU2006基準(zhǔn)測(cè)試程序中隨機(jī)選擇10組基準(zhǔn)測(cè)試程序,每個(gè)測(cè)試組包含4個(gè)基準(zhǔn)測(cè)試程序。每個(gè)測(cè)試組的實(shí)驗(yàn)過(guò)程如下:首先,將測(cè)試組中的4個(gè)基準(zhǔn)測(cè)試程序分別同時(shí)運(yùn)行在4個(gè)Core上,并獲取各自的IPCshared;然后,結(jié)合上一小節(jié)實(shí)驗(yàn)中獲取的IPCalone,計(jì)算出每個(gè)SPEC CPU2006基準(zhǔn)測(cè)試程序的減速率;最后,計(jì)算出這4個(gè)基準(zhǔn)測(cè)試程序的平均減速率,作為測(cè)試組的減速率。
表4 SPEC CPU2006基準(zhǔn)測(cè)試程序組
圖5顯示了10個(gè)測(cè)試組在使用ISMB的情況下,每個(gè)測(cè)試組的規(guī)范化減速率。實(shí)驗(yàn)結(jié)果表明,在混合負(fù)載的情況下,ISMB的使用使SPEC CPU2006基準(zhǔn)測(cè)試程序的減速率平均降低了6%,最大降低了15.7%(Mix8測(cè)試組,規(guī)范化減速率為0.843)。因此,與未使用ISMB相比,ISMB可以有效地提升系統(tǒng)的隔離性能。
圖5 SPEC CPU2006基準(zhǔn)測(cè)試程序組的規(guī)范化減速率
該文提出的在多核系統(tǒng)中利用DRAM Bank分區(qū)技術(shù)實(shí)現(xiàn)共享庫(kù)隔離的方案(ISMB)消除了共享庫(kù)導(dǎo)致的Bank行緩沖區(qū)沖突問(wèn)題,從而有效地提升了系統(tǒng)的整體性能。對(duì)比實(shí)驗(yàn)結(jié)果表明,與未使用ISMB的Linux相比,ISMB能夠有效地提高系統(tǒng)隔離性能。特別地,在高負(fù)載的情況下,SPEC CPU2006基準(zhǔn)測(cè)試程序的減速率最大降低了26.3%,在混合負(fù)載的情況下減速率最大降低了15.7%。提出的ISMB機(jī)制是基于靜態(tài)Bank分區(qū)技術(shù)實(shí)現(xiàn)的,在未來(lái)的研究工作中,計(jì)劃采用動(dòng)態(tài)Bank分區(qū)技術(shù)來(lái)實(shí)現(xiàn)ISMB機(jī)制。從而在保證ISMB隔離性的同時(shí),進(jìn)一步提升系統(tǒng)的整體性能。