1. DMA和RDMA概念
RDMA是Remote Direct Memory Access的縮寫,通俗的說可以看成是遠端的DMA技術,為了解決網絡傳輸中伺服器端資料處理的延遲而産生的。RDMA允許使用者态的應用程式直接讀取或寫入遠端記憶體,而無核心幹預和記憶體拷貝發生。起初,隻應用在高性能計算領域,最近,由于在大規模分布式系統和資料中心中網絡瓶頸越來越突出,逐漸走進越來越多人的視野。
1.1 DMA
傳統記憶體通路需要通過CPU進行資料copy來移動資料,通過CPU将記憶體中的Buffer1移動到Buffer2中。
DMA(直接記憶體通路)是一種能力,允許在計算機主機闆上的裝置直接把資料發送到記憶體中去,資料搬運不需要CPU的參與。
DMA模式:可以同DMA Engine之間通過硬體将資料從Buffer1移動到Buffer2,而不需要作業系統CPU的參與,大大降低了CPU Copy的開銷。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL6dGVNFTSU1EeJpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1YTMwEjN1ITM3ETMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
1.2 RDMA
RDMA是一種概念,在兩個或者多個計算機進行通訊的時候使用DMA, 從一個主機的記憶體直接通路另一個主機的記憶體。
RDMA是一種host-offload, host-bypass技術,允許應用程式(包括存儲)在它們的記憶體空間之間直接做資料傳輸。具有RDMA引擎的以太網卡(RNIC)–而不是host–負責管理源和目标之間的可靠連接配接。使用RNIC的應用程式之間使用專注的QP和CQ進行通訊:
- 每一個應用程式可以有很多QP和CQ
- 每一個QP包括一個SQ和RQ
- 每一個CQ可以跟多個SQ或者RQ相關聯
如上圖,在傳統模式下,兩台伺服器上的應用之間傳輸資料,過程是這樣的:
首先要把資料從應用緩存拷貝到Kernel中的TCP協定棧緩存;
然後再拷貝到驅動層;
最後拷貝到網卡緩存。
多次記憶體拷貝需要CPU多次介入,導緻處理延時大,達到數十微秒。同時整個過程中CPU過多參與,大量消耗CPU性能,影響正常的資料計算。
在RDMA 模式下,應用資料可以繞過Kernel協定棧直接向網卡寫資料,帶來的顯著好處有:
處理延時由數十微秒降低到1微秒内;
整個過程幾乎不需要CPU參與,節省性能;
傳輸帶寬更高。
1.3 rdma架構
上訴介紹的是RDMA整體架構架構圖。從圖中可以看出,RDMA在應用程式使用者空間,提供了一系列verbs interface接口操作RDMA硬體。RDMA繞過核心直接從使用者空間通路RDMA 網卡(RNIC)。RNIC網卡中包括Cached Page Table Entry,頁表就是用來将虛拟頁面映射到相應的實體頁面
2. RDMA的優勢
傳統的TCP/IP技術在資料包處理過程中,要經過作業系統及其他軟體層,需要占用大量的伺服器資源和記憶體總線帶寬,資料在系統記憶體、處理器緩存和網絡控制器緩存之間來回進行複制移動,給伺服器的CPU和記憶體造成了沉重負擔。尤其是網絡帶寬、處理器速度與記憶體帶寬三者的嚴重"不比對性",更加劇了網絡延遲效應。
RDMA技術,最大的突破是将網絡層和傳輸層放到了硬體中,伺服器的網卡上來實作,資料封包進入網卡後,在網卡硬體上就完成四層解析,直接上送到應用層軟體,四層解析CPU無需幹預.(InfiniBand 與Intel Omni-Path Architecture - allcloud - 部落格園)
RDMA是一種新的直接記憶體通路技術,RDMA讓計算機可以直接存取其他計算機的記憶體,而不需要經過處理器的處理。RDMA将資料從一個系統快速移動到遠端系統的記憶體中,而不對作業系統造成任何影響。
在實作上,RDMA實際上是一種智能網卡與軟體架構充分優化的遠端記憶體直接高速通路技術,通過将RDMA協定固化于硬體(即網卡)上,以及支援Zero-copy和Kernel bypass這兩種途徑來達到其高性能的遠端直接資料存取的目标。 使用RDMA的優勢如下:
零拷貝(Zero-copy) - 應用程式能夠直接執行資料傳輸,在不涉及到網絡軟體棧的情況下。資料能夠被直接發送到緩沖區或者能夠直接從緩沖區裡接收,而不需要被複制到網絡層。
核心旁路(Kernel bypass) - 應用程式可以直接在使用者态執行資料傳輸,不需要在核心态與使用者态之間做上下文切換。
不需要CPU幹預(No CPU involvement) - 應用程式可以通路遠端主機記憶體而不消耗遠端主機中的任何CPU。遠端主機記憶體能夠被讀取而不需要遠端主機上的程序(或CPU)參與。遠端主機的CPU的緩存(cache)不會被通路的記憶體内容所填充。
消息基于事務(Message based transactions) - 資料被處理為離散消息而不是流,消除了應用程式将流切割為不同消息/事務的需求。
支援分散/聚合條目(Scatter/gather entries support) - RDMA原生态支援分散/聚合。也就是說,讀取多個記憶體緩沖區然後作為一個流發出去或者接收一個流然後寫入到多個記憶體緩沖區裡去。
在具體的遠端記憶體讀寫中,RDMA操作用于讀寫操作的遠端虛拟記憶體位址包含在RDMA消息中傳送,遠端應用程式要做的隻是在其本地網卡中注冊相應的記憶體緩沖區。遠端節點的CPU除在連接配接建立、注冊調用等之外,在整個RDMA資料傳輸過程中并不提供服務,是以沒有帶來任何負載。
3. RDMA 三種不同的技術實作
RDMA作為一種host-offload, host-bypass技術,使低延遲、高帶寬的直接的記憶體到記憶體的資料通信成為了可能。目前支援RDMA的網絡協定有:
1> InfiniBand(IB): 從一開始就支援RDMA的新一代網絡協定。由于這是一種新的網絡技術,是以需要支援該技術的網卡和交換機。
2> RDMA過融合以太網(RoCE): 即RDMA over Ethernet, 允許通過以太網執行RDMA的網絡協定。這允許在标準以太網基礎架構(交換機)上使用RDMA,隻不過網卡必須是支援RoCE的特殊的NIC。
3> 網際網路廣域RDMA協定(iWARP): 即RDMA over TCP, 允許通過TCP執行RDMA的網絡協定。這允許在标準以太網基礎架構(交換機)上使用RDMA,隻不過網卡要求是支援iWARP(如果使用CPU offload的話)的NIC。否則,所有iWARP棧都可以在軟體中實作,但是失去了大部分的RDMA性能優勢。
RoCE協定存在RoCEv1 (RoCE)和RoCEv2 (RRoCE)兩個版本,主要差別RoCEv1是基于以太網鍊路層(L2)實作的RDMA協定(交換機需要支援PFC等流控技術,在實體層保證可靠傳輸),而RoCEv2是以太網TCP/IP協定中UDP層(L3)實作。
在以太鍊路層之上用IB網絡層代替了TCP/IP網絡層,是以不支援IP路由功能。而v2使用了UDP+IP作為網絡層,使得資料包也可以被路由。RoCE可以被認為是IB的“低成本解決方案”,将IB的封包封裝成以太網包進行收發。由于RoCE v2可以使用以太網的交換裝置,是以現在在企業中應用也比較多,但是相同場景下相比IB性能要有一些損失。
3.1 InfiniBand技術簡介
InfiniBand 是一種基于 InfiniBand 架構的 RDMA 技術,它提供了一種基于通道的點對點消息隊列轉發模型,每個應用都可通過建立的虛拟通道直接擷取本應用的資料消息,無需其他作業系統及協定棧的介入。InfiniBand 架構的應用層采用了 RDMA 技術,可以提供遠端節點間 RDMA讀寫通路,完全解除安裝 CPU 工作負載;網絡傳輸采用了高帶寬的傳輸;鍊路層設定特定的重傳機制保證服務品質,不需要資料緩沖。
InfiniBand 必須運作在 InfiniBand 網絡環境下,必須使用 IB 交換機及 IB 網卡才可實作。
InfiniBand 技術具有以下特點:
• 應用層采用 RDMA 技術,降低了在主機側資料處理的延遲。
• 消息轉發控制由子網管理器完成,沒有類似以太網複雜的協定互動計算。
• 鍊路層通過重傳機制保證服務品質,不需要資料緩沖,無丢包。
• 具有低延遲、高帶寬、低處理開銷的特點。
3.2 iWARP 技術簡介
iWARP 是基于以太網和 TCP/IP 協定的 RDMA 技術,可以運作在标準的以太網基礎設施上。
iWARP并沒有指定實體層資訊,是以能夠工作在任何使用TCP/IP協定的網絡上層。iWARP允許很多傳輸類型來共享相同的實體連接配接,如網絡、I/O、檔案系統、塊存儲和處理器之間的消息通訊。
iWARP 由 MPA、DDP、RDMAP 三層子協定組成:
RDMAP層協定負責 RDMA 讀、寫操作和 RDMA 消息的轉換,并将 RDMA 消息轉發到DDP層。
DDP層協定負責将過長的 RDMA 消息分片分裝成DDP資料包繼續轉發到 MPA 層。
MPA層在 DDP 資料段的固定辨別位置增加轉發後向辨別、資料封包的長度以及 CRC 校驗資料等字段構成 MPA 資料段交由 TCP 傳輸。
iWARP 技術特點
iWARP 從以下幾個方面降低了主機側網絡負載:
• TCP/IP 處理流程從 CPU 解除安裝到 RDMA 網卡處理,降低了 CPU 負載。
• 消除記憶體拷貝:應用程式可以直接将資料傳輸到對端應用程式記憶體中,顯著降低 CPU 負載。
• 減少應用程式上、下文切換:應用程式可以繞過作業系統,直接在使用者空間對 RDMA 網卡下發指令,降低了開銷,顯著降低了應用程式上、下文切換造成的延遲。
由于 TCP 協定能夠提供流量控制和擁塞管理,是以 iWARP 不需要以太網支援無損傳輸,僅通過普通以太網交換機和 iWARP 網卡即可實作,是以能夠在廣域網上應用,具有較好的擴充性。
3.3 RoCE技術簡介
RoCE 技術支援在以太網上承載 IB 協定,實作 RDMA over Ethernet。RoCE 與 InfiniBand技術有相同的軟體應用層及傳輸控制層,僅網絡層及以太網鍊路層存在差異。
RoCE 協定分為兩個版本:
RoCE v1協定:基于以太網承載 RDMA,隻能部署于二層網絡,它的封包結構是在原有的 IB架構的封包上增加二層以太網的封包頭,通過 Ethertype 0x8915 辨別 RoCE 封包。
RoCE v2協定:基于 UDP/IP 協定承載 RDMA,可部署于三層網絡,它的封包結構是在原有的 IB 架構的封包上增加 UDP 頭、IP 頭和二層以太網封包頭,通過 UDP 目的端口号 4791 标 識RoCE 封包。RoCE v2 支援基于源端口号 hash,采用 ECMP 實作負載分擔,提高了網絡的使用率。
RoCE 使得基于以太網的資料傳輸能夠:
• 提高資料傳輸吞吐量。
• 減少網絡延時。
• 降低 CPU 負載。
RoCE 技術可通過普通以太網交換機實作,但伺服器需要支援 RoCE 網卡,網絡側需要支援無損以太網絡,這是由于 IB 的丢包處理機制中,任意一個封包的丢失都會造成大量的重傳,嚴重影響資料傳輸性能。
在 RoCE 網絡中,需要建構無損以太網用于保證網絡傳輸過程中不丢包,關于無損以太網技術參考文章:“FCoE全解系列”之增強型以太網技術。建構無損以太網需支援以下關鍵特性:
- (必選)PFC(Priority-based Flow Control,基于優先級的流量控制):逐跳提供基于優先級的流量控制,能夠實作在以太網鍊路上運作多種類型的流量而互不影響。
- (必選)ECN(Explicit Congestion Notification,顯示擁塞通知):裝置發生擁塞時,通過對封包 IP 頭中 ECN 域的辨別,由接收端向發送端發出降低發送速率的 CNP(Congestion Notification Packet,擁塞通知封包),實作端到端的擁塞管理,減緩擁塞擴散惡化。
- (建議)DCBX(Data Center Bridging Exchange Protocol,資料中心橋能力交換協定):使用 LLDP 自動協商 DCB 能力參數,包括 PFC 和 ETS 等。一般用在接入交換機連接配接伺服器的端口,與伺服器網卡進行能力協商。
- (可選)ETS(Enhanced Transmission Selection,增強傳輸選擇):将流量按服務類型分組,在提供不同流量的最小帶寬保證的同時提高鍊路使用率,保證重要流量的帶寬百分比。需要逐跳提供。
在 RoCE 環境中,PFC與ECN 需要同時使用,以在無丢包情況下帶寬得到保證。二者的功能對比如下:
雖然IB、以太網RoCE、以太網iWARP這三種RDMA技術使用統一的API,但它們有着不同的實體層和鍊路層。在以太網解決方案中,RoCE相對于iWARP來說有着明顯的優勢,這些優勢展現在延時、吞吐率和 CPU負載。RoCE被很多主流的方案所支援,并且被包含在Windows服務軟體中。
RoCE和InfiniBand,一個定義了如何在以太網上運作RDMA,而另一個則定義了如何在IB網絡中運作RDMA。RoCE期望能夠将IB的應用(主要是基于叢集的應用)遷移到融合以太網中,而在其他應用中,IB網絡仍将能夠提供比RoCE更高的帶寬和更低的時延。RoCE和IB協定的技術差別:
- 擁塞控制:RoCE所依賴的無丢包網絡基于以太網流控或PFC(Priority Flow Control)來實作。RoCEv2 則是定義了擁塞控制協定,使用ECN做标記和CNP幀來做确認。而IB則是使用基于信用的算法來保證HCA-HCA之間的無丢包通信。
- 時延:目前IB交換機普遍要比以太交換機擁有更低的時延,以太網交換機一般的Port-to-Port時延在230ns,相比IB交換機在同樣端口數的情況下100ns的時延,以太交換機還是要高出不少。
- 配置:配置一個DCB以太網絡要遠比配置一個IB網絡要複雜的多,同理,運維也要複雜的多。
RoCE和iWARP,一個是基于無連接配接協定UDP,一個是基于面向連接配接的協定(如TCP)。RoCEv1隻能局限在一個二層廣播域内,而RoCEv2和iWARP都能夠支援三層路由。相比RoCE,在大型組網的情況下,iWARP的大量TCP連接配接會占用大量的額記憶體資源,對系統規格要求更高。另外,RoCE支援多點傳播,而iWARP還沒有相關的标準定義。
4. 核心概念
4.1 Memory Registration(MR) | 記憶體注冊
RDMA 就是用來對記憶體進行資料傳輸。那麼怎樣才能對記憶體進行傳輸,很簡單,注冊。 因為RDMA硬體對用來做資料傳輸的記憶體是有特殊要求的。
在資料傳輸過程中,應用程式不能修改資料所在的記憶體。
作業系統不能對資料所在的記憶體進行page out操作 – 實體位址和虛拟位址的映射必須是固定不變的。
注意無論是DMA或者RDMA都要求實體位址連續,這是由DMA引擎所決定的。 那麼怎麼進行記憶體注冊呢?
建立兩個key (local和remote)指向需要操作的記憶體區域
注冊的keys是資料傳輸請求的一部分
注冊一個Memory Region之後,這個時候這個Memory Region也就有了它自己的屬性:
- context : RDMA操作上下文
- addr : MR被注冊的Buffer位址
- length : MR被注冊的Buffer長度
- lkey:MR被注冊的本地key
- rkey:MR被注冊的遠端key
對Memrory Registration:Memory Registration隻是RDMA中對記憶體保護的一種措施,隻有将要操作的記憶體注冊到RDMA Memory Region中,這塊操作的記憶體就交給RDMA 保護域來操作了。這個時候我們就可以對這塊記憶體進行操作,至于操作的起始位址、操作Buffer的長度,可以根據程式的具體需求進行操作。我們隻要保證接受方的Buffer 接受的長度大于等于發送的Buffer長度。
5.2 Queues | 隊列
RDMA一共支援三種隊列,發送隊列(SQ)和接收隊列(RQ),完成隊列(CQ)。其中,SQ和RQ通常成對建立,被稱為Queue Pairs(QP)。
RDMA是基于消息的傳輸協定,資料傳輸都是異步操作。 RDMA操作其實很簡單,可以了解為:
1> Host送出工作請求(WR)到工作隊列(WQ): 工作隊列包括發送隊列(SQ)和接收隊列(RQ)。工作隊列的每一個元素叫做WQE, 也就是WR。
2> Host從完成隊列(CQ)中擷取工作完成(WC): 完成隊列裡的每一個叫做CQE, 也就是WC。
3> 具有RDMA引擎的硬體(hardware)就是一個隊列元素處理器。 RDMA硬體不斷地從工作隊列(WQ)中去取工作請求(WR)來執行,執行完了就給完成隊列(CQ)中放置工作完成(WC)。從生産者-消費者的角度了解就是:
- Host生産WR, 把WR放到WQ中去
- RDMA硬體消費WR
- RDMA硬體生産WC, 把WC放到CQ中去
- Host消費WC
5. RDMA資料傳輸
5.1 RDMA Send | RDMA發送(/接收)操作 (Send/Recv)
跟TCP/IP的send/recv是類似的,不同的是RDMA是基于消息的資料傳輸協定(而不是基于位元組流的傳輸協定),所有資料包的組裝都在RDMA硬體上完成的,也就是說OSI模型中的下面4層(傳輸層,網絡層,資料鍊路層,實體層)都在RDMA硬體上完成。
5.2 RDMA Read | RDMA讀操作 (Pull)
RDMA讀操作本質上就是Pull操作, 把遠端系統記憶體裡的資料拉回到本地系統的記憶體裡。
5.3 RDMA Write | RDMA寫操作 (Push)
RDMA寫操作本質上就是Push操作,把本地系統記憶體裡的資料推送到遠端系統的記憶體裡。
5.4 RDMA Write with Immediate Data | 支援立即數的RDMA寫操作
支援立即數的RDMA寫操作本質上就是給遠端系統Push(推送)帶外(OOB)資料, 這跟TCP裡的帶外資料是類似的。
可選地,immediate 4位元組值可以與資料緩沖器一起發送。 該值作為接收通知的一部分呈現給接收者,并且不包含在資料緩沖器中。
6. RMDA 中專有名詞和對應縮寫
Channel-IO:RDMA 在本端應用和遠端應用間建立的一個消息通道;
Queue Pairs(QP):每個消息通道兩端是兩對QP;
Send Queue(SQ): 發送隊列,隊列中的内容為WQE;
Receive Queue(RQ):接收隊列,隊列中的内容為WQE;
Work Queue Element(WQE):工作隊列元素,WQE指向一塊用于存儲資料的Buffer;
Work Queue(WQ): 工作隊列,在發送過程中 WQ = SQ; 在接收過程中WQ = RQ;
Complete Queue(CQ): 完成隊列,CQ用于告訴使用者WQ上的消息已經被處理完成;
Work Request(WR):傳輸請求,WR描述了應用希望傳輸到Channel對端的消息内容,在WQ中轉化為 WQE 格式的資訊