RDMA 知识概述
目錄
DMA、RDMA 基礎(chǔ)概念
傳統(tǒng)的網(wǎng)絡(luò)通信方式
RDMA?詳解
RDMA 基本操作
RDMA?三種不同的硬件實現(xiàn)
RDMA?工作流程
RDMA?具體操作
DMA、RDMA 基礎(chǔ)概念
DMA 傳輸將數(shù)據(jù)從一個地址空間復(fù)制到另外一個地址空間。當(dāng) CPU 初始化這個傳輸動作,傳輸動作本身是由 DMA 控制器 來實行和完成。典型的例子就是移動一個外部內(nèi)存的區(qū)塊到芯片內(nèi)部更快的內(nèi)存區(qū)。像是這樣的操作并沒有影響 CPU 的工作,反而可以去處理其他的工作。DMA 傳輸對于高性能嵌入式系統(tǒng)和網(wǎng)絡(luò)是很重要的。
RDMA(Remote?Direct Memory Access)技術(shù)全稱遠(yuǎn)程直接內(nèi)存訪問,就是為了解決網(wǎng)絡(luò)傳輸中客戶端與服務(wù)器端數(shù)據(jù)處理延遲而產(chǎn)生的。它將數(shù)據(jù)直接從一臺計算機(jī)的內(nèi)存?zhèn)鬏數(shù)搅硪慌_計算機(jī),無需操作系統(tǒng)?的介入。這允許高吞吐、低延遲的網(wǎng)絡(luò)通信,尤其適合應(yīng)用在大規(guī)模并行計算機(jī)集群中。RDMA?通過網(wǎng)絡(luò)把數(shù)據(jù)直接傳入計算機(jī)的內(nèi)存中,將數(shù)據(jù)從一個系統(tǒng)快速移動到遠(yuǎn)程系統(tǒng)內(nèi)存中,而不對操作系統(tǒng)造成任何影響,這樣就不需要占用很多計算機(jī)的處理能力。它消除了數(shù)據(jù)包在用戶空間和內(nèi)核空間復(fù)制移動和上下文切換的開銷,因而能解放內(nèi)存帶寬和?CPU?周期用于改進(jìn)應(yīng)用系統(tǒng)性能。
?
?
傳統(tǒng)的網(wǎng)絡(luò)通信方式
傳統(tǒng)的?TCP/IP?網(wǎng)絡(luò)通信,數(shù)據(jù)需要通過用戶空間發(fā)送到遠(yuǎn)程機(jī)器的用戶空間。數(shù)據(jù)發(fā)送方需要將數(shù)據(jù)從用戶空間?buffer?復(fù)制到內(nèi)核空間的?socket?buffer?中。然后內(nèi)核空間中添加數(shù)據(jù)包頭,進(jìn)行數(shù)據(jù)封裝。通過一系列多層網(wǎng)絡(luò)協(xié)議的數(shù)據(jù)包處理工作,這些協(xié)議包括傳輸控制協(xié)議(TCP)、用戶數(shù)據(jù)報協(xié)議(UDP)、互聯(lián)網(wǎng)協(xié)議(IP)等。數(shù)據(jù)才被?push?到?NIC?網(wǎng)卡中的?buffer?進(jìn)行網(wǎng)絡(luò)傳輸。消息接收方接收從遠(yuǎn)程機(jī)器發(fā)送的數(shù)據(jù)包后,要將數(shù)據(jù)包從?NIC buffer?中復(fù)制數(shù)據(jù)到?socket buffer。然后經(jīng)過一些列的多層網(wǎng)絡(luò)協(xié)議進(jìn)行數(shù)據(jù)包的解析工作。解析后的數(shù)據(jù)被復(fù)制到相應(yīng)位置的用戶空間?buffer。這個時候再進(jìn)行系統(tǒng)上下文切換,用戶應(yīng)用程序才被調(diào)用。以上就是傳統(tǒng)的?TCP/IP?協(xié)議層的工作。
? ? ? ? ? ?? ?? ? ? ??
傳統(tǒng)的?TPC/IP?存在的問題主要是指?I/O?瓶頸問題。在高速網(wǎng)絡(luò)條件下與網(wǎng)絡(luò)?I/O?相關(guān)的處理的高開銷限制了機(jī)器之間發(fā)送數(shù)據(jù)的帶寬。這里的高額開銷是數(shù)據(jù)移動操作和復(fù)制操作。具體來講,主要是傳統(tǒng)的?TCP/IP?網(wǎng)絡(luò)通信是通過內(nèi)核發(fā)送消息。通過內(nèi)核的消息傳遞(Messaging passing through kernel),這種方式會導(dǎo)致性能和靈活性很低。其中性能低的原因主要是由于網(wǎng)絡(luò)通信通過內(nèi)核傳遞,這種通信方式存在大量的數(shù)據(jù)移動和數(shù)據(jù)復(fù)制的開銷。并且現(xiàn)如今內(nèi)存帶寬相較如CPU帶寬和網(wǎng)絡(luò)帶寬有著很大的差異。其中靈活性低的原因主要是所有網(wǎng)絡(luò)通信協(xié)議通過內(nèi)核傳遞,這種方式很難去支持新的網(wǎng)絡(luò)協(xié)議和新的消息通信協(xié)議以及發(fā)送和接收接口。
?
?
RDMA?詳解
RDMA(Remote Direct Memory Access)技術(shù)全稱遠(yuǎn)程直接內(nèi)存訪問,就是為了解決網(wǎng)絡(luò)傳輸中服務(wù)器端數(shù)據(jù)處理延遲而產(chǎn)生的。RDMA?主要有以下三個特性:(1) 低延時、(2) 低 CPU 占用率、(3) 高帶寬。
RDMA?通過專有的?RDMA?網(wǎng)卡?RNIC(RDMA-aware Network Interface Controller),繞過內(nèi)核直接從用戶空間訪問?RDMA enabled NIC?網(wǎng)卡。RDMA?提供一個專有的?Verbs Interface?而不是傳統(tǒng)的?TCP/IP Socket Interface。要使用?RDMA?首先要建立從?RDMA?到應(yīng)用程序內(nèi)存的數(shù)據(jù)路徑 ,可以通過?RDMA?專有的?Verbs Interface?接口來建立這些數(shù)據(jù)路徑,一旦數(shù)據(jù)路徑建立后,就可以直接訪問用戶空間?buffer。
使用?RDMA 的優(yōu)勢有:
零拷貝(Zero-copy):應(yīng)用程序能夠直接執(zhí)行數(shù)據(jù)傳輸,在不涉及到網(wǎng)絡(luò)軟件棧的情況下,數(shù)據(jù)能夠被直接發(fā)送到緩沖區(qū)或者能夠直接從緩沖區(qū)里接收。
內(nèi)核旁路(Kernel bypass):應(yīng)用程序可以直接在用戶態(tài)執(zhí)行數(shù)據(jù)傳輸,不需要在內(nèi)核態(tài)與用戶態(tài)之間做上下文切換。
不需要CPU干預(yù)(No CPU involvement):應(yīng)用程序可以訪問遠(yuǎn)程主機(jī)內(nèi)存而不消耗遠(yuǎn)程主機(jī)中的任何?CPU。遠(yuǎn)程主機(jī)內(nèi)存能夠被讀取而不需要遠(yuǎn)程主機(jī)上的進(jìn)程(或CPU)參與。遠(yuǎn)程主機(jī)的CPU的緩存(cache)不會被訪問的內(nèi)存內(nèi)容所填充。
消息基于事務(wù)(Message based transactions):數(shù)據(jù)被處理為離散消息而不是流,消除了應(yīng)用程序?qū)⒘髑懈顬椴煌?事務(wù)的需求。
支持分散/聚合條目(Scatter/gather entries support):RDMA原生態(tài)支持分散/聚合。也就是說,讀取多個內(nèi)存緩沖區(qū)然后作為一個流發(fā)出去或者接收一個流然后寫入到多個內(nèi)存緩沖區(qū)里去。
?
?
RDMA 基本操作
Memory verbs:包括?RDMA read、write?和?atomic?操作,這些操作指定遠(yuǎn)程地址進(jìn)行操作并且繞過接收者的?CPU。
Messaging verbs:包括?RDMA send、receive?操作,這些動作涉及的接收方?CPU,發(fā)送的數(shù)據(jù)被寫入由接收方的?CPU?事先指定的接收地址中。
RDMA傳輸分為可靠和不可靠,并且可以再分為連接和不連接(數(shù)據(jù)報)。憑借可靠的傳輸,NIC使用確認(rèn)來保證消息的按序傳送。不可靠的傳輸不提供這樣的保證。然而,像?InfiniBand?這樣的現(xiàn)代?RDMA?實現(xiàn)使用了一個無損鏈路層。因此,不可靠的傳輸很少會丟棄數(shù)據(jù)包。?目前的?RDMA?硬件提供一種數(shù)據(jù)報傳輸:不可靠的數(shù)據(jù)報(UD),并且不支持?memory verbs。
?
?
RDMA?三種不同的硬件實現(xiàn)
目前?RDMA?有三種不同的硬件實現(xiàn)。分別是?InfiniBand、iWarp(internet Wide Area RDMA Protocol)、RoCE(RDMA over Converged Ethernet)。
目前,大致有三類?RDMA?網(wǎng)絡(luò),分別是?Infiniband、RoCE、iWARP。其中,InfiniBand 是一種專為?RDMA?設(shè)計的網(wǎng)絡(luò),從硬件級別保證可靠傳輸 , 而?RoCE??和 ?iWARP?都是基于以太網(wǎng)的?RDMA?技術(shù),支持相應(yīng)的?verbs?接口。如圖所示不難發(fā)現(xiàn),?RoCE?協(xié)議存在?RoCE v1?和?RoCE v2?兩個版本,主要區(qū)別?RoCE?v1?是基于以太網(wǎng)鏈路層實現(xiàn)的?RDMA?協(xié)議(交換機(jī)需要支持PFC等流控技術(shù),在物理層保證可靠傳輸),而?RoCE?v2?是以太網(wǎng)?TCP/IP?協(xié)議中?UDP?層實現(xiàn)。很明顯?Infiniband?網(wǎng)絡(luò)的性能最好,但網(wǎng)卡和交換機(jī)是價格也很高,而?RoCE?v2?和?iWARP?僅需使用特殊的網(wǎng)卡就可以了,價格也相對便宜很多。
InfiniBand:支持?RDMA?的新一代網(wǎng)絡(luò)協(xié)議。 由于這是一種新的網(wǎng)絡(luò)技術(shù),因此需要支持該技術(shù)的?NIC?和交換機(jī)。
RoCE:一個允許在以太網(wǎng)上執(zhí)行?RDMA?的網(wǎng)絡(luò)協(xié)議。其較低的網(wǎng)絡(luò)標(biāo)頭是以太網(wǎng)標(biāo)頭,其較高的網(wǎng)絡(luò)標(biāo)頭(包括數(shù)據(jù))是?InfiniBand。該模式支持在標(biāo)準(zhǔn)以太網(wǎng)基礎(chǔ)設(shè)施(交換機(jī))上使用?RDMA。這需要網(wǎng)卡支持?RoCE。
iWARP:一個允許在?TCP?上執(zhí)行?RDMA?的網(wǎng)絡(luò)協(xié)議。iWARP?提供的功能較?IB?和?RoCE?而言較少,但是它支持在標(biāo)準(zhǔn)以太網(wǎng)基礎(chǔ)設(shè)施(交換機(jī))上使用?RDMA。 只有網(wǎng)卡應(yīng)該是特殊的,并且支持?iWARP,否則所有?iWARP?堆棧都可以在?SW?中實現(xiàn),并且喪失了大部分?RDMA?性能優(yōu)勢。
?
?
RDMA?工作流程
RDMA?提供了基于消息隊列的點對點通信,每個應(yīng)用都可以直接獲取自己的消息,無需操作系統(tǒng)和協(xié)議棧的介入。RDMA 宏觀工作流程:① 初始化上下文信息,注冊內(nèi)存域;?② 建立 RDMA 鏈接;?③ 服務(wù)器和客戶端通過 send/receive 操作交換信息;?④ 通過 read/write 操作進(jìn)行數(shù)據(jù)傳輸;?⑤ 傳輸完成后發(fā)送 MSG_DONE?消息,關(guān)閉連接。
?
內(nèi)存注冊(Memory Registration)
創(chuàng)建兩個?key(local?和?remote)指向需要操作的內(nèi)存區(qū)域,注冊的?keys?是數(shù)據(jù)傳輸請求的一部分。同時,RDMA 硬件對用來做數(shù)據(jù)傳輸?shù)膬?nèi)存是有特殊要求的。
(1) 在數(shù)據(jù)傳輸過程中,應(yīng)用程序不能修改數(shù)據(jù)所在的內(nèi)存。
(2) 操作系統(tǒng)不能對數(shù)據(jù)所在的內(nèi)存進(jìn)行?page out?操作,即物理地址和虛擬地址的映射必須是固定不變的。
?
隊列信息
消息服務(wù)建立在通信雙方本端和遠(yuǎn)端應(yīng)用之間創(chuàng)建的?Channel-IO?連接之上。當(dāng)應(yīng)用需要通信時,就會創(chuàng)建一條?Channel?連接,每條?Channel?的首尾端點是兩對?Queue Pairs(QP)。
每對?QP?由?Send Queue(SQ)和?Receive Queue(RQ)構(gòu)成,這些隊列中管理著各種類型的消息。QP?會被映射到應(yīng)用的虛擬地址空間,使得應(yīng)用直接通過它訪問?RNIC?網(wǎng)卡。
除了?QP?描述的兩種基本隊列之外,RDMA?還提供一種隊列?Complete Queue(CQ),CQ?用來告知用戶?WQ?上的消息已經(jīng)被處理完。
RDMA?提供了一套軟件傳輸接口,方便用戶創(chuàng)建傳輸請求?Work Request(WR),WR中描述了應(yīng)用希望傳輸?shù)?/span>?Channel?對端的消息內(nèi)容,WR?通知?QP?中的某個隊列?Work Queue(WQ)。
在?WQ?中,用戶的?WR?被轉(zhuǎn)化為?Work Queue Element(WQE)的格式,等待?RNIC?的異步調(diào)度解析,并從?WQE?指向的?buffer?中拿到真正的消息發(fā)送到?Channel?對端。
?
RDMA?傳輸數(shù)據(jù)時的流程可以簡單理解為:
(1) Host?提交工作請求(WR)到工作隊列(WQ): 工作隊列包括發(fā)送隊列(SQ)和接收隊列(CQ)。工作隊列的每一個元素叫做 WQE, 也就是 WR。
(2) Host 從完成隊列(CQ)中獲取工作完成(WC):完成隊列里的每一個叫做?CQE, 也就是 WC。
(3) 具有?RDMA?引擎的硬件就是一個隊列元素處理器。RDMA?硬件不斷地從工作隊列(WQ)中去取工作請求(WR)來執(zhí)行,執(zhí)行完了就給完成隊列(CQ)中放置工作完成(WC)。
?
?
RDMA?具體操作
RDMA read
read 和?write 是單邊操作,只需要本端明確信息的源和目的地址,遠(yuǎn)端應(yīng)用不必感知此次通信,數(shù)據(jù)的讀或?qū)懚纪ㄟ^?RDMA?在?RNIC?與應(yīng)用?buffer?之間完成,再由遠(yuǎn)端?RNIC?封裝成消息返回到本端。RDMA?讀操作本質(zhì)上就是把遠(yuǎn)程系統(tǒng)內(nèi)存里的數(shù)據(jù)拉回到本地系統(tǒng)的內(nèi)存里。此時需要:①?接收方必須提供虛擬地址和目標(biāo)存儲內(nèi)存的?remote_key。②?接收方需要初始和接受提醒通知,發(fā)送方是完全被動的,并且不會接受任何通知。
(1) 首先?A、B?建立連接,QP?已經(jīng)創(chuàng)建并且初始化。
(2) 數(shù)據(jù)被存在?B?的?buffer?地址?VB,注意?VB?應(yīng)該提前注冊到?B?的?RNIC(并且它是一個Memory Region),并拿到返回的?local key,相當(dāng)于?RDMA?操作這塊?buffer?的權(quán)限。
(3) B?把數(shù)據(jù)地址?VB,key?封裝到專用的報文傳送到?A,這相當(dāng)于?B?把數(shù)據(jù)?buffer?的操作權(quán)交給了?A。同時?B?在它的?WQ?中注冊進(jìn)一個?WR,以用于接收數(shù)據(jù)傳輸?shù)?/span>?A?返回的狀態(tài)。
(4) A?在收到?B?的送過來的數(shù)據(jù)?VB?和?R_key?后,RNIC?會把它們連同自身存儲地址?VA?到封裝?RDMA read 請求,將這個消息請求發(fā)送給?B,這個過程?A、B?兩端不需要任何軟件參與,就可以將?B?的數(shù)據(jù)存儲到?A?的?VA?虛擬地址。
(5) A?在存儲完成后,會向?B?返回整個數(shù)據(jù)傳輸?shù)臓顟B(tài)信息。
?
?
RDMA write
RDMA?寫操作本質(zhì)上就是把本地系統(tǒng)內(nèi)存里的數(shù)據(jù)推送到遠(yuǎn)程系統(tǒng)的內(nèi)存里。此時需要:① 發(fā)送方必須提供虛擬地址和目標(biāo)讀取內(nèi)存的?remote_key。② 發(fā)送方需要初始和接受提醒通知,接受方是完全被動的,并且不會接受任何通知。
(1) 首先?A、B?建立連接,QP?已經(jīng)創(chuàng)建并且初始化。
(2) 數(shù)據(jù)遠(yuǎn)程目標(biāo)存儲?buffer?地址?VB,注意?VB?應(yīng)該提前注冊到?B?的?RNIC(并且它是一個Memory Region),并拿到返回的?local key,相當(dāng)于?RDMA?操作這塊?buffer的權(quán)限。
(3) B?把數(shù)據(jù)地址?VB,key?封裝到專用的報文傳送到?A,這相當(dāng)于?B?把數(shù)據(jù)?buffer?的操作權(quán)交給了?A。同時?B?在它的?WQ?中注冊進(jìn)一個?WR,以用于接收數(shù)據(jù)傳輸?shù)?/span>?A?返回的狀態(tài)。
(4) A?在收到?B?的送過來的數(shù)據(jù)?VB?和?R_key?后,RNIC?會把它們連同自身發(fā)送地址?VA?到封裝?RDMA write 請求,這個過程?A、B?兩端不需要任何軟件參與,就可以將?A?的數(shù)據(jù)發(fā)送到?B?的?VB?虛擬地址。
(5) A?在發(fā)送數(shù)據(jù)完成后,會向?B?返回整個數(shù)據(jù)傳輸?shù)臓顟B(tài)信息。
單邊操作傳輸方式是?RDMA?與傳統(tǒng)網(wǎng)絡(luò)傳輸?shù)淖畲蟛煌?#xff0c;只需提供直接訪問遠(yuǎn)程的虛擬地址,無須遠(yuǎn)程應(yīng)用的參與其中,這種方式適用于批量數(shù)據(jù)傳輸。
?
?
RDMA send/receive
RDMA?中?send/receive 是雙邊操作,即必須要對端的應(yīng)用感知參與才能完成收發(fā)工作。在實際中,send/receive 多用于連接控制類報文,而數(shù)據(jù)報文多是通過?read/write 來完成的。對于雙邊操作為例,主機(jī)?A?向主機(jī)?B(下面簡稱?A、B)發(fā)送數(shù)據(jù)的流程如下:
(1) A?和?B?都要創(chuàng)建并初始化好各自的?QP,CQ。
(2) A?和?B?分別向自己的?WQ?中注冊?WQE,對于?A,WQ?=?SQ,WQE?描述指向一個等到被發(fā)送的數(shù)據(jù);對于?B,WQ?=?RQ,WQE?描述指向一塊用于存儲數(shù)據(jù)的?buffer。
(3) A?的?RNIC?異步調(diào)度輪到?A?的?WQE,解析到這是一個?send 消息,從?buffer?中直接向?B?發(fā)出數(shù)據(jù)。數(shù)據(jù)流到達(dá)?B?的?RNIC?后,B?的?WQE?被消耗,并把數(shù)據(jù)直接存儲到?WQE?指向的存儲位置。
(4) AB?通信完成后,A?的?CQ?中會產(chǎn)生一個完成消息?CQE?表示發(fā)送完成。與此同時,B?的?CQ?中也會產(chǎn)生一個完成消息表示接收完成。每個?WQ?中?WQE?的處理完成都會產(chǎn)生一個?CQE。
雙邊操作與傳統(tǒng)網(wǎng)絡(luò)的底層?buffer pool?類似,收發(fā)雙方的參與過程并無差別,區(qū)別在于零拷貝、內(nèi)核旁路。實際上對于?RDMA,這是一種復(fù)雜的消息傳輸模式,多用于傳輸短的控制消息。
?
?
參考:
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
總結(jié)
- 上一篇: 在知乎引发众多分布式数据库大佬争相回答的
- 下一篇: Linux 环境下安装 Golang