RDMA的原理、傳輸與Verbs
RDMA最早專屬於infiniband架構。在網絡融合的大趨勢下出現的RoCE,使高速、超低延時、極低cpu使用率的RDMA得以部署在目前使用最廣泛的以太網上。
對比傳統DMA的內部總線IO,RDMA通過網絡在兩個端點的應用軟件之間實現buffer的直接傳遞;而對比傳統的網絡傳輸,RDMA又無需操作系統和協議棧的介入。RDMA可以輕易實現端點間的超低延時、超高吞吐量傳輸,而且基本不需要CPU、OS的資源參與,在高速網絡環境下,不必再為網絡數據的處理和搬移耗費過多資源。一言概之,RDMA三大特性:CPU offload 、kernel bypass、zero-copy。
圖 RDMA VS Traditional network
原理
傳統的網絡架構以“網絡為中心”,網絡公用的軟件部分被實現到OS的協議棧,所以OS在所有應用的網絡請求時都必須參與其中,並且socket、skbuff、ring buffer的轉換都伴隨着數據報文的拷貝,容易產生性能瓶頸。
圖 網絡環境下的CPU負載消耗
在Infiniband/RDMA的模型中,核心“以服務為中心”,圍繞一個基本問題:如何實現應用之間最簡單、高效和直接的通信。RDMA提供了基於消息隊列的點對點通信,每個應用都可以直接獲取自己的消息,無需OS和協議棧的介入。
消息服務建立在通信雙方本端和遠端應用之間創建的channel-IO連接之上。當應用需要通信時,就會創建一條Channel連接,每條Channel的首尾端點是兩對Queue Pairs(QP),每對QP由Send Queue(SQ)和Receive Queue(RQ)構成,這些隊列中管理着各種類型的消息。QP會被映射到應用的虛擬地址空間,使得應用直接通過它訪問RNIC。除了QP描述的兩種基本隊列之外,RDMA還提供一種隊列-Complete Queue(CQ),CQ用來知會用戶WQ上的消息已經被處理完。
RDMA提供了一套software transport interface,方便用戶創建傳輸請求-Work Request(WR),WR中描述了應用希望傳輸到Channel對端的消息內容。WR通知給QP中的某個隊列-Work Queue(WQ)。在WQ中,用戶的WR被轉化為Work Queue Ellement(WQE)的格式,等待RNIC的異步調度解析,並從WQE指向的buffer中拿到真正的消息發送到Channel對端。
傳輸
圖 RDMA 的send/receive和read/write傳輸
RDMA共有三種底層數據傳輸模式。SEND/RECEIVE是雙邊操作,即必須要遠端的應用感知參與才能完成收發。READ和WRITE是單邊操作,只需要本端明確信息的源和目的地址,遠端應用不必感知此次通信,數據的讀或存都通過遠端的DMA在RNIC與應用buffer之間完成,再由遠端RNIC封裝成消息返回到本端。在實際中,SEND/RECEIVE多用於連接控制類報文,而數據報文多是通過READ/WRITE來完成的。
對於雙邊操作為例,A向B發送數據的流程如下:
1. 首先,A和B都要創建並初始化好各自的QP,CQ
2. A和B分別向自己的WQ中注冊WQE,對於A,WQ=SQ,WQE描述指向一個等到被發送的數據;對於B,WQ=RQ,WQE描述指向一塊用於存儲數據的buffer。
3. A的RNIC異步調度輪到A的WQE,解析到這是一個SEND消息,從buffer中直接向B發出數據。數據流到達B的RNIC后,B的WQE被消耗,並把數據直接存儲到WQE指向的存儲位置。
4. AB通信完成后,A的CQ中會產生一個完成消息CQE表示發送完成。與此同時,B的CQ中也會產生一個完成消息表示接收完成。每個WQ中WQE的處理完成都會產生一個CQE。
雙邊操作與傳統網絡的底層buffer pool類似,收發雙方的參與過程並無差別,區別在零拷貝、kernel bypass,實際上傳統網絡中一些高級的網絡SOC已經實現類似功能。對於RDMA,這是一種復雜的消息傳輸模式,多用於傳輸短的控制消息。
對於單邊操作,以存儲網絡環境下的存儲為例(A作為文件系統,B作為存儲介質):
1. 首先A、B建立連接,QP已經創建並且初始化。
2. 數據被存檔在A的buffer地址VA,注意VA應該提前注冊到A的RNIC,並拿到返回的local key,相當於RDMA操作這塊buffer的權限。
3. A把數據地址VA,key封裝到專用的報文傳送到B,這相當於A把數據buffer的操作權交給了B。同時A在它的WQ中注冊進一個WR,以用於接收數據傳輸的B返回的狀態。
4. B在收到A的送過來的數據VA和R_key后,RNIC會把它們連同存儲地址VB到封裝RDMA READ,這個過程A、B兩端不需要任何軟件參與,就可以將A的數據存儲到B的VB虛擬地址。
5. B在存儲完成后,會向A返回整個數據傳輸的狀態信息。
單邊操作傳輸方式是RDMA與傳統網絡傳輸的最大不同,提供直接訪問遠程的虛擬地址,無須遠程應用的參與,這種方式適用於批量數據傳輸。
Verbs
RDMAC(RDMA Consortium)和IBTA(InfiniBand Trade Association)主導了RDMA,RDMAC是IETF的一個補充,它主要定義的是iWRAP和iSER,IBTA是infiniband的全部標准制定者,並補充了RoCE v1 v2的標准化。應用和RNIC之間的傳輸接口層(software transport interface)被稱為Verbs。IBTA解釋了RDMA傳輸過程中應具備的特性行為,而並沒有規定Verbs的具體接口和數據結構原型。這部分工作由另一個組織OFA(Open Fabric Alliance)來完成,OFA提供了RDMA傳輸的一系列Verbs API。OFA開發出了OFED(Open Fabric Enterprise Distribution)協議棧,支持多種RDMA傳輸層協議。
OFED中除了提供向下與RNIC基本的隊列消息服務,向上還提供了ULP(Upper Layer Protocols),通過ULPs,上層應用不需要直接到Verbs API對接,而是借助於ULP與應用對接,常見的應用不需要做修改,就可以跑在RDMA傳輸層上。
參考鏈接
1. vSphere 6.5 支援 RDMA (RoCE v1 及 RoCE v2)