[SPDK/NVMe存儲技術分析]008 - RDMA概述


毫無疑問地,用來取代iSCSI/iSER(iSCSI Extensions for RDMA)技術的NVMe over Fabrics着實讓RDMA又火了一把。在介紹NVMe over Fabrics之前,先科普一下RDMA。

1. DMA和RDMA的概念

1.1 什么是DMA?

Direct Memory Access(DMA) is a capability provided that allows data to be sent directly from an attached device to the memory on the computer's motherboard.
DMA(直接內存訪問)是一種能力,允許在計算機主板上的設備直接把數據發送到內存中去,數據搬運不需要CPU的參與。

1.2 什么是RDMA?

RDMA is a concept whereby two or more computers communicate via Direct Memory Access directly from the main memory of one system to the main memory of another.
RDMA是一種概念,在兩個或者多個計算機進行通訊的時候使用DMA, 從一個主機的內存直接訪問另一個主機的內存。

RDMA is a host-offload, host-bypass technology that allows an application (including storage) to make data transfers directly to/from another application's memory space. The RDMA-capable Ethernet NICs (RNICs) -- not the host -- manage reliable connections between source and destination. Applications communicate with the RDMA NIC using dedicated Queue Pairs (QPs) and Completion Queues (CQs):

  • Each application can have many QPs and CQs
  • Each QP has a Send Queue (SQ) and Receive Queue (RQ)
  • Each CQ can be associated with multiple SQs or RQs

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

  • 每一個應用程序可以有很多QP和CQ
  • 每一個QP包括一個SQ和RQ
  • 每一個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的網絡協議有:

  • InfiniBand(IB): 從一開始就支持RDMA的新一代網絡協議。由於這是一種新的網絡技術,因此需要支持該技術的網卡和交換機。
  • RDMA過融合以太網(RoCE): 即RDMA over Ethernet, 允許通過以太網執行RDMA的網絡協議。這允許在標准以太網基礎架構(交換機)上使用RDMA,只不過網卡必須是支持RoCE的特殊的NIC。
  • 互聯網廣域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. 基礎術語

4.1 什么是Fabric?

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

所謂Fabric,就是支持RDMA的局域網(LAN)。

4.2 什么是CA?

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

  • What is OFA?

5. 核心概念

5.1 Memory Registration(MR) | 內存注冊

用RDMA的前提就是"搞內存"。 怎么“搞”? 很簡單,注冊。 因為RDMA硬件對用來做數據傳輸的內存是有特殊要求的。

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

注意無論是DMA或者RDMA都要求物理地址連續,這是由DMA引擎所決定的。 那么怎么進行內存注冊呢?

  • 創建兩個key (local和remote)指向需要操作的內存區域
  • 注冊的keys是數據傳輸請求的一部分

5.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

 

注意: 在NVMe over PCIe的實現中, SPDK把SQ(Submission Queue 提交隊列)和CQ(Completion Queue完成)隊列合稱為qpair (隊列對)。 我個人認為這一提法是欠妥的,因為QP(隊列對)早已是SQ(Send Queue發送隊列)和RQ(Receive Queue 接收隊列)的官方簡稱。

 

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里的帶外數據是類似的。

 

A man can't ride your back unless it is bent. | 你的腰不彎,別人就不能騎在你的背上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM