楊虎斌,李嘉翔,陳玉聰,劉 剛,張紅濤,周 睿,周慶國
(蘭州大學 信息科學與工程學院,甘肅 蘭州 730000)
動態隨機存取存儲器(Dynamic Random Access Memory, DRAM)被廣泛地應用于嵌入式設備、個人電腦和服務器[1]。在現代計算機內存體系結構中,當處理器核(Core)通過內存控制器訪問DRAM中的數據時,需要將線性的物理地址轉換為由通道(Channel)、DIMM、Rank、Bank、行(Row)和列(Column)組成的多維的DRAM地址[2]。為了提高訪問內存的速度,在每個Bank中都有一個行緩沖區(Row Buffer)[3-4],它一次可以存儲Bank中的一行數據。特別地,應用程序的局部性越好,行緩沖區起到的效果就越好。
在多核平臺上,DRAM由系統中所有的Core共享,因此,只有在不同Core上運行的進程并發訪問同一個Bank中的同一行數據,或者并發訪問不同Bank中的數據時,才不會發生行緩沖區沖突。但是,當不同Core上運行的進程并發訪問同一個Bank中不同行中的數據時,會引發行緩沖區沖突,從而導致該行緩沖區的頻繁刷新。因此,行緩沖區沖突導致的內存訪問延遲使整個系統的性能下降。
目前已有一些解決方案利用DRAM Bank分區技術緩解這個問題[5-13]。這些解決方案的主要設計思想是利用Bank分區技術將DRAM中指定的Bank分配給指定的進程,因此,不同的進程只能訪問位于自己的Bank中的物理內存,從而可以有效地緩解Bank行緩沖區沖突。然而,由于共享庫是一種進程間的共享資源,它們被加載到內存后,通常隨機地分布在不同的DRAM Bank中。因此,雖然基于DRAM Bank分區技術的解決方案可以有效地緩解由進程訪問私有內存導致的Bank行緩沖區沖突問題,但是,無法解決訪問共享庫引起的Bank行緩沖區沖突問題。
該文提出了一種在多核系統中利用DRAM Bank分區技術實現共享庫隔離的方案(Isolation of Shared Libraries in MultiCore Systems via Bank Partitioning,ISMB)。ISMB為每個Core提供了一個共享庫的副本,并使運行在相同Core上的所有進程共享只屬于該Core的共享庫的副本。
具體地,ISMB首先將共享庫的副本分別加載到位于對應的Core的Bank中的物理頁面中,然后利用Bank分區技術使運行在同一個Core上的所有進程只能訪問屬于該Core的共享庫的副本。因此,ISMB消除了共享庫導致的Bank行緩沖區沖突問題,從而提升了系統整體的性能。
從表1中可以看出,與其他沒有考慮共享庫的Bank分區方案相比,ISMB的創新性在于:在涉及共享庫的兩種情況下,ISMB都可以提供有效的隔離。例如,在情況2下,假設為Core 0和Core 1分別分配的是Bank 0和Bank 1,則運行在Core 0上的應用程序的二進制可執行代碼被加載到Bank 0中,而運行在Core1上的共享庫的代碼被加載到Bank 1中,因此,當Core 0和Core 1并發訪問內存時,不會導致Bank行緩存區沖突。

表1 ISMB與其他不考慮共享庫的Bank分區機制在共享庫隔離方面的對比
對比實驗結果表明,ISMB能夠有效地提升系統隔離性能。與未使用ISMB的Linux相比,在高負載的情況下,所有SPEC CPU2006基準測試程序的減速率平均降低了3.9%,最大降低了26.3%。在混合負載的情況下,減速率平均降低了6%,最大降低了15.7%。
目前已有一些研究[14-16]通過優化DRAM控制器調度算法來解決多核平臺上Bank行緩沖區沖突問題,從而實現提高系統吞吐量或公平性的目的。雖然DRAM控制器調度算法優化方案可以提高系統吞吐量或公平性,但是這些方案有以下三個缺點:第一,涉及到內存控制器硬件的修改;第二,這些方案的有效性受到諸多因素的限制,例如調度算法緩沖區的大小等等;第三,當運行在不同Core上的多個進程共享DRAM時,優化后的DRAM控制器調度算法可能會導致饑餓現象的產生[11]。因此,利用優化DRAM控制器調度算法來解決多核平臺上DRAM Bank行緩沖區沖突問題,所能達到的效果有限。
DRAM Bank分區技術是通過軟件的方式緩解多核平臺上Bank行緩沖區沖突問題的機制?;贒RAM Bank分區的方案[5-13]主要分為靜態分區和動態分區兩類。其中,Bank靜態分區技術對DRAM中的Bank進行靜態分區,并將指定的Bank分配給指定的進程,以減少Bank的行緩沖區沖突,從而提高系統性能。Bank動態分區技術首先會根據進程對Bank數量的需求,動態地對DRAM中的Bank進行分區,然后在進程運行的不同階段,為其分配數量不等的Bank。
目前已有一些為共享庫提供隔離機制的解決方案,這些解決方案通常是將共享庫獨立地運行在隔離環境中,例如不同的上下文環境[17]或獨立的虛擬機[18-19]中。在這些解決方案中,調用共享庫中函數需要進行上下文環境或虛擬機的切換,因此,在函數調用很頻繁的情況下,這會造成很大的系統開銷。除此之外,Kim等人提出了一種稱為選擇性共享的策略[20]。該策略首先為每個共享庫創建n+2個副本,其中n表示系統中Core的數量;然后將n個副本分別由運行在n個Core上的高優先級實時任務共享訪問;其次,將另外2個副本分別由運行在所有Core上的低優先級實時任務和非實時任務共享訪問。由于低優先級實時任務和非實時任務分別共享的2個共享庫仍然可以導致Bank行緩沖區沖突問題,因此,該策略沒有徹底地解決共享庫引發的Bank行緩沖區沖突問題。
ISMB的核心設計思想是:首先,為每個Core創建一個共享庫的副本;然后,利用Bank分區技術使運行在某Core上的所有進程只能訪問該Core對應的共享庫副本。
如圖1所示,假設為Core 0和Core 1分別分配的是Bank 0和Bank 1,則運行在Core 0上的進程只能訪問Bank 0中的進程的私有內存和Core 0的共享庫副本的共享內存。因此,ISMB可以同時消除進程訪問私有內存和共享庫導致的Bank行緩沖區沖突問題,從而提升系統的整體性能。

圖1 ISMB的共享庫隔離示意圖
在Linux內核中,ISMB為系統中所有的Core維護了一個空閑物理頁面鏈表數組pcpu_list,數組中鏈表的數量等于系統中Core的數量。除此之外,ISMB將系統中的所有DRAM Bank進行分區,并為每個Core分配了一組固定的Bank,因此,pcpu_list數組中每個鏈表存放的空閑物理頁面位于該鏈表對應的Core的Bank中。例如,為Core 0分配的是Bank 0,則pcpu_list[0]鏈表中存放的空閑物理頁面都位于Bank 0中。當運行在Core 0上的進程在運行過程中發生缺頁異常,進入異常處理程序后,ISMB通過修改Linux內核函數_rmqueue,實現了直接從pcpu_list[0]鏈表而不是Linux伙伴系統中為進程申請空閑物理頁面的操作。
圖2是從pcpu_list[0]鏈表中為運行在Core 0上的進程申請空閑物理頁面的流程。如果pcpu_list[0]鏈表不為空,那么ISMB直接從pcpu_list[0]鏈表中取出第一個空閑物理頁面后,返回該物理頁面。否則,ISMB首先從Linux伙伴系統中申請一個空閑物理頁面,然后將其插入pcpu_list[0]鏈表。最后,從pcpu_list[0]鏈表中取出空閑物理頁面后,返回該物理頁面。在這個過程中,若從Linux伙伴系統申請的空閑物理頁面不位于Bank 0中,則把這些物理頁面分別插入適當的pcpu_list鏈表,從而可以減少在將來申請空閑物理頁面的時間開銷。

圖2 從pcpu_list[0]鏈表中申請空閑物理頁面的流程
為了把從Linux伙伴系統中申請的空閑頁面插入適當的pcpu_list鏈表,需要知道將物理地址轉換為DRAM地址的映射信息,從而確定一個物理頁面位于哪個DRAM Bank。對于沒有公開地址映射信息的體系結構(例如Intel),可以利用逆向技術獲取這些地址映射信息[21-27]。目前已有的逆向技術主要分為兩類:基于軟件的方法和基于硬件的方法。
由于文中的實驗平臺基于AMD架構,并且該架構在其架構手冊中明確地公開了DRAM地址映射信息,因此,通過查詢AMD架構手冊可知:物理地址中的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,因此,系統中總共有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映射信息
在已經對DRAM Bank進行分區,并將指定的Bank分配給指定Core的情況下,為了使進程只能訪問屬于運行該進程的Core的共享庫的副本,ISMB需要將屬于某個Core的共享庫的副本加載到位于該Core的Bank的物理頁面。
ISMB使用了一種簡單有效的方法[20]對共享庫進行Core間的隔離。首先,在磁盤上為每個Core創建一個用于存放共享庫副本的目錄,并將共享庫分別復制到每個目錄中。然后,在運行綁定在指定Core上的應用程序前,將該Core對應的存放共享庫副本的目錄添加到環境變量LD_LIBRARY_PATH。故該應用程序在運行過程中,只能使用該Core對應目錄中的共享庫副本。因此,在已經將指定Bank分配給指定Core的情況下,屬于某Core的共享庫副本只能被加載到位于該Core的Bank的物理頁面,并被該Core上運行的所有進程共享。
文中使用的實驗平臺的參數如表2所示,如2.2節所述,實驗平臺上總共有32個Bank。由于物理內存的總大小為16 GB,因此,每個Bank的大小為512 MB。在所有實驗中,為每個Core靜態地分配8個Bank。操作系統使用Ubuntu 18.04,其中Linux內核版本為5.3。此外,在所有實驗過程中,通過禁用不相關的服務(桌面服務和網絡服務)以提高實驗精度。

表2 實驗平臺參數
在文中實驗中,使用SPEC CPU2006[30]作為實驗基準測試程序,表3對每個SPEC CPU2006基準測試程序使用的共享庫進行了全面的統計。使用減速率(slowdown ratio)作為評估ISMB實現的性能隔離程度的指標[12],其定義如下:

表3 SPEC CPU2006基準測試程序的共享庫使用統計信息

其中,IPCalone表示在無負載的情況下,SPEC CPU2006基準測試程序運行時,每個時鐘周期執行的指令條數(Instructions Per Clock,IPC);IPCshared表示在有負載的情況下的IPC。減速率的值越小,說明隔離性能越好。
實驗中將SPEC CPU2006基準測試程序中的訪存密集型(Memory intensive)程序470.lbm作為負載[12],來評估ISMB實現的性能隔離程度。實驗過程如下:首先,在沒有負載的情況下,在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基準測試程序的規范化減速率。從圖中可以看出,在使用ISMB時,大部分基準測試程序的性能較好,除了如471.omnetpp之類的少數基準測試程序,這些基準測試程序的性能下降的原因主要是Bank數量減少導致的性能下降抵消了Bank分區技術帶來的性能提升。實驗結果表明,在使用ISMB的情況下,SPEC CPU2006基準測試程序的減速率平均降低了3.9%,最大降低了26.3%(470.lbm基準測試程序,規范化減速率為0.737)。

圖4 以470.lbm作為負載的SPEC CPU2006基準測試程序的規范化減速率
為了模擬更加真實的運行環境,如表4所示,從所有SPEC CPU2006基準測試程序中隨機選擇10組基準測試程序,每個測試組包含4個基準測試程序。每個測試組的實驗過程如下:首先,將測試組中的4個基準測試程序分別同時運行在4個Core上,并獲取各自的IPCshared;然后,結合上一小節實驗中獲取的IPCalone,計算出每個SPEC CPU2006基準測試程序的減速率;最后,計算出這4個基準測試程序的平均減速率,作為測試組的減速率。

表4 SPEC CPU2006基準測試程序組
圖5顯示了10個測試組在使用ISMB的情況下,每個測試組的規范化減速率。實驗結果表明,在混合負載的情況下,ISMB的使用使SPEC CPU2006基準測試程序的減速率平均降低了6%,最大降低了15.7%(Mix8測試組,規范化減速率為0.843)。因此,與未使用ISMB相比,ISMB可以有效地提升系統的隔離性能。

圖5 SPEC CPU2006基準測試程序組的規范化減速率
該文提出的在多核系統中利用DRAM Bank分區技術實現共享庫隔離的方案(ISMB)消除了共享庫導致的Bank行緩沖區沖突問題,從而有效地提升了系統的整體性能。對比實驗結果表明,與未使用ISMB的Linux相比,ISMB能夠有效地提高系統隔離性能。特別地,在高負載的情況下,SPEC CPU2006基準測試程序的減速率最大降低了26.3%,在混合負載的情況下減速率最大降低了15.7%。提出的ISMB機制是基于靜態Bank分區技術實現的,在未來的研究工作中,計劃采用動態Bank分區技術來實現ISMB機制。從而在保證ISMB隔離性的同時,進一步提升系統的整體性能。