RDMA 知识概述
目錄
DMA、RDMA 基礎概念
傳統的網絡通信方式
RDMA?詳解
RDMA 基本操作
RDMA?三種不同的硬件實現
RDMA?工作流程
RDMA?具體操作
DMA、RDMA 基礎概念
DMA 傳輸將數據從一個地址空間復制到另外一個地址空間。當 CPU 初始化這個傳輸動作,傳輸動作本身是由 DMA 控制器 來實行和完成。典型的例子就是移動一個外部內存的區塊到芯片內部更快的內存區。像是這樣的操作并沒有影響 CPU 的工作,反而可以去處理其他的工作。DMA 傳輸對于高性能嵌入式系統和網絡是很重要的。
RDMA(Remote?Direct Memory Access)技術全稱遠程直接內存訪問,就是為了解決網絡傳輸中客戶端與服務器端數據處理延遲而產生的。它將數據直接從一臺計算機的內存傳輸到另一臺計算機,無需操作系統?的介入。這允許高吞吐、低延遲的網絡通信,尤其適合應用在大規模并行計算機集群中。RDMA?通過網絡把數據直接傳入計算機的內存中,將數據從一個系統快速移動到遠程系統內存中,而不對操作系統造成任何影響,這樣就不需要占用很多計算機的處理能力。它消除了數據包在用戶空間和內核空間復制移動和上下文切換的開銷,因而能解放內存帶寬和?CPU?周期用于改進應用系統性能。
?
?
傳統的網絡通信方式
傳統的?TCP/IP?網絡通信,數據需要通過用戶空間發送到遠程機器的用戶空間。數據發送方需要將數據從用戶空間?buffer?復制到內核空間的?socket?buffer?中。然后內核空間中添加數據包頭,進行數據封裝。通過一系列多層網絡協議的數據包處理工作,這些協議包括傳輸控制協議(TCP)、用戶數據報協議(UDP)、互聯網協議(IP)等。數據才被?push?到?NIC?網卡中的?buffer?進行網絡傳輸。消息接收方接收從遠程機器發送的數據包后,要將數據包從?NIC buffer?中復制數據到?socket buffer。然后經過一些列的多層網絡協議進行數據包的解析工作。解析后的數據被復制到相應位置的用戶空間?buffer。這個時候再進行系統上下文切換,用戶應用程序才被調用。以上就是傳統的?TCP/IP?協議層的工作。
? ? ? ? ? ?? ?? ? ? ??
傳統的?TPC/IP?存在的問題主要是指?I/O?瓶頸問題。在高速網絡條件下與網絡?I/O?相關的處理的高開銷限制了機器之間發送數據的帶寬。這里的高額開銷是數據移動操作和復制操作。具體來講,主要是傳統的?TCP/IP?網絡通信是通過內核發送消息。通過內核的消息傳遞(Messaging passing through kernel),這種方式會導致性能和靈活性很低。其中性能低的原因主要是由于網絡通信通過內核傳遞,這種通信方式存在大量的數據移動和數據復制的開銷。并且現如今內存帶寬相較如CPU帶寬和網絡帶寬有著很大的差異。其中靈活性低的原因主要是所有網絡通信協議通過內核傳遞,這種方式很難去支持新的網絡協議和新的消息通信協議以及發送和接收接口。
?
?
RDMA?詳解
RDMA(Remote Direct Memory Access)技術全稱遠程直接內存訪問,就是為了解決網絡傳輸中服務器端數據處理延遲而產生的。RDMA?主要有以下三個特性:(1) 低延時、(2) 低 CPU 占用率、(3) 高帶寬。
RDMA?通過專有的?RDMA?網卡?RNIC(RDMA-aware Network Interface Controller),繞過內核直接從用戶空間訪問?RDMA enabled NIC?網卡。RDMA?提供一個專有的?Verbs Interface?而不是傳統的?TCP/IP Socket Interface。要使用?RDMA?首先要建立從?RDMA?到應用程序內存的數據路徑 ,可以通過?RDMA?專有的?Verbs Interface?接口來建立這些數據路徑,一旦數據路徑建立后,就可以直接訪問用戶空間?buffer。
使用?RDMA 的優勢有:
零拷貝(Zero-copy):應用程序能夠直接執行數據傳輸,在不涉及到網絡軟件棧的情況下,數據能夠被直接發送到緩沖區或者能夠直接從緩沖區里接收。
內核旁路(Kernel bypass):應用程序可以直接在用戶態執行數據傳輸,不需要在內核態與用戶態之間做上下文切換。
不需要CPU干預(No CPU involvement):應用程序可以訪問遠程主機內存而不消耗遠程主機中的任何?CPU。遠程主機內存能夠被讀取而不需要遠程主機上的進程(或CPU)參與。遠程主機的CPU的緩存(cache)不會被訪問的內存內容所填充。
消息基于事務(Message based transactions):數據被處理為離散消息而不是流,消除了應用程序將流切割為不同消息/事務的需求。
支持分散/聚合條目(Scatter/gather entries support):RDMA原生態支持分散/聚合。也就是說,讀取多個內存緩沖區然后作為一個流發出去或者接收一個流然后寫入到多個內存緩沖區里去。
?
?
RDMA 基本操作
Memory verbs:包括?RDMA read、write?和?atomic?操作,這些操作指定遠程地址進行操作并且繞過接收者的?CPU。
Messaging verbs:包括?RDMA send、receive?操作,這些動作涉及的接收方?CPU,發送的數據被寫入由接收方的?CPU?事先指定的接收地址中。
RDMA傳輸分為可靠和不可靠,并且可以再分為連接和不連接(數據報)。憑借可靠的傳輸,NIC使用確認來保證消息的按序傳送。不可靠的傳輸不提供這樣的保證。然而,像?InfiniBand?這樣的現代?RDMA?實現使用了一個無損鏈路層。因此,不可靠的傳輸很少會丟棄數據包。?目前的?RDMA?硬件提供一種數據報傳輸:不可靠的數據報(UD),并且不支持?memory verbs。
?
?
RDMA?三種不同的硬件實現
目前?RDMA?有三種不同的硬件實現。分別是?InfiniBand、iWarp(internet Wide Area RDMA Protocol)、RoCE(RDMA over Converged Ethernet)。
目前,大致有三類?RDMA?網絡,分別是?Infiniband、RoCE、iWARP。其中,InfiniBand 是一種專為?RDMA?設計的網絡,從硬件級別保證可靠傳輸 , 而?RoCE??和 ?iWARP?都是基于以太網的?RDMA?技術,支持相應的?verbs?接口。如圖所示不難發現,?RoCE?協議存在?RoCE v1?和?RoCE v2?兩個版本,主要區別?RoCE?v1?是基于以太網鏈路層實現的?RDMA?協議(交換機需要支持PFC等流控技術,在物理層保證可靠傳輸),而?RoCE?v2?是以太網?TCP/IP?協議中?UDP?層實現。很明顯?Infiniband?網絡的性能最好,但網卡和交換機是價格也很高,而?RoCE?v2?和?iWARP?僅需使用特殊的網卡就可以了,價格也相對便宜很多。
InfiniBand:支持?RDMA?的新一代網絡協議。 由于這是一種新的網絡技術,因此需要支持該技術的?NIC?和交換機。
RoCE:一個允許在以太網上執行?RDMA?的網絡協議。其較低的網絡標頭是以太網標頭,其較高的網絡標頭(包括數據)是?InfiniBand。該模式支持在標準以太網基礎設施(交換機)上使用?RDMA。這需要網卡支持?RoCE。
iWARP:一個允許在?TCP?上執行?RDMA?的網絡協議。iWARP?提供的功能較?IB?和?RoCE?而言較少,但是它支持在標準以太網基礎設施(交換機)上使用?RDMA。 只有網卡應該是特殊的,并且支持?iWARP,否則所有?iWARP?堆棧都可以在?SW?中實現,并且喪失了大部分?RDMA?性能優勢。
?
?
RDMA?工作流程
RDMA?提供了基于消息隊列的點對點通信,每個應用都可以直接獲取自己的消息,無需操作系統和協議棧的介入。RDMA 宏觀工作流程:① 初始化上下文信息,注冊內存域;?② 建立 RDMA 鏈接;?③ 服務器和客戶端通過 send/receive 操作交換信息;?④ 通過 read/write 操作進行數據傳輸;?⑤ 傳輸完成后發送 MSG_DONE?消息,關閉連接。
?
內存注冊(Memory Registration)
創建兩個?key(local?和?remote)指向需要操作的內存區域,注冊的?keys?是數據傳輸請求的一部分。同時,RDMA 硬件對用來做數據傳輸的內存是有特殊要求的。
(1) 在數據傳輸過程中,應用程序不能修改數據所在的內存。
(2) 操作系統不能對數據所在的內存進行?page out?操作,即物理地址和虛擬地址的映射必須是固定不變的。
?
隊列信息
消息服務建立在通信雙方本端和遠端應用之間創建的?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?傳輸數據時的流程可以簡單理解為:
(1) Host?提交工作請求(WR)到工作隊列(WQ): 工作隊列包括發送隊列(SQ)和接收隊列(CQ)。工作隊列的每一個元素叫做 WQE, 也就是 WR。
(2) Host 從完成隊列(CQ)中獲取工作完成(WC):完成隊列里的每一個叫做?CQE, 也就是 WC。
(3) 具有?RDMA?引擎的硬件就是一個隊列元素處理器。RDMA?硬件不斷地從工作隊列(WQ)中去取工作請求(WR)來執行,執行完了就給完成隊列(CQ)中放置工作完成(WC)。
?
?
RDMA?具體操作
RDMA read
read 和?write 是單邊操作,只需要本端明確信息的源和目的地址,遠端應用不必感知此次通信,數據的讀或寫都通過?RDMA?在?RNIC?與應用?buffer?之間完成,再由遠端?RNIC?封裝成消息返回到本端。RDMA?讀操作本質上就是把遠程系統內存里的數據拉回到本地系統的內存里。此時需要:①?接收方必須提供虛擬地址和目標存儲內存的?remote_key。②?接收方需要初始和接受提醒通知,發送方是完全被動的,并且不會接受任何通知。
(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 write
RDMA?寫操作本質上就是把本地系統內存里的數據推送到遠程系統的內存里。此時需要:① 發送方必須提供虛擬地址和目標讀取內存的?remote_key。② 發送方需要初始和接受提醒通知,接受方是完全被動的,并且不會接受任何通知。
(1) 首先?A、B?建立連接,QP?已經創建并且初始化。
(2) 數據遠程目標存儲?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?與傳統網絡傳輸的最大不同,只需提供直接訪問遠程的虛擬地址,無須遠程應用的參與其中,這種方式適用于批量數據傳輸。
?
?
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?類似,收發雙方的參與過程并無差別,區別在于零拷貝、內核旁路。實際上對于?RDMA,這是一種復雜的消息傳輸模式,多用于傳輸短的控制消息。
?
?
參考:
https://blog.csdn.net/qq_21125183/article/details/80563463
https://blog.csdn.net/qq_40323844/article/details/90680159
https://blog.csdn.net/NewB20143864/article/details/104781022
總結
- 上一篇: 在知乎引发众多分布式数据库大佬争相回答的
- 下一篇: Go 语言学习笔记(一):基础知识