閱讀指南: 本文較長,請細心閱讀,其中3.1節可以跳過不讀。對RDMA概念有所瞭解的,可以直接從3.2節開始閱讀。
使用TCP/IP協議的應用程序通常採用應用編程接口:UNIX BSD的套接字(socket),來實現網絡進程之間的通信。就目前而言,幾乎所有的應用程序都是採用socket。無論編寫客戶端程序還是服務端程序,系統都要爲每個TCP連接都要創建一個socket句柄。這樣導致了每次傳輸通信,都要經過OS和協議棧的管理,因此不管是Socket同步通信還是異步通信,都會存在CPU佔用過高的現象。
可以看出傳統的通信模式會導致重複的數據拷貝、上下文切換、CPU處理
RDMA是一種新的直接內存訪問技術,RDMA讓計算機可以直接存取其他計算機的內存,而不需要經過處理器的處理。RDMA將數據從一個系統快速移動到遠程系統的內存中,而不對操作系統造成任何影響。
RDMA:
Remote:數據通過網絡與遠程機器間進行數據傳輸
Direct:沒有內核的參與,有關發送傳輸的所有內容都卸載到網卡上
Memory:在用戶空間虛擬內存與RNIC網卡直接進行數據傳輸不涉及到系統內核,沒有額外的數據移動和複製
Access:send、receive、read、write、atomic操作
傳統的TCP/IP通信,發送和接收數據的過程中,都是在源端應用層數據從上向下逐層拷貝封裝,目的端從下向上拷貝和解封裝,所以比較慢,而且需要CPU參與的次數很多。RDMA通信過程中,發送和接收,讀/寫操作中,都是RNIC直接和參與數據傳輸的已經註冊過的內存區域直接進行數據傳輸,速度快,不需要CPU參與,RDMA網卡接替了CPU的工作,節省下來的資源可以進行其它運算和服務。
更直觀的對比圖圖:
可以看到傳統的方法需要經過用戶態->內核->硬件。
而RDMA直接是隻經過用戶態,數據的存取是通過RDMA硬件直接操作內存的。
使用RDMA的優勢如下:
目前支持RDMA的網絡協議主要有三種
InfiniBand 通過以下技術保證網絡轉發的低時延( 亞微秒級 ), 採用Cut-Through轉發模式,減少轉發時延;基於Credit的流控機制,保證無丟包;硬件卸載;Buffer儘可能小,減少報文被緩衝的時延 。
iWARP(RDMA over TCP/IP) 利用成熟的IP網絡; 繼承RDMA的優點;TCP/IP硬件實現成本高,但如果採用傳統IP網絡的丟包策略對性能影響大 。
**RDMA over Converged Ethernet (RoCE)**是一種網絡協議,允許應用通過以太網實現遠程內存訪問。目前RoCE有兩個協議版本。
RoCE v1是一種鏈路層協議,允許在同一個廣播域下的任意兩臺主機直接訪問。
RoCE v2是一種Internet層協議,即可以實現路由功能。雖然RoCE協議這些好處都是基於融合以太網的特性,但是RoCE協議也可以使用在傳統以太網網絡或者非融合以太網絡中。
RoCE和InfiniBand,一個定義瞭如何在以太網上運行RDMA,而另一個則定義瞭如何在IB網絡(主要是基於集羣的應用)中運行RDMA
RoCE和iWARP,一個是基於無連接協議UDP,一個是基於面向連接的協議(如TCP)。
目前,雖然IB、以太網RoCE、以太網iWARP這三種RDMA技術使用統一的API,但它們有着不同的物理層和鏈路層。在以太網解決方案中,RoCE相對於iWARP來說有着明顯的優勢,這些優勢體現在延時、吞吐率和 CPU負載。RoCE被很多主流的方案所支持,並且被包含在Windows服務軟件中
RDMA是基於消息的數據傳輸協議(而不是基於字節流的傳輸協議),所有數據包的組裝都在RDMA硬件上完成的,也就是說OSI模型中的下面4層(傳輸層,網絡層,數據鏈路層,物理層)都在RDMA硬件上完成。
一個名爲OpenFabric Alliance的組織)提供了RDMA傳輸的一系列Verbs API,開發了OFED(Open Fabric Enterprise Distribution)協議棧,支持多種RDMA傳輸層協議。
RDMA應用和RNIC(RDMA-aware Network Interface Controller)之間的傳輸接口層(Software Transport Interface)被稱爲Verbs或RDMA API
RDMA API (Verbs)主要有兩種Verbs:
內存Verbs(Memory Verbs),也叫One-SidedRDMA。包括RDMA Reads, RDMA Writes, RDMA Atomic。這種模式下的RDMA訪問完全不需要遠端機的任何確認。
消息Verbs(Messaging Verbs),也叫Two-SidedRDMA。包括RDMA Send, RDMA Receive。這種模式下的RDMA訪問需要遠端機CPU的參與。
在實際中, SEND /RECEIVE多用於連接控制類報文,而數據報文多是通過READ/WRITE來完成的 。
1、Memory Registration(MR) | 內存註冊
創建兩個key (local和remote)指向需要操作的內存區域,註冊的keys是數據傳輸請求的一部分。
同時,RDMA硬件對用來做數據傳輸的內存是有特殊要求的。
2、Queues | 隊列
RDMA一共支持三種隊列,發送隊列(SQ)和接收隊列(RQ),完成隊列(CQ)。其中,SQ和RQ通常成對創建,被稱爲Queue Pairs(QP)。
RDMA是基於消息的傳輸協議,數據傳輸都是異步操作。 RDMA操作其實很簡單,可以理解爲:
4、read/write操作
RDMA讀操作本質上就是Pull操作, 把遠程系統內存裏的數據拉回到本地系統的內存裏。
RDMA寫操作本質上就是Push操作,把本地系統內存裏的數據推送到遠程系統的內存裏。
要使用RDMA首先要建立從RDMA到應用程序內存的數據路徑 ,可以通過RDMA專有的verbs interface接口來建立這些數據路徑,一旦數據路徑建立後,就可以直接訪問用戶空間buffer。
RDMA 的工作過程如下:
更細節化的流程描述:
對於雙邊操作爲例,A向B發送數據的流程如下:
首先,A和B都要創建並初始化好各自的QP,CQ
A和B分別向自己的WQ中註冊WQE,對於A,WQ=SQ,WQE描述指向一個等到被髮送的數據;對於B,WQ=RQ,WQE描述指向一塊用於存儲數據的buffer。
A的RNIC異步調度輪到A的WQE,解析到這是一個SEND消息,從buffer中直接向B發出數據。數據流到達B的RNIC後,B的WQE被消耗,並把數據直接存儲到WQE指向的存儲位置。
AB通信完成後,A的CQ中會產生一個完成消息CQE表示發送完成。與此同時,B的CQ中也會產生一個完成消息表示接收完成。每個WQ中WQE的處理完成都會產生一個CQE。
雙邊操作與傳統網絡的底層buffer pool類似,收發雙方的參與過程並無差別,區別在零拷貝、kernel bypass,實際上傳統網絡中一些高級的網絡SOC已經實現類似功能。對於RDMA,這是一種複雜的消息傳輸模式,多用於傳輸短的控制消息。
READ和WRITE是單邊操作,只需要本端明確信息的源和目的地址,遠端應用不必感知此次通信。對於操作發起端,數據的讀或寫都通過在RNIC與應用Buffer之間完成,再由遠端RNIC封裝成消息返回到本端。
對於單邊操作,以B對A的read操作爲例,數據的流程如下:
單邊操作傳輸方式是RDMA與傳統網絡傳輸的最大不同,只需提供直接訪問遠程的虛擬地址,無須遠程應用的參與其中,這種方式適用於批量數據傳輸。
注:作者水平有限,如有錯誤歡迎指正
參考鏈接:
http://www.noobyard.com/article/p-gcptbzeb-ox.html
https://blog.csdn.net/qq_21125183/article/details/80563463
https://www.cnblogs.com/vlhn/p/7909893.html
https://blog.csdn.net/zjttlance/article/details/80318763
https://www.sohu.com/a/229080366_632967
https://blog.csdn.net/upupday19/article/details/79377984