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