RDMA 被用在很多地方,主要是因為它可以實現(xiàn)高性能。在這篇文章中,我將提供有關如何從多個方面優(yōu)化 RDMA 代碼的建議和技巧
簡單的科普下RDMA
什么是RDMA?
DMA 代表直接內(nèi)存訪問。這意味著應用程序可以在 CPU 干預的情況下直接訪問(讀/寫)主機內(nèi)存。如果您在主機之間執(zhí)行此操作,它將成為遠程直接內(nèi)存訪問 (RDMA)
在閱讀有關 RDMA 的內(nèi)容時,您會注意到一些用于描述其優(yōu)點的術語。 “零復制 Zero Copy”、“內(nèi)核繞過 Kernel Bypass”、“協(xié)議卸載 Protocol Offload”和“協(xié)議加速 Protocol Acceleration”等術語
RDMA 的工作原理
RDMA 的工作原理是通過硬件路徑(NIC 和網(wǎng)絡)將數(shù)據(jù)從一臺主機上的用戶應用程序內(nèi)存直接復制到另一臺主機上的用戶應用程序內(nèi)存中。RDMA是下圖中的藍線(圖 3)。綠線描繪了您早已了解的傳統(tǒng) TCP/IP 流量
請注意,如果應用程序駐留在內(nèi)核空間中,它“僅”繞過操作系統(tǒng)堆棧和系統(tǒng)驅(qū)動程序,但這仍然提供了顯著的性能提升
零復制和內(nèi)核繞過
這些術語指的是 RDMA 提供的速度增益,因為與正常的 TCP/IP 行為相比,數(shù)據(jù)不必多次從應用程序內(nèi)存緩沖區(qū)復制到內(nèi)核內(nèi)存緩沖區(qū)。RDMA通過其他復制操作傳遞到 NIC,NIC 通過網(wǎng)絡將其發(fā)送到其他主機。在另一臺主機上,必須發(fā)生相反的過程。 NIC 內(nèi)存緩沖區(qū)中的數(shù)據(jù)被復制到內(nèi)核空間,并在內(nèi)核空間中再次復制并發(fā)送到用戶空間到應用程序內(nèi)存緩沖區(qū)。
您會注意到正在進行大量復制,這是 RDMA 避免的開銷(零復制)。通過這樣做,還可以避免用戶空間和內(nèi)核空間之間的上下文切換(內(nèi)核繞過)。這極大地加快了速度。
CPU 卸載/旁路
該工作實際上被卸載到 NIC,因此它繞過了主機的 CPU(CPU Offload 或 Bypass)。這樣做有兩個優(yōu)點:
1. 應用程序可以訪問(遠程)內(nèi)存,而無需內(nèi)核和用戶空間進程消耗任何主機 CPU 周期進行讀寫。
2. CPU 中的緩存不會被訪問的內(nèi)存內(nèi)容填充。
CPU 周期和緩存可用于實際的應用程序工作負載,而不是用于移動數(shù)據(jù)。其好處通常是 CPU 開銷減少 20% 到 25%
傳輸協(xié)議加速
最后,RDMA 可以執(zhí)行稱為協(xié)議加速的操作。基于消息的事務以及進行收集/分散(SGL)的能力(讀取多個緩沖區(qū)并將它們作為一個整體發(fā)送,同時將它們寫入多個接收緩沖區(qū))加快了實際數(shù)據(jù)移動的速度。這有很多細節(jié)。?SNIA(存儲網(wǎng)絡行業(yè)協(xié)會)和學術研究人員的演示文稿和出版物很容易在互聯(lián)網(wǎng)上獲得,并且可能變得相當技術性
結論是 RDMA 協(xié)議本質(zhì)上是很快的。
為什么我們需要它?
除了高性能計算之外,過去十年中我們還看到各種東西方流量持續(xù)大幅增長。這始于虛擬化,它與虛擬機移動性一起帶來了性能和性能的提升。可擴展性對許多資源(網(wǎng)絡、存儲、計算)提出了挑戰(zhàn)。最重要的是,我們看到超融合基礎設施(HCI)、存儲復制和其他用例等趨勢消耗了更多的帶寬。與此同時,隨著我們獲得更快的存儲選項(NVMe、各種類型的 NVDIMM(N、F、P)或英特爾的 3D XPoint),對超低延遲的需求也隨之增加,這導致了圍繞其功能的新架構。
圖 4:毫無疑問,非易失性 DIMM(及其所有變體)將進一步推動對 RDMA 的需求(圖片由 DELL 提供)
一般建議
1. 避免在數(shù)據(jù)路徑中使用控制操作
與保留在調(diào)用它們的同一上下文中(即不執(zhí)行上下文切換)并且以優(yōu)化方式編寫的數(shù)據(jù)操作不同,控制操作(所有創(chuàng)建/銷毀/查詢/修改)操作非常昂貴, 因為:
-
大多數(shù)時候,他們執(zhí)行上下文切換
-
有時他們分配或釋放動態(tài)內(nèi)存
-
有時他們參與訪問 RDMA 設備
作為一般經(jīng)驗法則,應避免調(diào)用控制操作或減少其在數(shù)據(jù)路徑中的使用。
以下動詞(verbs接口)被視為數(shù)據(jù)操作:
-
ibv_post_send() 發(fā)送
-
ibv_post_recv() 接收
-
ibv_post_srq_recv() 共享接收隊列
-
ibv_poll_cq() 輪詢完成隊列
-
ibv_req_notify_cq 通知完成
2. 發(fā)布多條 WR 時,一次調(diào)用將它們發(fā)布到列表中
當用verbs接口ibv_post_*()中的一個, 來發(fā)送工作請求WR時,在一次調(diào)用中將多個工作請求作為鏈表發(fā)布,而不是每次使用一個工作請求進行多次調(diào)用,將提供更好的性能,因為它允許低級驅(qū)動程序執(zhí)行優(yōu)化。
3. 使用工作完成事件時,在一次調(diào)用中確認多個事件
使用事件處理工作完成時,在一個調(diào)用中確認多個完成而不是每次調(diào)用多個調(diào)用將提供更好的性能,因為執(zhí)行的互斥鎖較少。
4. 避免使用許多分散/聚集條目
在工作請求(發(fā)送請求或接收請求)中使用多個分散/聚集條目意味著 RDMA 設備將讀取這些條目并將讀取它們引用的內(nèi)存。使用一個分散/聚集條目比使用多個分散/聚集條目提供更好的性能。
5. 避免使用圍欄(Fence)
設置了柵欄標志的發(fā)送請求將被阻止,直到所有先前的 RDMA 讀取和原子發(fā)送請求完成。這會降低帶寬。
6. 避免使用原子操作
原子操作允許以原子方式執(zhí)行讀取-修改-寫入。這通常會降低性能,因為這樣做通常涉及鎖定對內(nèi)存的訪問(取決于實現(xiàn))。
7. 一次讀取多個工作完成情況
ibv_poll_cq()允許一次讀取多個完成。如果CQ中的工作完成數(shù)小于嘗試讀取的工作完成數(shù),則意味著CQ為空,無需檢查其中是否還有更多工作完成。
8. 設置特定任務或進程的處理器關聯(lián)性
當使用對稱多處理 (SMP) 機器時,將進程綁定到特定的 CPU/核心可以更好地利用 CPU/核心,從而提供更好的性能。按照機器中 CPU/核心的數(shù)量執(zhí)行進程并將進程分布到每個 CPU/核心可能是一個很好的做法。這可以通過“taskset”實用程序來完成。
9. 使用本地 NUMA 節(jié)點
在非統(tǒng)一內(nèi)存訪問 (NUMA) 計算機上工作時,將進程綁定到被視為 RDMA 設備的本地 NUMA 節(jié)點的 CPU/核心可能會因為更快的 CPU 訪問而提供更好的性能。將進程分布到所有本地 CPU/核心可能是一個很好的做法。
10. 使用緩存行對齊的緩沖區(qū)
與使用未對齊的內(nèi)存緩沖區(qū)相比,使用緩存行對齊的緩沖區(qū)(在 S/G 列表、發(fā)送請求、接收請求和數(shù)據(jù)中)將提高性能;它將減少 CPU 周期數(shù)和內(nèi)存訪問次數(shù)。
11. 避免進入重傳流
重傳是性能殺手。RDMA中重傳的主要原因有2個:
-
傳輸重傳 - 遠程 QP 未處于可以處理傳入消息的狀態(tài),即至少未達到 RTR 狀態(tài),或移至錯誤狀態(tài)
-
RNR重傳-響應方有一條消息應該消耗一個接收請求,但接收隊列中沒有任何接收請求
有些 RDMA 設備提供計數(shù)器來指示重試流發(fā)生,但并非全部。
當QP進入這些流時,將QP.retry_cnt和QP.rnr_retry設置為零將導致失?。矗瑤в绣e誤的完成)。
但是,如果無法避免重試流,請在重傳之間使用較低(盡可能)的延遲。
提高帶寬的手段
1. 找到最適合 RDMA 設備的 MTU
MTU 值指定可以發(fā)送的最大數(shù)據(jù)包有效負載大?。床话〝?shù)據(jù)包標頭)。根據(jù)經(jīng)驗,由于所有 MTU 值的數(shù)據(jù)包標頭大小都相同,因此使用最大可用 MTU 大小將降低每個數(shù)據(jù)包的“支付價格(負載開銷)”;有效負載數(shù)據(jù)占總使用帶寬的百分比將會增加。但是,有些 RDMA 設備可以為低于最大支持值的 MTU 值提供最佳性能。人們應該執(zhí)行一些測試,以便為他使用的特定設備找到最佳的 MTU。
2. 使用大消息
發(fā)送幾條大消息比發(fā)送大量小消息更有效。在應用程序級別,第一級應該通過 RDMA 收集數(shù)據(jù)并發(fā)送大消息。
3. 處理多個未完成的發(fā)送請求
處理多個未完成的發(fā)送請求并保持發(fā)送隊列始終滿(即,對于每個輪詢的工作完成發(fā)布一個新的發(fā)送請求)將使 RDMA 設備保持忙碌并防止其閑置。
4. 配置隊列對以允許并行進行多個 RDMA 讀取和原子操作
如果使用 RDMA 讀取或原子操作,建議將 QP 配置為與運行中的多個 RDMA 讀取和原子操作配合使用,因為它將提供更高的 BW。
5. 使用發(fā)送隊列中的選擇性信號
在發(fā)送隊列中使用選擇性信號意味著并非每個發(fā)送請求在結束時都會產(chǎn)生工作完成,這將減少應處理的工作完成的數(shù)量。
降低延遲的手段
1. 使用輪詢(polling)讀取工作完成情況
為了在工作完成添加到完成隊列后立即讀取它們,輪詢將提供最佳結果(而不是使用工作完成事件)。
2. 以內(nèi)嵌方式發(fā)送小消息
在支持內(nèi)聯(lián)發(fā)送數(shù)據(jù)的 RDMA 設備中,內(nèi)聯(lián)發(fā)送小消息將提供更好的延遲,因為它消除了 RDMA 設備(通過 PCIe 總線)執(zhí)行額外讀取以讀取消息有效負載的需要。
3. 在 QP 的超時和 min_rnr_timer 中使用較低的值
在 QP 的超時和 min_rnr_timer 中使用較低的值意味著,如果出現(xiàn)錯誤并且需要重試(無論是因為遠程 QP 沒有應答還是沒有未完成的接收請求),重傳之前的等待時間將簡短一點。
4. 如果使用立即數(shù)據(jù),請使用 RDMA Write with立即而不是 Send with立即
當發(fā)送僅包含立即數(shù)據(jù)的消息時,帶有立即數(shù)的 RDMA 寫入將比帶有立即的發(fā)送提供更好的性能,因為后者會導致未完成的已發(fā)布接收請求被讀?。ㄔ陧憫剑粌H僅是被消耗。
減少內(nèi)存消耗的手段
1. 使用共享接收隊列 (SRQ)
使用 SRQ 可以節(jié)省未完成的接收請求的總數(shù),從而減少消耗的總內(nèi)存,而不是為每個隊列對發(fā)布許多接收請求。
2. 注冊物理連續(xù)內(nèi)存
寄存器物理連續(xù)內(nèi)存(例如大頁)可以允許低級驅(qū)動程序執(zhí)行優(yōu)化,因為需要較少量的內(nèi)存地址轉(zhuǎn)換(與 4KB 內(nèi)存頁緩沖區(qū)相比)。
3. 將使用的隊列大小減少到最小
創(chuàng)建各種隊列(隊列對、共享接收隊列、完成隊列)可能會消耗大量內(nèi)存。人們應該將它們的大小設置為其應用程序所需的最小值。
減少CPU消耗的手段
1. 處理工作完成事件
使用事件讀取工作完成將消除在 CQ 上執(zhí)行持續(xù)輪詢的需要,因為當工作完成添加到 CQ 時,RDMA 設備將發(fā)送事件。
2. 在響應者端處理請求的事件
當在響應者端讀取工作完成時,請求事件可以是向請求者提供提示的好方法,表明現(xiàn)在是讀取完成的好時機。這減少了已處理的工作完成總數(shù)。
3. 與多個隊列共享同一個CQ
對多個隊列使用相同的 CQ 并減少 CQ 的總數(shù)將消除檢查多個 CQ 的需要,以便了解未完成的工作請求是否已完成。這可以通過與多個發(fā)送隊列、多個接收隊列或它們的混合共享相同的 CQ 來完成。
提高可擴展性的手段
1. 使用集體算法(collective algorithms), 可參考DAOS中CART的k項樹算法
使用集體算法將減少通過線路的消息總數(shù),并減少集群中每個節(jié)點將使用的消息和資源總數(shù)。有些 RDMA 設備提供特殊的集體卸載操作,有助于降低 CPU 利用率。
2. 使用不可靠數(shù)據(jù)報 (UD) QP
如果每個節(jié)點都需要能夠接收消息或向子網(wǎng)中的任何其他節(jié)點發(fā)送消息,則使用連接的 QP(可靠或不可靠)可能是一個糟糕的解決方案,因為將在每個節(jié)點中創(chuàng)建許多 QP。使用 UD QP 更好,因為它可以從子網(wǎng)中的任何其他 UD QP 發(fā)送和接收消息。
參考
Nvidia_Mellanox_CX5和6DX系列網(wǎng)卡_RDMA_RoCE_無損和有損_DCQCN擁塞控制_動態(tài)連接等詳解-一文入門RDMA和RoCE有損無損:?Nvidia_Mellanox_CX5和6DX系列網(wǎng)卡_RDMA_RoCE_無損和有損_DCQCN擁塞控制_動態(tài)連接等詳解-一文入門RDMA和RoCE有損無損-騰訊云開發(fā)者社區(qū)-騰訊云
-
分享 撰文: Dotan Barak ,2013年6月8日。2019年3月9日。
??????Tips and tricks to optimize your RDMA code - RDMAmojo RDMAmojo
曉兵(ssbandjl)
博客: https://cloud.tencent.com/developer/user/5060293/articles | https://logread.cn | https://blog.csdn.net/ssbandjl
歡迎對高性能分布式存儲PureFlash, SPDK, RDMA, 等高性能技術感興趣的朋友加入PureFlash技術交流(群)
曉兵技術雜談(系列)
https://cloud.tencent.com/developer/user/5060293/video
歡迎對DAOS, SPDK, RDMA等高性能技術感興趣的朋友加我WX(ssbandjl)進入DAOS技術交流(群)文章來源:http://www.zghlxwxcb.cn/news/detail-779033.html
DAOS匯總: https://cloud.tencent.com/developer/article/2344030文章來源地址http://www.zghlxwxcb.cn/news/detail-779033.html
到了這里,關于優(yōu)化 RDMA 代碼的建議和技巧-rdma性能優(yōu)化技巧-避坑指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!