1. 程式人生 > 實用技巧 >RDMA技術詳解(一):RDMA概述

RDMA技術詳解(一):RDMA概述

轉載於:https://zhuanlan.zhihu.com/p/55142557

1. DMA和RDMA概念

1.1 DMA

DMA(直接記憶體訪問)是一種能力,允許在計算機主機板上的裝置直接把資料傳送到記憶體中去,資料搬運不需要CPU的參與。

傳統記憶體訪問需要通過CPU進行資料copy來移動資料,通過CPU將記憶體中的Buffer1移動到Buffer2中。DMA模式:可以同DMA Engine之間通過硬體將資料從Buffer1移動到Buffer2,而不需要作業系統CPU的參與,大大降低了CPU Copy的開銷。

1.2 RDMA

RDMA是一種概念,在兩個或者多個計算機進行通訊的時候使用DMA, 從一個主機的記憶體直接訪問另一個主機的記憶體。

RDMA是一種host-offload, host-bypass技術,允許應用程式(包括儲存)在它們的記憶體空間之間直接做資料傳輸。具有RDMA引擎的乙太網卡(RNIC)--而不是host--負責管理源和目標之間的可靠連線。使用RNIC的應用程式之間使用專注的QP和CQ進行通訊:

  1. 每一個應用程式可以有很多QP和CQ
  2. 每一個QP包括一個SQ和RQ
  3. 每一個CQ可以跟多個SQ或者RQ相關聯

2. RDMA的優勢

傳統的TCP/IP技術在資料包處理過程中,要經過作業系統及其他軟體層,需要佔用大量的伺服器資源和記憶體匯流排頻寬,資料在系統記憶體、處理器快取和網路控制器快取之間來回進行復制移動,給伺服器的CPU和記憶體造成了沉重負擔。尤其是網路頻寬、處理器速度與記憶體頻寬三者的嚴重"不匹配性",更加劇了網路延遲效應。

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效能優勢。

在三種主流的RDMA技術中,可以劃分為兩大陣營。一個是IB技術, 另一個是支援RDMA的乙太網技術(RoCE和iWARP)。其中, IBTA力挺的技術自然是IB和RoCE, Mellanox公司(一個以色列人搞的小公司)是這方面的急先鋒。而iWARP則是IEEE/IETF力挺的技術,主要是Chelsio公司在推進。RoCE和iWARP的爭論,請參考Mellanox和Chelsio這兩家公司釋出的白皮書。

在儲存領域,支援RDMA的技術早就存在,比如SRP(SCSI RDMA Protocol)和iSER(iSCSI Extensions for RDMA)。 如今興起的NVMe over Fabrics如果使用的不是FC網路的話,本質上就是NVMe over RDMA。 換句話說,NVMe over InfiniBand, NVMe over RoCE和NVMe over iWARP都是NVMe over RDMA。

4. RDMA基本術語

4.1 Fabric

A local-area RDMA network is usually referred to as a fabric.

所謂Fabric,就是支援RDMA的區域網(LAN)。

4.2 CA(Channel Adapter)

A channel adapter is the hardware component that connects a system to the fabric.

CA是Channel Adapter(通道介面卡)的縮寫。那麼,CA就是將系統連線到Fabric的硬體元件。 在IBTA中,一個CA就是IB子網中的一個終端結點(End Node)。分為兩種型別,一種是HCA, 另一種叫做TCA, 它們合稱為xCA。其中, HCA(Host Channel Adapter)是支援"verbs"介面的CA, TCA(Target Channel Adapter)可以理解為"weak CA", 不需要像HCA一樣支援很多功能。 而在IEEE/IETF中,CA的概念被實體化為RNIC(RDMA Network Interface Card), iWARP就把一個CA稱之為一個RNIC。

簡言之,在IBTA陣營中,CA即HCA或TCA; 而在iWARP陣營中,CA就是RNIC。 總之,無論是HCA、 TCA還是RNIC,它們都是CA, 它們的基本功能本質上都是生產或消費資料包(packet)

4.3 Verbs

在RDMA的持續演進中,有一個組織叫做OpenFabric Alliance所做的貢獻可謂功不可沒。 Verbs這個詞不好翻譯,大致可以理解為訪問RDMA硬體的“一組標準動作”。 每一個Verb可以理解為一個Function。

5. 核心概念

5.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)。從生產者-消費者的角度理解就是:
  4. Host生產WR, 把WR放到WQ中去
  5. RDMA硬體消費WR
  6. RDMA硬體生產WC, 把WC放到CQ中去
  7. Host消費WC

6. RDMA資料傳輸

6.1 RDMA Send | RDMA傳送(/接收)操作 (Send/Recv)

跟TCP/IP的send/recv是類似的,不同的是RDMA是基於訊息的資料傳輸協議(而不是基於位元組流的傳輸協議),所有資料包的組裝都在RDMA硬體上完成的,也就是說OSI模型中的下面4層(傳輸層,網路層,資料鏈路層,物理層)都在RDMA硬體上完成。

6.2 RDMA Read | RDMA讀操作 (Pull)

RDMA讀操作本質上就是Pull操作, 把遠端系統記憶體裡的資料拉回到本地系統的記憶體裡。

6.3 RDMA Write | RDMA寫操作 (Push)

RDMA寫操作本質上就是Push操作,把本地系統記憶體裡的資料推送到遠端系統的記憶體裡。

6.4 RDMA Write with Immediate Data | 支援立即數的RDMA寫操作

支援立即數的RDMA寫操作本質上就是給遠端系統Push(推送)帶外(OOB)資料, 這跟TCP裡的帶外資料是類似的。

可選地,immediate 4位元組值可以與資料緩衝器一起傳送。 該值作為接收通知的一部分呈現給接收者,並且不包含在資料緩衝器中。

編輯於 2019-01-18