摘要
現代數據中心對內存容量的高需求促進了內存擴展和分解方面的多條創新線,其中一項獲得極大關注的工作是基于Compute eXpress Link(CXL)的內存擴展。為了更好地利用CXL,研究人員建立了幾個仿真和實驗平臺來研究其行為和特性。然而,由于缺乏支持CXL的商業硬件,大家可能仍不清楚其功能的全貌。在這項工作中,我們在最先進的實驗平臺上探索了CXL存儲器的性能表征。首先,我們使用我們提出的微基準來研究CXL存儲器的基本性能特征。基于我們的觀察結果和與連接到本地和遠程NUMA節點的標準DRAM的比較,我們還研究了CXL內存對具有不同卸載和交織策略的端到端應用程序的影響。最后,我們為未來的程序員提供了一些指南,以充分發揮CXL內存的潛力。
?1.簡介?
在數據中心存儲和處理數據的爆炸性需求、以及傳統DDR內存接口的有限帶寬和容量可擴展性,要求采用新的內存接口技術和系統架構。其中,Compute eXpress Link(CXL)已成為業界和學術界最有前途的技術之一,不僅用于內存容量/帶寬擴展,還用于內存分解。
CXL是由主要硬件供應商和云提供商于2019年共同制定的開放標準,目前仍在快速發展。具體來說,與傳統的PCIe互連相比,它提供了一組新功能,使CPU能夠以具有加載/存儲語義的高速緩存一致方式與外圍設備(及其連接的存儲器)通信。因此,與內存相關的設備擴展是CXL的主要目標場景之一。
作為未來數據中心的事實標準,主要硬件供應商已在其產品路線圖中宣布支持CXL。鑒于CXL存儲器的受歡迎程度和前景,它備受關注。然而,由于缺乏支持CXL的商用硬件(尤其是CPU),最近對CXL內存的研究都是基于使用多插槽NUMA系統的仿真,因為CXL內存被公開為NUMA節點。因此,這些研究可能無法準確地對現實世界中的CXL內存進行建模和表征。
隨著Intel第4代Xeon可擴展CPU(Sapphire Rapids或SPR)和商用CXL設備的出現,我們能夠開始了解CXL存儲器的實際特性,并定制能夠充分利用這些特性的軟件系統。在這項工作中,我們在由Intel SPR CPU和基于Intel Agilex-I FPGA的CXL存儲器(R-Tile中加固的CXL控制器)組成的測試臺上,對具有多個微基準和端到端應用程序的CXL內存進行了全面分析。從我們的微基準標記中,我們發現CXL內存的行為與遠程NUMA節點中的內存不同,后者通常用于仿真。與基于NUMA的內存相比,真正的CXL內存具有:(1)更高的延遲,(2)更少的內存通道(導致更低的吞吐量),以及(3)在各種操作下不同的傳輸效率。
基于上述觀察,我們還將CXL內存應用于表現出不同內存訪問行為的三個實際應用程序。我們發現它們對CXL內存卸載有不同的敏感性。具體而言,我們發現(1)μs延遲數據庫對內存延遲的增加高度敏感,(2)當數據庫在CXL內存上運行時,具有中間計算層的ms延遲微服務受到的影響較小,(3)內存密集型ML推理對CXL內存提供的隨機訪問吞吐量敏感。在所有情況下,在連接CPU的DRAM和CXL內存之間交錯內存可以減少CXL內存帶來的性能損失。
接下來,在分析了在使用CXL內存的系統上運行的微基準和應用程序的性能特征后,我們為用戶提供了一些實用的指導方針,以優化他們的軟件堆棧/庫以獲得最高性能。例如,應該使用在CXL內存和DRAM之間均勻分布的帶寬來最大限度地提高性能;應當使用高速緩存旁路指令來進行從CXL存儲器到CXL存儲器的數據移動;對于單個CXL內存通道,由于幾個線程很容易使負載或存儲帶寬飽和,因此應該限制對CXL內存的寫線程數量,以減少寫干擾;并且應該針對以毫秒級延遲運行的讀取量大的應用程序,其中較高的CXL內存延遲可以通過中間計算來分攤。
本文的其余部分組織如下。我們在第2章中簡要介紹了CXL,并在第3章中描述了我們的實驗設置。然后,我們在第4章中用我們的微基準來分析CXL記憶,在第5章中用三個有代表性的應用來介紹我們的發現。最后,我們在第6章中提供了一些有效利用CXL內存的指南。
2.背景
2.1
Compute eXpress Link (CXL)
PCI Express(PCIe)是高速串行計算機擴展總線的標準,它取代了舊的PCI總線。自2003年以來,每一代的帶寬都翻了一番,截至PCIe Gen 5,帶寬已達到32 GT/s(即64 GB/s,帶16個通道)。其點對點拓撲結構借助帶寬的增長,實現了與PCIe連接設備(如圖形處理單元(GPU)、網絡接口卡(NIC)和NVMe固態硬盤(SSD))的低延遲、高帶寬通信。
CXL在PCIe物理層上構建緩存一致性系統。與標準PCIe通信類似,在標準PCIe通信中,數據傳輸使用事務層數據包(TLP)報頭和數據鏈路層數據包,CXL協議的子集使用預定義的報頭和16B塊來傳輸數據。在CXL 1.1中,根據協議和傳輸的數據,CXL硬件將根據CXL規范中描述的一組規則,將標頭和數據打包到68 B flit(64 B CXL數據+2 B CRC+2 B協議ID)中。除非另有說明,否則在本文的剩余部分中,CXL指的是CXL 1.1。
CXL標準定義了三個獨立的協議:CXL.io、CXL.cache和CXL.mem。CXL.io使用標準PCIe中的TLP和DLLP等功能,主要用于協議協商和主機設備初始化。CXL.cache和CXL.mem分別為設備訪問主機的內存和主機訪問設備的內存使用上述協議頭。
通過將這三種協議相結合,CXL為不同的用例確定了三種類型的設備。Type-1設備使用CXL.io和CXL.cache,它們通常指的是不應用主機管理內存的SmartNIC和加速器。Type-2設備支持所有三種協議。這些設備,如GP GPU和FPGA,具有主機CPU可以訪問和緩存的附加內存(DRAM、HBM),并且它們還使用CXL.cache進行設備到主機的內存訪問。Type-3設備支持CXL.io和CXL.mem,并且這些設備通常被視為對現有系統的內存擴展。在本文中,我們將重點介紹Type-3設備,并介紹CXL.mem的較低級別細節。
由于CXL.mem協議只考慮主機到設備的內存訪問,因此該協議由兩個簡單的內存訪問組成:從主機到設備內存的讀取和寫入。每次訪問都伴隨著來自設備的完成回復。從設備內存讀取時,應答包含數據,在寫入時僅包含完成標頭。圖1顯示了這些訪問路線。
圖1:支持CXL的典型系統體系結構(左)和內存事務流
CXL.mem協議在CPU歸屬代理和設備上的CXL控制器之間進行通信。當歸屬代理處理協議時,CPU以與訪問DRAM相同的方式發出加載和存儲指令來訪問存儲器。這比其他內存擴展解決方案(如遠程直接內存訪問(RDMA))具有優勢,后者涉及設備上的DMA引擎,因此具有不同的語義。將加載/存儲指令與CXL.mem集成還意味著CPU將在其所有級別的緩存中緩存PCIe連接的內存,這對于除持久內存之外的任何其他內存擴展解決方案來說都是不可能的。
2.2
支持CXL的商品硬件
CXL需要主機CPU端和設備端的支持。截至目前,除了一些研究原型外,三星、SK海力士、美光和瀾起等主要硬件供應商還設計了多個支持CXL的存儲設備。為了促進更靈活的內存功能和近內存計算研究,英特爾還在其最新的Agilex-I系列FPGA上啟用CXL.mem,其中CXL和內存相關的IP核在小芯片上進行硬編碼,以實現高性能。在主機CPU方面,Intel最新的第4代Xeon可擴展處理器(代號Sapphire Rapids,SPR)是第一款支持CXL1.1標準的高性能商用CPU。我們預計,在不久的將來,越來越多的硬件供應商的產品將支持更豐富的CXL。
3.實驗裝置
在這項工作中,我們使用兩個測試臺來評估最新的商品CXL硬件,如表1所示。該服務器配備Intel Gold 6414U CPU和128 GB CXL.mem協議以及4800MT/s DDR5 DRAM(分布在8個內存通道中)。在第4代中,Intel Xeon CPU被實現為四個單獨的小芯片。用戶可以決定使用這4個小芯片作為統一處理器(即共享的末級緩存(LLC)、集成內存控制器(iMC)和根復合體),或者在子NUMA集群(SNC)模式下,每個小芯片作為一個小NUMA節點運行。這種靈活性允許用戶微調系統以適應其工作負載特性,并對資源共享和隔離進行細粒度控制。在我們的實驗中,我們將探索SNC和CXL.mem之間的內存交錯將如何影響應用程序的性能。我們還在雙插槽系統上進行了一些實驗,該系統具有兩個Intel Platinum 8460H和相同的DDR5 DRAM,以在基于NUMA的常規內存和CXL.mem之間進行一些比較。
表1:試驗臺配置
對于CXL內存設備,系統有一個Intel Agilex-I開發套件。它有16 GB 2666MT/s DDR4 DRAM作為CXL內存,并通過x16 PCIe Gen 5接口連接到CPU。它作為一個具有16GB內存而沒有CPU內核的NUMA節點透明地暴露給CPU和OS,并且CXL內存的使用與常規的基于NUMA的內存管理相同。
請注意,CXL協議本身并沒有定義底層內存的配置。這樣的配置包括但不限于容量、介質(DRAM、持久存儲器、閃存芯片等)和存儲器通道的數量。因此,不同的器件可能表現出不同的性能特征。
4.基于微基準的特性研究
在本節中,我們介紹了使用我們的微基準來評估CXL內存的發現。我們相信,這一分析深入解讀了CXL內存用戶如何根據他們的用例更有效地利用CXL內存。我們還將這些結果與最近關于CXL內存的一些工作中的假設和模擬進行比較,在這些工作中,CXL內存是使用具有一些額外延遲的跨NUMA數據訪問來模擬的。
4.1
微基準描述
為了徹底檢查CXL內存的能力,我們開發了一個稱為MEMO的微基準測試。此基準測試旨在針對CXL內存的各種用例,并在Linux用戶空間上運行。用戶可以提供命令行參數來指定MEMO要執行的工作負載。之后我們計劃開源MEMO。
特別地,MEMO具有以下能力:(1)通過使用NUMA_lalloc_node函數從不同的源分配內存,包括本地DDR5內存、CXL內存無CPU NUMA節點或遠程DDR5,(2)啟動指定數量的測試線程,將每個線程固定到一個內核,并可選地啟用或禁用內核,以及(3)使用內聯匯編語言執行存儲器訪問。基準測試報告不同指令(如加載、存儲和非臨時存儲)的內存訪問延遲或聚合帶寬,所有內存訪問都使用AVX-512指令完成。此外,MEMO可以在內存區域上執行指針跟蹤,并且通過改變工作集大小(WSS),基準可以顯示平均訪問延遲如何隨著WSS跨越緩存層次結構的不同大小而變化。
4.2
延遲分析
在延遲測試中,MEMO從刷新測試地址的緩存線開始,并立即發出mfence指令。然后,MEMO發出一組nop指令來刷新CPU管道。當使用加載指令進行測試時,我們記錄訪問清空的緩存行所花費的時間;當使用存儲指令進行測試時,我們記錄執行臨時存儲所需的時間,然后記錄緩存線寫回(clwb),或者記錄非臨時存儲的執行時間,然后再記錄sfence。此外,我們測試了在禁用所有預取的情況下,在大內存空間中通過指針追逐的平均訪問延遲。圖2顯示了四條測試指令的延遲,1GB內存空間下的平均指針追逐延遲,以及不同工作集大小下的指針追逐延遲。
圖2:訪問延遲。1GB空間中單AVX512加載(ld)、存儲和回寫(st+wb)、非臨時存儲(nt-st)和順序指針追逐(ptr-chase)的平均延遲;連續指針追蹤延遲與工作集大小(右)。在這兩種情況下,都會禁用所有級別的預取
我們的結果(圖2)顯示,CXL內存訪問延遲比8通道本地DDR5(DDR5-L8)訪問高約2.2倍,而單通道遠程DDR5比DDR5-L8高約1.27倍。根據先前對持久存儲器的研究,訪問最近刷新的高速緩存線可能會比正常的高速緩存未命中訪問產生更高的延遲,這是由于此類刷新高速緩存線的額外高速緩存一致性握手導致的。指針追逐反映了應用程序所經歷的更現實的訪問延遲。在MEMO中,工作集首先在預熱運行中被引入緩存層次結構。圖2中的右圖顯示了不同工作集大小下的平均內存訪問時間。指針追逐延遲的每次跳躍對應于跨越L1、L2和LLC大小的邊界。圖2中的結果顯示,CXL內存中的指針追逐延遲比DDR5-L8訪問高4倍。CXL內存上的指針追逐延遲比DDR5-R1訪問高2.2。有趣的是,當工作集大小在4MB到32MB之間時,與CXL內存相比,DDR5-R1表現出更高的延遲。我們認為這種差異可歸因于LLC大小的差異,Xeon 8460H的LLC大小幾乎是Xeon 6414U的兩倍。
值得注意的是,盡管CXL控制器和DDR4存儲器控制器在FPGA芯片上得到了加固,但CXL存儲器較長的訪問延遲可部分歸因于其FPGA實現。盡管我們預計CXL存儲器設備的ASIC實現將導致延遲的改善,但我們認為它仍將高于常規的跨NUMA訪問,這主要是由于與CXL協議相關的開銷。此外,我們在第5節中的實際應用程序評測顯示,根據應用程序的特定特性,延遲懲罰有所減少。還應該注意的是,基于FPGA的CXL設備的好處在于它們能夠在CXL存儲器數據路徑上添加(內聯)加速邏輯,以及以接近存儲器的方式卸載存儲器密集型任務。
另一方面,CXL內存上具有sfence的非臨時存儲指令的延遲明顯低于臨時存儲后的緩存線寫回。這兩種操作都將數據從CPU核心傳輸到CXL內存,而延遲差異約為2.6倍。這種延遲差異是由于CXL的MESI緩存一致性協議中的所有權讀取(RFO)行為造成的,在該協議中,每次存儲未命中都會將緩存線加載到緩存中。這種訪問延遲的差異稍后會轉化為帶寬差異,這將在第4.3節中討論。
4.3
帶寬分析
在我們的帶寬測試中,MEMO在每個測試線程中執行順序或隨機訪問塊。主程序通過對訪問的字節數求和來計算固定間隔的平均帶寬。為了便于公平比較內存通道數,我們測試了遠程DDR5,在CXL內存旁邊只有一個內存通道(DDR5-R1)。
4.3.1 順序訪問模式
順序訪問反映了內存方案在特定操作下的最大可能吞吐量,結果如圖3所示。在使用DDR5-L8進行測試期間,我們觀察到負載帶寬線性縮放,直到其峰值達到221 GB/s的最大帶寬,大約有26個線程。相比之下,非臨時存儲指令達到了170GB/s的最大帶寬,這低于加載指令的帶寬,但線程數較低,約為16。
圖3:順序訪問帶寬。實驗顯示了8通道(a)的本地DDR5、CXL內存(b)和1通道(c)的遠程DDR5的最大可能帶寬。(b)中的灰色虛線顯示DDR4-2666MT/s的理論最大速度
相比之下,與DDR5-L8相比,CXL存儲器表現出明顯的帶寬趨勢。具體來說,通過加載指令,CXL內存可以在大約8個線程的情況下達到其最大帶寬,但當線程數增加到12個線程以上時,這個值會降至16.8 GB/s。另一方面,非臨時存儲僅用2個線程就展示了令人印象深刻的22GB/s的最大帶寬,這接近于測試DRAM的最大理論帶寬。然而,當我們增加線程數時,這個帶寬會立即下降,這表明FPGA內存控制器受到了一些干擾。
CXL內存的時間存儲帶寬顯著低于非時間存儲,這與圖4.2中報告的時間存儲的高延遲一致。這種差異是由于第4.2節中描述的時間存儲中的RFO行為造成的,這顯著降低了CXL存儲器的傳輸效率。這種減少是因為與非臨時存儲相比,RFO需要額外的核心資源和額外的微片往返來加載和驅逐高速緩存行。
圖4:數據傳輸帶寬。顯示不同工作負載下數據傳輸效率的實驗。D2C是local-DDR5到CXL內存的縮寫。(b)中的所有實驗都是用單個線程完成的。
此外,圖3c顯示DDR5-R1的順序訪問性能與CXL內存類似。由于DDR5和UPI互連具有更高的傳輸速率和更低的延遲,DDR5-R1在負載和非臨時存儲中顯示出更高的吞吐量,但在臨時存儲中表現出類似的吞吐量。
除了上述指令外,我們還測試了一條新的x86指令movdir64B,它是SPR上新提供的指令。該指令將64B數據從源內存地址移動到目標內存地址,并明確繞過緩存加載源并將其存儲到目標位置。如圖4a所示,我們的結果表明,D2*操作表現出類似的行為,而C2*操作通常表現出較低的吞吐量。從這些結果中,我們可以得出結論,來自CXL內存的較慢負載會導致movdir64B的吞吐量較低,在C2C的情況下更是如此。
作為SPR的新產品,Intel Data Streaming Accelerator(Intel DSA)使內存移動操作能夠從主機處理器上卸載。Intel DSA由工作隊列(WQ)和處理引擎(PE)組成,前者用于保存已卸載的工作描述符,后者用于從WQ中提取描述符以進行操作。描述符可以通過等待每個已卸載的描述符完成后再卸載另一個描述符來同步發送,也可以通過連續發送描述符來異步發送,從而使WQ有許多正在運行的描述符。通過設計程序以最佳方式異步使用Intel DSA,可以實現更高的吞吐量。為了進一步提高吞吐量,可以對操作進行批處理以攤銷卸載延遲。圖4b顯示了通過memcpy()或movdir64B在主機處理器上執行內存復制操作,并使用不同批處理大小(如1、16和128)的Intel DSA同步/異步執行內存復制時觀察到的最大吞吐量。雖然到Intel DSA的非批處理同步卸載與非批處理內存復制的吞吐量相匹配,但任何級別的異步或批處理都會帶來改進。此外,與僅使用CXL連接的內存相比,拆分源數據位置和目標數據位置可產生更高的吞吐量,C2D案例報告稱,由于DRAM上的寫入延遲較低,因此吞吐量更高。
在我們的帶寬分析過程中,我們觀察到了線程數量增加導致帶寬減少的情況。雖然數據訪問在每個工作線程內是順序的,但隨著線程數的增加,CXL控制器和擴展DRAM之間的內存控制器接收到的請求模式更少。因此,CXL內存的性能受到了阻礙。
4.3.2 隨機存取模式
為了評估MEMO對隨機塊訪問的性能,我們按順序發布AVX-512訪問的塊,但每次都有隨機偏移。這種方法使我們能夠在數據訪問模式不可預測的現實工作條件下測量系統的性能。隨著我們在測試的線程計數中增加塊大小,內存訪問模式將收斂到順序訪問,其中CPU緩存和內存控制器都可以提高整體帶寬。為了確保塊級別的寫入順序,我們在nt存儲的每個塊之后發布一個sfence。隨機塊訪問的結果如圖5所示。
圖5:隨機塊訪問帶寬。行順序(從上到下):本地DDR5、CXL內存、遠程DDR5。列順序(從左到右):加載、存儲、nt存儲。線程數在頂部圖例中表示
當塊大小較小(1KB)時,我們在隨機塊加載中觀察到類似的模式,所有三種存儲器方案都同樣受到隨機訪問的影響。然而,當我們將塊大小增加到16KB時,DDR5-L8和DDR5-R1/CXL內存之間出現了主要差異。DDR5-L8的帶寬隨線程數呈次線性擴展,而DDR5-R1和CXL內存從更高的線程數(4個線程后)中獲益較少,這在CXL內存中更為明顯。內存通道數起著至關重要的作用,DDR5-R1和我們的CXL內存設備只有一個內存通道,而DDR5-L8總共有八個通道。隨機塊存儲在線程數方面表現出與負載相似的模式,但增加了帶寬停止隨塊大小縮放的趨勢。
與所有其他測試的工作負載相比,CXL內存中隨機塊非臨時存儲的行為顯示出一個有趣的趨勢。單線程nt存儲可以很好地隨塊大小擴展,而線程數越高,在達到塊大小和線程數的一些最佳點后,吞吐量就會下降。例如,當塊大小為32KB時,2線程帶寬達到峰值,而4線程帶寬在塊大小為16KB時達到峰值。
我們認為,這個最佳點是由CXL內存設備內的內存緩沖區決定的。與常規存儲指令不同,nt存儲不占用CPU核心中的跟蹤資源。因此,更容易同時擁有更多的動態nt存儲指令,這可能會導致CXL內存設備中的緩沖區溢出。
盡管如此,非臨時指令的優點是避免了RFO(第4.2節)和緩存污染,使它們在CXL內存設置中更具吸引力。希望使用nt存儲的程序員應該記住這種行為,以充分利用CXL內存中的nt存儲。
4.4
與使用NUMA系統的仿真的比較
最近關于CXL內存的研究通常是通過跨NUMA內存訪問來模擬CXL內存訪問延遲來進行的,即通過對主內存訪問施加額外的延遲來進行。然而,根據我們的觀察,跨NUMA仿真模型無法精確模擬CXL內存的以下特征:(1)當前CXL設備中有限帶寬的影響(除非遠程DIMM填充的通道數與CXL內存相同),(2)與跨NUMA訪問相比,延遲更高的各種CXL內存實現(在延遲受限的應用程序中,延遲更大的影響變得更嚴重),以及(3)不同工作負載下的數據傳輸效率(即負載和非臨時存儲帶寬)。
5.實際應用
為了研究CXL內存對性能的影響,我們通過將應用程序的內存全部或部分綁定到CXL內存來探索。Linux提供了numactl程序,它允許用戶(1)將程序綁定到特定的內存節點(membind模式),或(2)優先分配給內存節點,并僅在指定節點內存耗盡時將內存分配給其他節點(首選模式),或者將分配均勻地分布在一組節點上(交錯模式)。
Linux內核中最近的一個補丁現在允許對內存節點之間的頁面交錯率進行細粒度控制。這意味著,例如,如果我們將DRAM:CXL比率設置為4:1,我們可以將20%的內存分配給CXL內存。為了研究CXL內存對應用程序性能的影響,我們針對一些應用程序調整了這個交織比率。此外,我們禁用了NUMA平衡,以防止頁面遷移到DRAM。
使用這種異構內存方案的這些應用程序的性能應該作為大多數內存分層策略的準則。這是因為與加權循環分配策略相比,所提出的優化至少應該表現得同樣好。
5.1
Redis-YCSB
Redis是一種在業界流行并廣泛使用的高性能內存鍵值存儲。我們使用YCSB來測試Redis在不同內存分配方案下的性能,方法是將其內存固定到CXL內存、DRAM或分布在兩者之間。為了評估系統性能,我們在YCSB客戶端中執行了多個工作負載,同時限制每秒查詢(QPS)。具體來說,我們測量了兩個指標:(1)查詢中第99個百分點的尾部延遲,以及(2)最大可持續QPS。除了工作負載D之外,所有工作負載都對請求使用統一的分布,從而確保最大限度地增加內存壓力。我們還微調了交織比(DRAM:CXL),以將一定量的內存卸載到CXL,在不同的實驗中使用了30:1(3.23%)和9:1(10%)等比例。
我們在圖6中的結果表明,當Redis純粹在CXL內存上運行時,在低QPS(20k)下,p99尾部延遲存在顯著差距。這一差距在55k QPS之前保持相對恒定,此時YCSB客戶端無法到達目標QPS,導致尾部延遲突然增加。當Redis 50%的內存分配給CXL內存時,p99尾部延遲介于純DRAM和純CXL內存之間。盡管50%CXL內存Redis直到65k才使其QPS飽和,但尾部延遲在55k左右激增。最后,DRAMMRedis表現出穩定的尾部延遲,其QPS在80k左右飽和。
圖6:Redis p99延遲。使用YCSB工作負載A進行測試(50%讀取,50%更新)。50/100%-圖例中的R/U表示50/100%Redis內存在CXL內存上運行時的讀取/更新延遲
我們認為,尾部延遲差距歸因于Redis查詢的超低響應延遲,使這些μs級響應的延遲對內存訪問延遲高度敏感。這與我們在第4.2節中給出的延遲測量結果非常相關,其中CXL內存訪問延遲范圍從數百到1000納秒,比DRAM高2-4倍。然而,中間計算和緩存命中將延遲差異(就應用程序尾部延遲而言)降低到QPS飽和點之前的約2倍。
另一方面,CXL內存Redis可以提供的最大可持續QPS(圖7)與第4.3.2節中觀察到的隨機塊訪問帶寬相關,其中與本地-DDR5或遠程-DDR5相比,CXL存儲器的單線程加載/存儲帶寬要低得多。
圖7:Redis最大QPS。測試具有各種CXL內存配置的最大可持續Redis QPS。圖例表示Redis內存分配給CXL內存的百分比。YCSB工作負載D默認讀取最近插入的元素(lat),但我們也用Zipfian(zipf)或uniform(uni)分布中的讀取請求測試了該工作負載,以查看對訪問位置的影響。這里省略了工作負載E,因為它是范圍查詢。
單線程隨機訪問帶寬受內存訪問延遲的限制,其中單線程內的數據依賴性使CPU中的負載存儲隊列難以飽和。此外,圖7顯示了一種趨勢,即分配給CXL的內存更少(CXL內存百分比降低),在測試的所有工作負載中都能提供更高的最大QPS,但這些都無法超過純粹在DRAM上運行Redis的性能。在這種情況下,內存交錯無法提高單個應用程序的性能,因為與CXL內存的交錯總是會引入更高的訪問延遲。請注意,當前的CXL內存設置是基于FPGA的,其真正優點在于其靈活性。我們預計基于ASIC的CXL存儲器將提供相對較低的訪問延遲,從而提高延遲受限應用程序的性能。
圖8:DLRM嵌入減少吞吐量。使用8通道DRAM和CXL內存進行測試;吞吐量與線程數(左);32個線程時標準化為DRAM的不同內存方案的吞吐量(右)
5.2
DLRM中的嵌入縮減
深度學習推薦模型(DLRM)已在行業中得到廣泛部署。嵌入縮減是DLRM推理中的一個步驟,已知其內存占用率很高,占用推理延遲的50%-70%。我們在DRAM、CXL內存和交錯內存上測試了嵌入縮減,設置與MERCI相同。
圖8中的結果顯示,隨著線程數的增加,在每個方案上運行DLRM推理都是線性的,并且斜率不同。DDR5-R1和CXL存儲器的總體趨勢相似,這與第4.3.2節中的觀察結果一致,其中DDR-R1和CXL內存在訪問粒度較小時具有相似的隨機加載/存儲帶寬。內存交錯的兩個點(CXL內存上的3.23%和50%)如圖8所示。隨著我們將交錯到CXL的內存量減少,推理吞吐量也會增加。然而,我們再次觀察到,即使將3.23%的內存分配給CXL,推理吞吐量也無法與純粹在DRAM上運行的吞吐量相匹配。還要注意,純DRAM推理吞吐量呈線性擴展,其線性趨勢似乎擴展到32個線程之外。結合這兩個觀察結果,我們可以得出結論,8通道DDR5內存可以在32個線程之外維持DLRM推斷。
圖8:DLRM嵌入減少吞吐量。使用8通道DRAM和CXL內存進行測試;吞吐量與線程數(左);32個線程時標準化為DRAM的不同內存方案的吞吐量(右)
為了演示應用程序受內存帶寬限制的場景,我們測試了SNC模式下的推理吞吐量。回想一下,英特爾在SPR中引入了子NUMA集群功能,其中小芯片被拆分為四個單獨的NUMA節點,每個NUMA節點上的內存控制器獨立于其他節點工作。通過在一個SNC節點上運行推理,我們有效地將推理限制在兩個DDR5通道上運行,使其具有內存限制。
圖9展示了在SNC模式下運行推理的結果,CXL內存以與之前所有實驗相同的方式交錯。圖中的綠色條顯示了SNC上的推理吞吐量,它在24個線程后停止線性縮放。在28個線程中,推理受到兩個內存通道的限制,并且將內存交織到CXL會產生略高的推理吞吐量。這種趨勢持續存在,在32個線程中,將20%的內存放在CXL上,與SNC情況相比,推理吞吐量增加了11%。未來,我們預計CXL設備的帶寬將與本機RAM相當,這將進一步提高內存帶寬綁定應用程序的吞吐量。
圖9:DLRM嵌入縮減吞吐量
5.3
DeathStarBench
DeathStarBench(DSB)是一個開源基準套件,旨在評估系統上微服務的性能。它使用Docker來啟動微服務的組件,包括機器學習推理邏輯、web后端、負載均衡器、緩存和存儲。DSB為社交網絡框架提供了三個單獨的工作負載和一個混合的工作負載。圖10顯示了撰寫帖子、讀取用戶時間線和混合工作負載的第99個百分點的尾部延遲。我們省略了讀取home timeline的結果,因為它不在數據庫上操作,因此與用于數據庫的內存類型無關。在我們的實驗中,我們將具有高工作集大小的組件(即存儲和緩存應用程序)固定到DDR5-L8或CXL內存中。我們將計算密集型部分留在DDR5-L8。這些組件的內存細分如圖10所示。
圖10:DeathStarBench p99延遲和內存細分。工作負載:撰寫帖子(左)、讀取用戶時間線(左中)、混合工作負載(右中)、按功能劃分的內存細分(右)。混合工作負載有60%讀取主頁時間線,30%讀取用戶時間線,10%撰寫帖子。
圖10中的結果顯示,在撰寫帖子的情況下存在尾部延遲差異,而在讀取用戶時間線和混合工作負載的情況下幾乎沒有差異。請注意,DSB中的尾部延遲為毫秒級,遠高于YCSB Redis。
當我們分析撰寫帖子和讀取用戶時間線的軌跡時,我們發現撰寫帖子涉及更多的數據庫操作,這給CXL內存帶來了更大的負載。同時,讀取用戶時間線的大部分響應時間都花在了nginx前端。這使得較長的CXL內存訪問延遲可以在計算密集型組件中分攤,從而使尾部延遲對數據庫訪問延遲的依賴性大大降低。
最后,混合工作負載顯示了真實社交網絡的模擬用例,總體而言,大多數用戶閱讀了一些用戶撰寫的帖子。盡管在混合工作負載中,隨著QPS的增加,將數據庫固定到CXL內存會顯示出略高的延遲,但總體飽和點類似于在DDR5-L8上運行數據庫。
DSB的結果提供了CXL內存的一個有趣的用例,即只要計算密集型組件保留在DRAM中,以低需求率運行的緩存和存儲組件就可以分配給較慢的CXL內存,并且應用程序的性能基本保持不變。
6.CXL內存的最佳實踐
鑒于CXL內存的獨特硬件特性,我們在充分利用CXL內存方面提供了以下見解。
將數據從CXL內存移出或移動到CXL內存時,請使用非臨時存儲或movdir64B。如第4節所示,不同的x86指令在訪問CXL內存時表現出顯著不同的性能,這是由于CPU核心的微體系結構設計和CXL內存的固有行為造成的。考慮到CXL內存的使用情況(例如,內存分層),短期數據重用的可能性不大,為了實現更高的數據移動吞吐量并避免污染寶貴的緩存資源,我們建議在相應的軟件堆棧中優先考慮nt store或movdir64B指令。請注意,由于nt store和movdir64B都是弱排序的,因此需要使用內存圍欄來確保數據已被寫入。
限制并發寫入CXL內存的線程數。如前所述,CXL內存的性能取決于CPU和設備控制器。對于并發CXL內存訪問尤其如此,因為爭用可能發生在多個位置。盡管CXL存儲器控制器的當前基于FPGA的實現可能會限制內部緩沖區大小,從而限制動態存儲指令的數量,但我們預計,在純基于ASIC的CXL存儲器設備上仍然存在該問題。最好在CPU軟件端有一個集中的通信存根來進行數據移動。我們建議CXL內存應由操作系統或專用軟件守護程序管理,而不是由所有應用程序管理。
使用Intel DSA進行從CXL內存到CXL內存的大容量內存移動。當在常規DRAM和CXL存儲器上傳輸大量數據時,前兩個見解可能仍然不足,因為它們消耗了大量的CPU周期,并且仍然具有有限的指令/存儲器級并行性。我們發現,與前代產品相比,Intel DSA具有高吞吐量、靈活性和更少的限制,可以很好地進一步提高此類數據移動的性能和效率。這在分層內存系統中尤其有用,因為分層內存系統的數據移動通常以頁面粒度(即4KB或2MB)進行。
使用NUMApolices和其他分層內存方法交錯內存,以便在所有DRAM和CXL通道上均勻分配內存負載。除了將CXL存儲器用作較慢的DRAM或較快的SSD(例如,存儲器分層)之外,CXL存儲器還可以與常規存儲器通道交織,以增加總存儲器帶寬,尤其是當CXL存儲器設備作為更多的存儲器通道(從而更具可比性的存儲器帶寬)時。仔細選擇交錯百分比/策略可以在很大程度上緩解預期的性能下降。
避免在CXL內存上運行具有μs級延遲的應用程序。CXL內存相對較長的訪問延遲可能會成為需要以精細時間粒度(μs級)進行即時數據訪問的應用程序的主要瓶頸。Redis就是這樣一個例子——由于CXL內存導致的延遲數據訪問將積累到端到端查詢處理的重要價值。這種類型的應用程序仍然應該考慮將數據固定在更快的介質上。
微服務可能是CXL內存卸載的一個很好的候選者。微服務架構由于其靈活、便于開發、可擴展和敏捷,已成為當今數據中心互聯網和云服務的主流開發方法。然而,與傳統的單片應用程序相比,它的分層和模塊化設計確實帶來了更高的運行時開銷。這樣的表征使其對底層高速緩存/存儲器配置和參數不那么敏感。我們對DSB的研究(見第5.3節)也證明了這一點。我們設想,很大一部分微服務數據可以卸載到CXL內存,而不會影響其延遲或吞吐量性能。
利用可編程CXL內存設備探索在線加速的潛力。鑒于上述見解,那些適合CXL內存卸載的應用程序可能對數據訪問延遲不太敏感。這為CXL內存設備內的內聯加速邏輯提供了更多的設計空間——盡管這種加速可能會給數據訪問增加額外的延遲,但從目標應用程序的端到端角度來看,這種開銷是不可見的。因此,我們仍然提倡基于FPGA的CXL存儲設備,因為它們具有靈活性和可編程性。
6.1
?應用分類
從分析的應用程序中,我們根據在CXL內存上運行時的性能確定了兩種類型的應用程序:帶寬受限和延遲受限。
內存帶寬受限的應用程序通常會經歷吞吐量的次線性增長,超過一定的線程數。盡管在CXL內存上運行Redis和DLRM推理都會產生較低的飽和點,但應該明確區分兩者,只有DLRM推理是帶寬受限的應用程序。單線程Redis受到CXL內存更高延遲的限制,這降低了Redis的處理速度。
內存延遲受限的應用程序即使將少量工作集分配給延遲較高的內存,也會感知到吞吐量下降。在數據庫的情況下,當在CXL內存上運行時,即使QPS離飽和點很遠,它們也可能顯示出尾部延遲間隙。Redis和memcached等在μs級延遲下運行的數據庫在純CXL內存上運行時受到的懲罰最大。相比之下,具有計算層的毫秒級微服務顯示出將內存卸載到CXL內存的良好用例。
然而,在這兩種情況下,在傳統的CPU連接的DRAM和CXL內存之間使用交錯內存可以減少較慢的CXL內存在吞吐量(第5.2節)和尾部延遲(第5.1節)方面的損失。這種循環策略應該作為分層內存策略的基線。
7.相關研究
隨著存儲器技術的快速發展,除了基于常規DDR的DRAM之外,數據中心還出現了許多新型存儲器,每種存儲器都有不同的特點和權衡。這些包括但不限于持久存儲器,如Intel Optane DIMM,基于RDMA的遠程/分解存儲器,甚至字節可尋址SSD。盡管CXL內存已經被廣泛研究和分析,但作為內存層中的一個新成員,其性能特征和指標仍不明確。
自2019年概念提出以來,CXL已經被許多研究人員討論過。例如,Meta設想使用CXL內存進行內存分層和交換;微軟構建了一個用于內存分解探索的CXL內存原型系統。他們中的大多數人使用NUMA機器來模擬CXL內存的行為。Gouk等人在基于FPGA的RISC-V CPU上構建了CXL存儲器原型。與之前的研究不同,我們是第一個在商品CPU和CXL設備上進行CXL內存研究的,既有微基準測試,也有實際應用。這使我們的研究更加現實和全面。
8.結論
CXL已經成為未來的設備互連標準,具有豐富的有用功能,而CXL內存就是其中的一個重要功能。在這項工作中,基于最先進的實際硬件,我們使用微基準和實際應用程序對CXL內存進行了詳細的表征分析。通過對CXL存儲器行為的獨特觀察,我們還為程序員提供了一些使用指南,以更好地利用CXL內存。我們希望這項工作能夠促進CXL內存生態系統的開發和采用。
編輯:黃飛
?
評論
查看更多