RDMA(遠程直接內存訪問)原理架構圖文詳解+與傳統通信模式對比

閱讀指南: 本文較長,請細心閱讀,其中3.1節可以跳過不讀。對RDMA概念有所瞭解的,可以直接從3.2節開始閱讀。

1 傳統通信模式

使用TCP/IP協議的應用程序通常採用應用編程接口:UNIX BSD的套接字(socket),來實現網絡進程之間的通信。就目前而言,幾乎所有的應用程序都是採用socket。無論編寫客戶端程序還是服務端程序,系統都要爲每個TCP連接都要創建一個socket句柄。這樣導致了每次傳輸通信,都要經過OS和協議棧的管理,因此不管是Socket同步通信還是異步通信,都會存在CPU佔用過高的現象。

1.1傳統網絡通信過程

  1. 數據發送方需要講數據從用戶應用空間Buffer複製到內核空間的Socket Buffer中
  2. 然後Kernel空間中添加數據包頭,進行數據封裝。通過一系列多層網絡協議的數據包處理工作
  3. 數據被Push到NIC網卡中的Buffer進行網絡傳輸
  4. 消息接受方接受從遠程機器發送的數據包後,要將數據包從NIC buffer中複製數據到Socket Buffer
  5. 然後經過一些列的多層網絡協議進行數據包的解析工作
  6. 解析後的數據被複制到相應位置的用戶應用空間Buffer
  7. 這個時候再進行系統上下文切換,用戶應用程序才被調用

可以看出傳統的通信模式會導致重複的數據拷貝、上下文切換、CPU處理
在這裏插入圖片描述

2 RDMA基本原理與優勢

2.1 基本原理

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的優勢如下:

  • 零拷貝(Zero-copy): 應用程序能夠直接執行數據傳輸,在不涉及到網絡軟件棧的情況下。數據能夠被直接發送到緩衝區或者能夠直接從緩衝區裏接收,而不需要被複制到網絡層。
  • 內核旁路(Kernel bypass) - 應用程序可以直接在用戶態執行數據傳輸,不需要在內核態與用戶態之間做上下文切換。
  • 不需要CPU干預(No CPU involvement) - 應用程序可以訪問遠程主機內存而不消耗遠程主機中的任何CPU。遠程主機內存能夠被讀取而不需要遠程主機上的進程(或CPU)參與。遠程主機的CPU的緩存(cache)不會被訪問的內存內容所填充。
  • 消息基於事務(Message based transactions) - 數據被處理爲離散消息而不是流,消除了應用程序將流切割爲不同消息/事務的需求。
  • 支持分散/聚合條目(Scatter/gather entries support) - RDMA原生態支持分散/聚合。也就是說,讀取多個內存緩衝區然後作爲一個流發出去或者接收一個流然後寫入到多個內存緩衝區裏去。

3 RDMA原理詳解

3.1 支持RDMA的網絡協議

目前支持RDMA的網絡協議主要有三種

  • InfiniBand(IB)
  • iWARP(RDMA over TCP/IP)
  • RoCE(RDMA over Converged Ethernet)
    • RoCEv1和RoCEv2
      在這裏插入圖片描述

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服務軟件中
在這裏插入圖片描述

3.2 核心概念

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來完成的 。

3.2.1 基本概念

1、Memory Registration(MR) | 內存註冊
創建兩個key (local和remote)指向需要操作的內存區域,註冊的keys是數據傳輸請求的一部分。
同時,RDMA硬件對用來做數據傳輸的內存是有特殊要求的。

  • 在數據傳輸過程中,應用程序不能修改數據所在的 內存。
  • 操作系統不能對數據所在的內存進行page out操作 – 物理地址和虛擬地址的映射必須是固定不變的

2、Queues | 隊列
RDMA一共支持三種隊列,發送隊列(SQ)和接收隊列(RQ),完成隊列(CQ)。其中,SQ和RQ通常成對創建,被稱爲Queue Pairs(QP)。

RDMA是基於消息的傳輸協議,數據傳輸都是異步操作。 RDMA操作其實很簡單,可以理解爲:

  1. Host提交工作請求(WR)到工作隊列(WQ): 工作隊列包括髮送隊列(SQ)和接收隊列(CQ)。工作隊列的每一個元素叫做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
    在這裏插入圖片描述
    3、Send/Recv操作
    SEND/RECEIVE是雙邊操作,即需要通信雙方的參與,並且RECEIVE要先於SEND執行,這樣對方纔能發送數據,當然如果對方不需要發送數據,可以不執行RECEIVE操作,因此該過程和傳統通信相似,區別在於RDMA的零拷貝網絡技術和內核旁路,延遲低,多用於傳輸短的控制消息。

4、read/write操作

  • RDMA讀操作本質上就是Pull操作, 把遠程系統內存裏的數據拉回到本地系統的內存裏。

    • 接收方必須提供虛擬地址和目標存儲內存的remote_key。
    • 接收方需要初始和接受提醒通知,發送方是完全被動的,並且不會接受任何通知
  • RDMA寫操作本質上就是Push操作,把本地系統內存裏的數據推送到遠程系統的內存裏。

    • 發送方必須提供虛擬地址和目標讀取內存的remote_key。
    • 發送方需要初始和接受提醒通知,接受方是完全被動的,並且不會接受任何通知

3.2.2 RDMA工作流程

要使用RDMA首先要建立從RDMA到應用程序內存的數據路徑 ,可以通過RDMA專有的verbs interface接口來建立這些數據路徑,一旦數據路徑建立後,就可以直接訪問用戶空間buffer。

RDMA 的工作過程如下:

  1. 初始化context,註冊內存域
  2. 建立RDMA連接
  3. 通過SEND/RECEIVE操作,C/S交換包含RDMA memory region key的MSG_MR消息(一般是客戶端先發送)
  4. 通過WRITE/READ操作,進行數據傳輸(單邊操作)
  5. 發送MSG_DONE消息,關閉連接

更細節化的流程描述:

  • 消息服務建立在通信雙方本端和遠端應用之間創建的Channel-IO連接之上。當應用需要通信時,就會創建一條Channel連接,每條Channel的首尾端點是兩對Queue Pairs(QP)。
  • 每對QP由Send Queue(SQ)和Receive Queue(RQ)構成,這些隊列中管理着各種類型的消息。QP會被映射到應用的虛擬地址空間,使得應用直接通過它訪問RNIC網卡。
  • 除了QP描述的兩種基本隊列之外,RDMA還提供一種隊列Complete Queue(CQ),CQ用來知會用戶WQ上的消息已經被處理完。
  • RDMA提供了一套軟件傳輸接口,方便用戶創建傳輸請求Work Request(WR),WR中描述了應用希望傳輸到Channel對端的消息內容,WR通知QP中的某個隊列Work Queue(WQ)。
  • 在WQ中,用戶的WR被轉化爲Work Queue Element(WQE)的格式,等待RNIC的異步調度解析,並從WQE指向的Buffer中拿到真正的消息發送到Channel對端。

RDMA雙邊操作(send/receive)

對於雙邊操作爲例,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,這是一種複雜的消息傳輸模式,多用於傳輸短的控制消息。

RDAM單邊操作(read)

READ和WRITE是單邊操作,只需要本端明確信息的源和目的地址,遠端應用不必感知此次通信。對於操作發起端,數據的讀或寫都通過在RNIC與應用Buffer之間完成,再由遠端RNIC封裝成消息返回到本端。

對於單邊操作,以B對A的read操作爲例,數據的流程如下:

  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與傳統網絡傳輸的最大不同,只需提供直接訪問遠程的虛擬地址,無須遠程應用的參與其中,這種方式適用於批量數據傳輸


注:作者水平有限,如有錯誤歡迎指正

參考鏈接:
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