深入淺出全面解析 RDMA 技術

RDMA(RemoteDirect Memory Access) 技術全稱遠程直接內存訪問,就是爲了解決網絡傳輸中客戶端與服務器端數據處理的延遲而產生的。它將數據直接從一臺計算機的內存傳輸到另一臺計算機,無需雙方操作系統的介入。這允許高吞吐、低延遲的網絡通信,尤其適合在大規模並行計算機集羣中使用。RDMA 通過網絡把資料直接傳入計算機的內存中,將數據從一個系統快速移動到遠程系統內存中,而不對操作系統造成任何影響,這樣就不需要用到多少計算機的處理能力。它消除了數據包在用戶空間和內核空間複製移動和上下文切換的開銷,因而能解放內存帶寬和 CPU 週期用於改進應用系統性能。

本次詳解我們從三個方面詳細介紹 RDMA:RDMA 背景、RDMA 相關工作、RDMA 技術詳解。

一、背景介紹


1.1 傳統 TCP/IP 通信模式

傳統的 TCP/IP 網絡通信,數據需要通過用戶空間發送到遠程機器的用戶空間。數據發送方需要講數據從用戶應用空間 Buffer 複製到內核空間的 Socket Buffer 中。然後內核空間中添加數據包頭,進行數據封裝。通過一系列多層網絡協議的數據包處理工作,這些協議包括傳輸控制協議(TCP)、用戶數據報協議(UDP)、互聯網協議(IP)以及互聯網控制消息協議(ICMP)等。數據才被 Push 到 NIC 網卡中的 Buffer 進行網絡傳輸。消息接受方接受從遠程機器發送的數據包後,要將數據包從 NIC Buffer 中複製數據到 Socket Buffer。然後經過一些列的多層網絡協議進行數據包的解析工作。解析後的數據被複制到相應位置的用戶空間 Buffer。這個時候再進行系統上下文切換,用戶應用程序才被調用。以上就是傳統的 TCP/IP 協議層的工作。

然而如今隨着社會的發展,我們希望更快和更輕量級的網絡通信。

1.2 通信網絡定義

計算機網絡通信中最重要兩個衡量指標主要是指高帶寬和低延遲。通信延遲主要是指:處理延遲和網絡傳輸延遲。處理延遲開銷指的就是消息在發送和接收階段的處理時間。網絡傳輸延遲指的就是消息在發送和接收方的網絡傳輸時延。如果網絡通信狀況很好的情況下,網絡基本上可以 達到高帶寬和低延遲。

1.3  當今網絡現狀

當今隨着計算機網絡的發展。消息通信主要分爲兩類消息,一類是 Large Messages,在這類消息通信中,網絡傳輸延遲佔整個通信中的主導位置。還有一類消息是 Small Messages,在這類消息通信中,消息發送端和接受端的處理開銷佔整個通信的主導地位。然而在現實計算機網絡中的通信場景中,主要是以發送小消息爲主。所有說發送消息和接受消息的處理開銷佔整個通信的主導的地位。具體來說,處理開銷指的是 buffer 管理、在不同內存空間中消息複製、以及消息發送完成後的系統中斷。

1.4 傳統 TCP/IP 存在的問題

傳統的 TPC/IP 存在的問題主要是指 I/O bottleneck 瓶頸問題。在高速網絡條件下與網絡 I/O 相關的處理的高開銷限制了可以在機器之間發送的帶寬。這裏高額開銷是數據移動操作和複製操作。具體來講,主要是傳統的 TCP/IP 網絡通信是通過內核發送消息。Messaging passing through kernel 這種方式會導致很低的性能和很低的靈活性。其中性能低下的原因主要是由於網絡通信通過內核傳遞,這種通信方式存在的很高的數據移動和數據複製的開銷。並且現如今內存帶寬性相較如 CPU 帶寬和網絡帶寬有着很大的差異。其中很低的靈活性的原因主要是所有網絡通信協議通過內核傳遞,這種方式很難去支持新的網絡協議和新的消息通信協議以及發送和接收接口。

二、相關工作


高性能網絡通信歷史發展主要有以下四個方面:TCP Offloading Engine(TOE)、User-Net Networking(U-Net)、Virtual interface Architecture(VIA)、Remote Direct Memroy Access(RDMA)。U-Net 是第一個跨過內核網絡通信的模式之一。VIA 首次提出了標準化 user-level 的網絡通信模式,其次它組合了 U-Net 接口和遠程 DMA 設備。RDMA 就是現代化高性能網絡通信技術。

2.1 TCP Offloading Engine

在主機通過網絡進行通信的過程中,主機處理器需要耗費大量資源進行多層網絡協議的數據包處理工作,這些協議包括傳輸控制協議(TCP)、用戶數據報協議(UDP)、互聯網協議(IP)以及互聯網控制消息協議(ICMP)等。由於 CPU 需要進行繁重的封裝網絡數據包協議,爲了將佔用的這部分主機處理器資源解放出來專注於其他應用,人們發明了 TOE(TCP/IP Offloading Engine)技術,將上述主機處理器的工作轉移到網卡上。

這種技術需要特定網絡接口 - 網卡支持這種 Offloading 操作。這種特定網卡能夠支持封裝多層網絡協議的數據包,這個功能常見於高速以太網接口上,如吉比特以太網(GbE)或 10 吉比特以太網(10GbE)。

2.2 User-Net Networking(U-Net)

U-Net 的設計目標是將協議處理部分移動到用戶空間去處理。這種方式避免了用戶空間將數據移動和複製到內核空間的開銷。它的設計宗旨就是移動整個協議棧到用戶空間中去,並且從數據通信路徑中徹底刪除內核。這種設計帶來了高性能的提升和高靈活性的提升。

U-Net 的 virtual NI 爲每個進程提供了一種擁有網絡接口的錯覺,內核接口只涉及到連接步驟。傳統上的網絡,內核控制整個網絡通信,所有的通信都需要通過內核來傳遞。U-Net 應用程序可以通過 MUX 直接訪問網絡,應用程序通過 MUX 直接訪問內核,而不需要將數據移動和複製到內核空間中去。

三、RDMA 詳解


RDMA(Remote Direct Memory Access) 技術全稱遠程直接內存訪問,就是爲了解決網絡傳輸中服務器端數據處理的延遲而產生的。

RDMA 主要有以下三個特性:1.Low-Latency 2.Low CPU overhead 3. high bandwidth

3.1 RDMA 簡介

Remote:數據通過網絡與遠程機器間進行數據傳輸。

Direct:沒有內核的參與,有關發送傳輸的所有內容都卸載到網卡上。

Memory:在用戶空間虛擬內存與 RNIC 網卡直接進行數據傳輸不涉及到系統內核,沒有額外的數據移動和複製。

Access:send、receive、read、write、atomic 操作。

3.2 RDMA 基本概念

RDMA 有兩種基本操作。

RDMA 傳輸分爲可靠和不可靠的,並且可以連接和不連接的(數據報)。憑藉可靠的傳輸,NIC 使用確認來保證消息的按序傳送。不可靠的傳輸不提供這樣的保證。然而,像 InfiniBand 這樣的現代 RDMA 實現使用了一個無損鏈路層,它可以防止使用鏈路層流量控制的基於擁塞的損失 [1],以及使用鏈路層重傳的基於位錯誤的損失 [8]。因此,不可靠的傳輸很少會丟棄數據包。

目前的 RDMA 硬件提供一種數據報傳輸:不可靠的數據報(UD),並且不支持 memory verbs。

3.3 RDMA 三種不同的硬件實現

目前 RDMA 有三種不同的硬件實現。分別是 InfiniBand、iWarp(internet Wide Area RDMA Protocol)、RoCE(RDMA over Converged Ethernet)。

目前,大致有三類 RDMA 網絡,分別是 Infiniband、RoCE、iWARP。其中,Infiniband 是一種專爲 RDMA 設計的網絡,從硬件級別保證可靠傳輸 , 而 RoCE 和 iWARP 都是基於以太網的 RDMA 技術,支持相應的 verbs 接口,如圖 1 所示。從圖中不難發現,RoCE 協議存在 RoCEv1 和 RoCEv2 兩個版本,主要區別 RoCEv1 是基於以太網鏈路層實現的 RDMA 協議 (交換機需要支持 PFC 等流控技術,在物理層保證可靠傳輸),而 RoCEv2 是以太網 TCP/IP 協議中 UDP 層實現。從性能上,很明顯 Infiniband 網絡最好,但網卡和交換機是價格也很高,然而 RoCEv2 和 iWARP 僅需使用特殊的網卡就可以了,價格也相對便宜很多。

  1. Infiniband,支持 RDMA 的新一代網絡協議。由於這是一種新的網絡技術,因此需要支持該技術的 NIC 和交換機。

  2. RoCE,一個允許在以太網上執行 RDMA 的網絡協議。其較低的網絡標頭是以太網標頭,其較高的網絡標頭(包括數據)是 InfiniBand 標頭。這支持在標準以太網基礎設施(交換機)上使用 RDMA。只有網卡應該是特殊的,支持 RoCE。

  3. iWARP,一個允許在 TCP 上執行 RDMA 的網絡協議。IB 和 RoCE 中存在的功能在 iWARP 中不受支持。這支持在標準以太網基礎設施(交換機)上使用 RDMA。只有網卡應該是特殊的,並且支持 iWARP(如果使用 CPU 卸載),否則所有 iWARP 堆棧都可以在 SW 中實現,並且喪失了大部分 RDMA 性能優勢。

3.4 RDMA 技術

傳統上的 RDMA 技術設計內核封裝多層網絡協議並且涉及內核數據傳輸。RDMA 通過專有的 RDMA 網卡 RNIC,繞過內核直接從用戶空間訪問 RDMA enabled NIC 網卡。RDMA 提供一個專有的 Verbs Interface 而不是傳統的 TCP/IP Socket Interface。要使用 RDMA 首先要建立從 RDMA 到應用程序內存的數據路徑 ,可以通過 RDMA 專有的 Verbs Interface 接口來建立這些數據路徑,一旦數據路徑建立後,就可以直接訪問用戶空間 buffer。

3.5 RDMA 整體系統架構圖

上訴介紹的是 RDMA 整體框架架構圖。從圖中可以看出,RDMA 在應用程序用戶空間,提供了一系列 verbs interface 接口操作 RDMA 硬件。RDMA 繞過內核直接從用戶空間訪問 RDMA 網卡 (RNIC)。RNIC 網卡中包括 Cached Page Table Entry,頁表就是用來將虛擬頁面映射到相應的物理頁面。

3.6 RDMA 技術詳解

RDMA 的工作過程如下:

  1. 當一個應用執行 RDMA 讀或寫請求時,不執行任何數據複製. 在不需要任何內核內存參與的條件下,RDMA 請求從運行在用戶空間中的應用中發送到本地 NIC(網卡)。

  2. NIC 讀取緩衝的內容,並通過網絡傳送到遠程 NIC。

  3. 在網絡上傳輸的 RDMA 信息包含目標虛擬地址、內存鑰匙和數據本身. 請求既可以完全在用戶空間中處理 (通過輪詢用戶級完成排列) ,又或者在應用一直睡眠到請求完成時的情況下通過系統中斷處理. RDMA 操作使應用可以從一個遠程應用的內存中讀數據或向這個內存寫數據。

  4. 目標 NIC 確認內存鑰匙,直接將數據寫人應用緩存中. 用於操作的遠程虛擬內存地址包含在 RDMA 信息中。

3.7 RDMA 操作細節

RDMA 提供了基於消息隊列的點對點通信,每個應用都可以直接獲取自己的消息,無需操作系統和協議棧的介入。

消息服務建立在通信雙方本端和遠端應用之間創建的 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 對端。

3.7.1 RDAM 單邊操作 (RDMA READ)

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

對於單邊操作,以存儲網絡環境下的存儲爲例,數據的流程如下:

  1.   首先 A、B 建立連接,QP 已經創建並且初始化。

  2.   數據被存檔在 B 的 buffer 地址 VB,注意 VB 應該提前註冊到 B 的 RNIC (並且它是一個 Memory Region) ,並拿到返回的 local key,相當於 RDMA 操作這塊 buffer 的權限。

  3.   B 把數據地址 VB,key 封裝到專用的報文傳送到 A,這相當於 B 把數據 buffer 的操作權交給了 A。同時 B 在它的 WQ 中註冊進一個 WR,以用於接收數據傳輸的 A 返回的狀態。

  4.   A 在收到 B 的送過來的數據 VB 和 R_key 後,RNIC 會把它們連同自身存儲地址 VA 到封裝 RDMA READ 請求,將這個消息請求發送給 B,這個過程 A、B 兩端不需要任何軟件參與,就可以將 B 的數據存儲到 A 的 VA 虛擬地址。

  5.   A 在存儲完成後,會向 B 返回整個數據傳輸的狀態信息。

單邊操作傳輸方式是 RDMA 與傳統網絡傳輸的最大不同,只需提供直接訪問遠程的虛擬地址,無須遠程應用的參與其中,這種方式適用於批量數據傳輸。

3.7.2 RDMA 單邊操作 (RDMA WRITE)

對於單邊操作,以存儲網絡環境下的存儲爲例,數據的流程如下:

  1.   首先 A、B 建立連接,QP 已經創建並且初始化。

  2.   數據 remote 目標存儲 buffer 地址 VB,注意 VB 應該提前註冊到 B 的 RNIC(並且它是一個 Memory Region),並拿到返回的 local key,相當於 RDMA 操作這塊 buffer 的權限。

  3.   B 把數據地址 VB,key 封裝到專用的報文傳送到 A,這相當於 B 把數據 buffer 的操作權交給了 A。同時 B 在它的 WQ 中註冊進一個 WR,以用於接收數據傳輸的 A 返回的狀態。

  4.   A 在收到 B 的送過來的數據 VB 和 R_key 後,RNIC 會把它們連同自身發送地址 VA 到封裝 RDMA WRITE 請求,這個過程 A、B 兩端不需要任何軟件參與,就可以將 A 的數據發送到 B 的 VB 虛擬地址。

  5.   A 在發送數據完成後,會向 B 返回整個數據傳輸的狀態信息。

單邊操作傳輸方式是 RDMA 與傳統網絡傳輸的最大不同,只需提供直接訪問遠程的虛擬地址,無須遠程應用的參與其中,這種方式適用於批量數據傳輸。

3.7.3 RDMA 雙邊操作 (RDMA SEND/RECEIVE)

RDMA 中 SEND/RECEIVE 是雙邊操作,即必須要遠端的應用感知參與才能完成收發。在實際中,SEND/RECEIVE 多用於連接控制類報文,而數據報文多是通過 READ/WRITE 來完成的。

對於雙邊操作爲例,主機 A 向主機 B(下面簡稱 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,實際上對於 RDMA,這是一種複雜的消息傳輸模式,多用於傳輸短的控制消息。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/cY106ijLB-jWhvK8s9frqQ