內存計算系統系列成果之八:Gengar:基于RDMA的分布式異構內存池
非易失性內存具有存儲密度高、低功耗、字節可尋址、接近DRAM的讀寫性能等優良特性,為數據中心應用構建大型分布式共享內存系統提供了可能。盡管有許多關于在單節點中使用NVM的研究,但在分布式數據中心環境中如何有效利用NVM仍然存在挑戰。我們提出了支持RDMA的分布式異構內存池Gengar,使應用程序可通過簡單的API對全局內存空間中的遠端NVM和DRAM進行高效利用。Gengar在應用端監控單邊RDMA原語來識別異構內存池中經常訪問的熱點數據,并將其緩存在分布式DRAM緩沖區中。我們重新設計了RDMA通信協議和原語,通過代理機制在可靠連接情況下實現了異步RDMA寫操作,從而減少寫延遲。Gengar支持多個用戶之間的內存共享,并且通過租賃機制來減少維護數據一致性的管理開銷。實驗結果表明,Gengar能顯著提分布式共享異構內存池的性能,與已有的分布式異構內存系統相比,其性能提升高達70%。
該成果“Gengar: An RDMA-based Distributed Hybrid Memory Pool” 發表在CCF B類國際學術會議41th IEEE International Conference on Distributed Computing Systems (ICDCS 2021)上。IEEE分布式計算系統國際研討會(IEEE ICDCS)是計算機分布式計算領域的頂級國際會議,本屆會議共收到489篇投稿,共錄用97篇論文,錄用率約為19.8%。

- 論文鏈接:
- https://ieeexplore.ieee.org/document/9546450
- 開源鏈接:
- https://github.com/CGCL-codes/gengar
摘要
非易失性內存(NVM)具有比DRAM更高的存儲密度、更低的功耗和成本,已被越來越多地應用于數據中心。盡管以前有許多關于在單機環境中使用NVM的研究,但在分布式數據中心環境中有效利用它仍然存在諸多挑戰。我們設計并實現了支持RDMA的分布式共享異構內存(DSHM)池系統Gengar。它具有非常簡單的編程API,可以在全局內存地址空間中分配遠端NVM和DRAM。為了降低遠端NVM訪問延遲,我們利用客戶端RDMA原語的語義來識別異構內存池中經常訪問的熱點數據,并將其緩存在分布式的DRAM緩沖區。為了減少RDMA寫的高延遲,我們重新設計了RDMA通信協議,通過代理機制把RDMA寫從應用執行的關鍵路徑上移除。Gengar還支持多個用戶之間的內存共享,并保證數據的一致性。我們在配備了Intel Optane DC Persistent DIMMs的硬件平臺上對Gengar進行了測試。實驗結果表明,與已有的DSHM系統相比,Gengar顯著提高MapReduce和YCSB等公共基準測試集的性能達70%。
背景與動機
目前,遠端NVM訪問的高延遲是在數據中心環境中使用DSHM的一個主要問題。例如,256字節對象的遠端訪問延遲約為7.3us,比本地NVM的讀取延遲(~0.7us)高一個數量級,比本地NVM的寫入延遲(~2.3us)也高出很多。因此,如何有效降低遠端NVM訪問的讀/寫延遲是設計分布式持久內存池系統需要考慮的一個重要問題。

圖1 RDMA read/write/send操作的數據流圖
圖1顯示了RDMA read / write / send等操作的數據流圖。一個RDMA操作往往涉及多個組件,即本地應用程序、本地內存區域(MR)、本地網絡接口卡(NIC)、遠端NIC和遠端內存(如NVM)。不同的RDMA通信模型都允許這些解耦的組件單獨進行數據傳輸,因此為優化不同組件中的RDMA通信性能提供了廣闊的機會。例如,MR重用機制已被廣泛用于降低MR注冊的成本。FaSST利用合作多任務、網卡doorbell批處理和事件凝聚機制來優化RPC,從而降低RDMA網絡延遲。DaRPC通過在服務器端利用完成隊列共享/聚合來改善RDMA操作和RPC處理的并行性。我們在支持RDMA的DSHM系統中發現了以下性能優化的機會。
首先,RDMA通信的異步特性有可能被用來改善RDMA寫操作。從RDMA網絡堆棧的角度來看,所有的RDMA操作(send/recv, read/write等)都在不同的組件中進行異步處理。然而,從應用的角度來看,單個RDMA寫操作的延遲仍然相當高,因為RDMA寫請求必須等待從遠端網卡(NIC)返回的WC事件。一些工作選擇放棄可靠連接(RC)模式,以實現RDMA操作的高吞吐量。例如,Herd使用不可靠的連接(UC)模式,FaSST使用不可靠的數據報(UD)模式。它們都通過在本地返回WC事件來隱藏網絡RTT,如圖1所示。然而,UC和UD模式不能保證在高負載的分布式內存池系統中實現可靠的數據傳輸,并可能導致嚴重的性能問題。此外,無信號的RDMA寫模式甚至不需要等待WC事件,但這種模式存在的問題是,客戶端可以迅速填滿QP,并使服務器的接收緩沖區過載,因為它可以在不被同步事件阻斷的情況下不斷發送WR。在這種情況下,RDMA自我保護機制會中斷RDMA連接,大大降低了RDMA通信的性能。總的來說,改進RDMA寫操作仍然存在挑戰。
其次,DRAM緩存機制已被證明在單機環境下的異構內存系統中可有效減小熱點數據的訪存延遲。RDMA讀操作通常以同步模式處理,因此RDMA讀延遲主要由網絡RTT和遠端NVM讀延遲決定。由于NVM的讀取延遲比DRAM的讀取延遲高2.3倍-4倍,因此通過利用分布式DRAM緩存來加快NVM的讀取速度是非常有效的。
設計與實現

圖2 Gengar的去中心化架構
圖2顯示了Gengar的去中心化系統結構。Gengar實現了基于客戶/服務器模型的遠端內存共享模式。客戶端節點運行應用程序并訪問服務器節點中的遠端內存,其中Gengar服務器管理共享的NVM和DRAM緩沖區。Gengar系統沒有集中的元數據服務器,每個客戶端在本地維護一個遠端服務器的列表,每個服務器將其可用的DRAM/NVM容量伴隨著RDMA操作的ACKs報告給客戶端。Gengar將所有服務器中的NVM資源作為一個共享內存池進行管理,并使用少量(本地或遠端)DRAM作為分布式緩沖以加快NVM的訪問速度。Gengar客戶端從共享內存池中為應用程序分配NVM,當一個對象被確定為熱(頻繁訪問)數據時,Gengar客戶端會從內存池中請求DRAM來緩存熱對象。DRAM緩存可以駐留在任何服務器節點上,因此當熱對象的數量增加時,Gengar也具有很好的擴展性。當一個對象被回收時,Gengar服務器會從DRAM緩沖區和共享NVM池中回收其內存。熱數據的緩存機制只由Gengar執行,不需要客戶端應用程序的參與。DRAM對應用程序完全透明,程序員甚至不需要知道遠端內存池的異構性。為了保證存儲在DSHM池中的所有數據都是持久的,Gengar中的分布式DRAM緩沖區實現為一個write-through的高速緩存。如果數據已經存在于DRAM緩存中,它將被同時寫入DRAM緩存和NVM中。否則,數據將繞過DRAM緩存直接寫入NVM。通過這種方式,Gengar只在DRAM中緩存經常讀取的對象,以加快RDMA讀取操作,同時保證數據的持久性。
此外,由于單邊RDMA操作不被遠端服務器的CPU和操作系統所感知,因此很難在服務器端監控數據訪問。Gengar利用RDMA讀操作的語義來識別客戶端的熱點對象。我們為地址映射表中的每個對象添加讀計數器。對于每個RDMA讀操作,由于首先需要查詢地址映射表以獲得遠端內存地址,Gengar客戶端順便更新對象的讀計數器。在一個固定的時間段內,Gengar客戶端能夠計算每個對象的RDMA讀頻率。如果一個對象的讀次數超過了一個給定的閾值,那么它就被確定為熱對象。每個Gengar客戶端單獨確定熱對象,然后將這些對象的讀計數發送到服務器,以便在全局范圍內選擇熱對象。
一般來說,使用可靠連接模式的RDMA寫操作包括五個步驟:1)客戶端應用程序為RDMA操作注冊一個MR;2)客戶端將RDMA寫工作請求(WR)添加到其發送隊列中,應用程序被掛起以等待工作完成(WC)事件;3)RDMA驅動程序處理寫WR,數據被傳輸到服務器;4)服務器創建一個WC事件并放在完成隊列(CQ)上;5)應用程序繼續運行并取消MR的注冊。所有基于RC的RDMA操作都要阻斷應用來等待WC事件,這使得客戶端和服務器之間的網絡RTT的延遲成為應用的關鍵路徑。由于網絡RTT占RDMA寫延遲的大部分,它對寫密集型應用的性能有很大影響。

圖3 Gengar的RDMA寫模式
在本文中,我們提出了一種新穎的RDMA寫模式,將RDMA寫操作的網絡RTT從應用的關鍵路徑中移除。我們仍然依靠RC模式來保證數據可靠傳輸和事件的有序交付,同時實現像UC/UD模式一樣具有極低延遲的RDMA寫操作。為了減少應用程序觀察到的RDMA寫延遲,我們重新設計了RDMA寫原語,一旦客戶端NIC收到WR,就向應用程序返回RDMA寫操作的完成事件,這樣應用程序就可以立即繼續執行。如圖3所示,此時,RDMA寫操作的完成與UC/UD模式類似(步驟1-2-3-4)。因為步驟1-2-3-4是在客戶端本地執行的,所以對應用程序來說,傳輸數據到遠端服務器的時間被隱藏了。然而,當數據真正被發送到遠端服務器時(步驟5),客戶端NIC收到確認(ACK)(步驟6),WC事件仍然被發布在CQ上。這時,RDMA驅動程序會向Gengar客戶端發送一個Write Confirm事件,以通知RDMA寫入的真正完成(步驟7)。
Gengar實際上是一個基于RDMA的異構內存資源共享的中間件。如果沒有足夠的應用語義,僅在Gengar中實現遠端內存訪問的并發控制是非常昂貴的。因此,我們認為共享內存的并發控制應該由應用程序本身來實現,例如使用鎖。然而,這仍然存在兩個挑戰。首先,新的RDMA寫模式可能會影響共享對象的并發控制。例如,如果多個客戶端同時訪問同一個對象,寫者應該被通知RDMA寫操作真正完成的時間,然后釋放寫鎖。因此,Gengar應該提供API來實現共享對象的并發控制。第二,Gengar中的緩存機制可能會導致元數據不一致的問題。當一個共享對象被釋放、被緩存到DRAM緩沖區、或從DRAM緩沖區被驅逐時,地址映射表中的相應條目應該在客戶端和服務器中被刪除/更新。如果地址更新沒有立即傳播到其他客戶端,就會出現元數據不一致的問題。
為了保證所有客戶的元數據一致性,一個簡單的方法是在DSHM池中廣播地址更新事件。然而,對于大規模的分布式系統來說,網絡泛濫的成本往往很高。在元數據同步的過程中,對對象的任何訪問都應該被阻止,直到所有客戶端達成共識。在Gengar中,我們利用服務器側的租賃分配策略來減輕元數據同步的開銷。Gengar使用一個時間戳為每個對象設置租賃到期時間。對于釋放內存和緩存對象的操作,Gengar客戶端需要等待當前租約的到期。一旦客戶端獲得了訪問對象的租約,它就可以執行RDMA操作,而不需要在多個客戶端之間頻繁同步元數據。租約的持續時間對DRAM的使用效率有很大影響,因此,我們根據對象的訪問頻率通過爬山算法來動態調整它。我們對DRAM和NVM中的熱對象和冷對象使用相反的租賃設置。Gengar為NVM中的熱對象設置了一個較短的租約,以便更早地將它們取到DRAM緩沖區。相比之下,Gengar為DRAM中的熱對象設置了一個長租約以避免過多的租約重新分配。如果Gengar客戶端已經有了租約分配,它只需要一個RTT來訪問對象的單邊RDMA讀/寫操作。否則,Gengar客戶端需要兩個RTT來訪問一個對象,其中一個RTT用于申請租賃分配,另一個RTT用于數據傳輸。為了同時保證元數據和數據的一致性,Gengar提供了一個應用層面的API(set lock)來支持共享對象的數據和元數據的并發控制。對于allocation/release/caching/eviction和read/write操作,Gengar使用一個鎖和3個RTT來完成這些RPC。
我們在配備了Intel Optane DC Persistent DIMMs的NVM硬件平臺上對Gengar進行了性能測試,并與已有的系統memHDFS, Alluxio, NVFS, Crail, Octopus, 及Hotpot進行比較。微程序測試表明,GengarR(Proxy RDMA)和GengarD(DRAM caching)可以分別提高這些微基準測試程序的吞吐量達94%和57%,其中GengarR更適用于寫密集型工作負載,而GengarD更適合讀取密集型工作負載。對公共基準測試集MapReduce而言,Gengar與Octopus相比,Teragen和Wordcount的執行時間分別減少了64%和56%,讀和寫的吞吐量分別提高了51%和70%。對鍵值存儲基準測試集而言,Gengar與Octopus和Hotpot相比,應用性能分別提高了48%和40%。對圖處理基準測試集而言,在大規模的圖數據集上,Gengar與Octopus和Hotpot相比,性能提高了60%和52%。
參考文獻:
Zhuohui Duan, Haikun Liu, Haodi Lu, Xiaofei Liao, Hai Jin, Yu Zhang, Bingsheng He. "Gengar: An RDMA-based Distributed Hybrid Memory Pool", Procceding in the 41th IEEE International Conference on Distributed Computing Systems (ICDCS 2021),July 7-10, 2021, pp. 92-103, doi: 10.1109/ICDCS51616.2021.00018.
往期 · 回顧






