深入浅出全面解析RDMA
????RDMA(RemoteDirect Memory Access)技術(shù)全稱遠(yuǎn)程直接內(nèi)存訪問(wèn),就是為了解決網(wǎng)絡(luò)傳輸中客戶端與服務(wù)器端數(shù)據(jù)處理的延遲而產(chǎn)生的。它將數(shù)據(jù)直接從一臺(tái)計(jì)算機(jī)的內(nèi)存?zhèn)鬏數(shù)搅硪慌_(tái)計(jì)算機(jī),無(wú)需雙方操作系統(tǒng)的介入。這允許高吞吐、低延遲的網(wǎng)絡(luò)通信,尤其適合在大規(guī)模并行計(jì)算機(jī)集群中使用。RDMA通過(guò)網(wǎng)絡(luò)把資料直接傳入計(jì)算機(jī)的內(nèi)存中,將數(shù)據(jù)從一個(gè)系統(tǒng)快速移動(dòng)到遠(yuǎn)程系統(tǒng)內(nèi)存中,而不對(duì)操作系統(tǒng)造成任何影響,這樣就不需要用到多少計(jì)算機(jī)的處理能力。它消除了數(shù)據(jù)包在用戶空間和內(nèi)核空間復(fù)制移動(dòng)和上下文切換的開銷,因而能解放內(nèi)存帶寬和CPU周期用于改進(jìn)應(yīng)用系統(tǒng)性能。
????本次詳解我們從三個(gè)方面詳細(xì)介紹RDMA:RDMA背景、RDMA相關(guān)工作、RDMA技術(shù)詳解。
一、背景介紹
1.1 傳統(tǒng)TCP/IP通信模式
傳統(tǒng)的TCP/IP網(wǎng)絡(luò)通信,數(shù)據(jù)需要通過(guò)用戶空間發(fā)送到遠(yuǎn)程機(jī)器的用戶空間。數(shù)據(jù)發(fā)送方需要講數(shù)據(jù)從用戶應(yīng)用空間Buffer復(fù)制到內(nèi)核空間的Socket Buffer中。然后內(nèi)核空間中添加數(shù)據(jù)包頭,進(jìn)行數(shù)據(jù)封裝。通過(guò)一系列多層網(wǎng)絡(luò)協(xié)議的數(shù)據(jù)包處理工作,這些協(xié)議包括傳輸控制協(xié)議(TCP)、用戶數(shù)據(jù)報(bào)協(xié)議(UDP)、互聯(lián)網(wǎng)協(xié)議(IP)以及互聯(lián)網(wǎng)控制消息協(xié)議(ICMP)等。數(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)過(guò)一些列的多層網(wǎng)絡(luò)協(xié)議進(jìn)行數(shù)據(jù)包的解析工作。解析后的數(shù)據(jù)被復(fù)制到相應(yīng)位置的用戶空間Buffer。這個(gè)時(shí)候再進(jìn)行系統(tǒng)上下文切換,用戶應(yīng)用程序才被調(diào)用。以上就是傳統(tǒng)的TCP/IP協(xié)議層的工作。
然而如今隨著社會(huì)的發(fā)展,我們希望更快和更輕量級(jí)的網(wǎng)絡(luò)通信。
1.2 通信網(wǎng)絡(luò)定義
????計(jì)算機(jī)網(wǎng)絡(luò)通信中最重要兩個(gè)衡量指標(biāo)主要是指高帶寬和低延遲。通信延遲主要是指:處理延遲和網(wǎng)絡(luò)傳輸延遲。處理延遲開銷指的就是消息在發(fā)送和接收階段的處理時(shí)間。網(wǎng)絡(luò)傳輸延遲指的就是消息在發(fā)送和接收方的網(wǎng)絡(luò)傳輸時(shí)延。如果網(wǎng)絡(luò)通信狀況很好的情況下,網(wǎng)絡(luò)基本上可以 達(dá)到高帶寬和低延遲。
1.3? 當(dāng)今網(wǎng)絡(luò)現(xiàn)狀
????當(dāng)今隨著計(jì)算機(jī)網(wǎng)絡(luò)的發(fā)展。消息通信主要分為兩類消息,一類是Large Messages,在這類消息通信中,網(wǎng)絡(luò)傳輸延遲占整個(gè)通信中的主導(dǎo)位置。還有一類消息是Small Messages,在這類消息通信中,消息發(fā)送端和接受端的處理開銷占整個(gè)通信的主導(dǎo)地位。然而在現(xiàn)實(shí)計(jì)算機(jī)網(wǎng)絡(luò)中的通信場(chǎng)景中,主要是以發(fā)送小消息為主。所有說(shuō)發(fā)送消息和接受消息的處理開銷占整個(gè)通信的主導(dǎo)的地位。具體來(lái)說(shuō),處理開銷指的是buffer管理、在不同內(nèi)存空間中消息復(fù)制、以及消息發(fā)送完成后的系統(tǒng)中斷。
1.4 傳統(tǒng)TCP/IP存在的問(wèn)題
? ? 傳統(tǒng)的TPC/IP存在的問(wèn)題主要是指I/O bottleneck瓶頸問(wèn)題。在高速網(wǎng)絡(luò)條件下與網(wǎng)絡(luò)I/O相關(guān)的處理的高開銷限制了可以在機(jī)器之間發(fā)送的帶寬。這里高額開銷是數(shù)據(jù)移動(dòng)操作和復(fù)制操作。具體來(lái)講,主要是傳統(tǒng)的TCP/IP網(wǎng)絡(luò)通信是通過(guò)內(nèi)核發(fā)送消息。Messaging passing through kernel這種方式會(huì)導(dǎo)致很低的性能和很低的靈活性。其中性能低下的原因主要是由于網(wǎng)絡(luò)通信通過(guò)內(nèi)核傳遞,這種通信方式存在的很高的數(shù)據(jù)移動(dòng)和數(shù)據(jù)復(fù)制的開銷。并且現(xiàn)如今內(nèi)存帶寬性相較如CPU帶寬和網(wǎng)絡(luò)帶寬有著很大的差異。其中很低的靈活性的原因主要是所有網(wǎng)絡(luò)通信協(xié)議通過(guò)內(nèi)核傳遞,這種方式很難去支持新的網(wǎng)絡(luò)協(xié)議和新的消息通信協(xié)議以及發(fā)送和接收接口。
二、相關(guān)工作
? ? 高性能網(wǎng)絡(luò)通信歷史發(fā)展主要有以下四個(gè)方面:TCP Offloading Engine(TOE)、User-Net Networking(U-Net)、Virtual interface Architecture(VIA)、Remote Direct Memroy Access(RDMA)。U-Net是第一個(gè)跨過(guò)內(nèi)核網(wǎng)絡(luò)通信的模式之一。VIA首次提出了標(biāo)準(zhǔn)化user-level的網(wǎng)絡(luò)通信模式,其次它組合了U-Net接口和遠(yuǎn)程DMA設(shè)備。RDMA就是現(xiàn)代化高性能網(wǎng)絡(luò)通信技術(shù)。
2.1 TCP Offloading Engine
????在主機(jī)通過(guò)網(wǎng)絡(luò)進(jìn)行通信的過(guò)程中,主機(jī)處理器需要耗費(fèi)大量資源進(jìn)行多層網(wǎng)絡(luò)協(xié)議的數(shù)據(jù)包處理工作,這些協(xié)議包括傳輸控制協(xié)議(TCP)、用戶數(shù)據(jù)報(bào)協(xié)議(UDP)、互聯(lián)網(wǎng)協(xié)議(IP)以及互聯(lián)網(wǎng)控制消息協(xié)議(ICMP)等。由于CPU需要進(jìn)行繁重的封裝網(wǎng)絡(luò)數(shù)據(jù)包協(xié)議,為了將占用的這部分主機(jī)處理器資源解放出來(lái)專注于其他應(yīng)用,人們發(fā)明了TOE(TCP/IP Offloading Engine)技術(shù),將上述主機(jī)處理器的工作轉(zhuǎn)移到網(wǎng)卡上。
? ? 這種技術(shù)需要特定網(wǎng)絡(luò)接口-網(wǎng)卡支持這種Offloading操作。這種特定網(wǎng)卡能夠支持封裝多層網(wǎng)絡(luò)協(xié)議的數(shù)據(jù)包,這個(gè)功能常見于高速以太網(wǎng)接口上,如吉比特以太網(wǎng)(GbE)或10吉比特以太網(wǎng)(10GbE)。
2.2?User-Net Networking(U-Net)
? ? U-Net的設(shè)計(jì)目標(biāo)是將協(xié)議處理部分移動(dòng)到用戶空間去處理。這種方式避免了用戶空間將數(shù)據(jù)移動(dòng)和復(fù)制到內(nèi)核空間的開銷。它的設(shè)計(jì)宗旨就是移動(dòng)整個(gè)協(xié)議棧到用戶空間中去,并且從數(shù)據(jù)通信路徑中徹底刪除內(nèi)核。這種設(shè)計(jì)帶來(lái)了高性能的提升和高靈活性的提升。
? ? U-Net的virtual NI 為每個(gè)進(jìn)程提供了一種擁有網(wǎng)絡(luò)接口的錯(cuò)覺,內(nèi)核接口只涉及到連接步驟。傳統(tǒng)上的網(wǎng)絡(luò),內(nèi)核控制整個(gè)網(wǎng)絡(luò)通信,所有的通信都需要通過(guò)內(nèi)核來(lái)傳遞。U-Net應(yīng)用程序可以通過(guò)MUX直接訪問(wèn)網(wǎng)絡(luò),應(yīng)用程序通過(guò)MUX直接訪問(wèn)內(nèi)核,而不需要將數(shù)據(jù)移動(dòng)和復(fù)制到內(nèi)核空間中去。
三、RDMA詳解
????RDMA(Remote Direct Memory Access)技術(shù)全稱遠(yuǎn)程直接內(nèi)存訪問(wèn),就是為了解決網(wǎng)絡(luò)傳輸中服務(wù)器端數(shù)據(jù)處理的延遲而產(chǎn)生的。
RDMA主要有以下三個(gè)特性:1.Low-Latency 2.Low CPU overhead 3. high bandwidth
3.1 RDMA 簡(jiǎn)介
Remote:數(shù)據(jù)通過(guò)網(wǎng)絡(luò)與遠(yuǎn)程機(jī)器間進(jìn)行數(shù)據(jù)傳輸。
Direct:沒(méi)有內(nèi)核的參與,有關(guān)發(fā)送傳輸?shù)乃袃?nèi)容都卸載到網(wǎng)卡上。
Memory:在用戶空間虛擬內(nèi)存與RNIC網(wǎng)卡直接進(jìn)行數(shù)據(jù)傳輸不涉及到系統(tǒng)內(nèi)核,沒(méi)有額外的數(shù)據(jù)移動(dòng)和復(fù)制。
Access:send、receive、read、write、atomic操作。
3.2 RDMA基本概念
????RDMA有兩種基本操作。
????RDMA傳輸分為可靠和不可靠的,并且可以連接和不連接的(數(shù)據(jù)報(bào))。憑借可靠的傳輸,NIC使用確認(rèn)來(lái)保證消息的按序傳送。不可靠的傳輸不提供這樣的保證。然而,像InfiniBand這樣的現(xiàn)代RDMA實(shí)現(xiàn)使用了一個(gè)無(wú)損鏈路層,它可以防止使用鏈路層流量控制的基于擁塞的損失[1],以及使用鏈路層重傳的基于位錯(cuò)誤的損失[8]。因此,不可靠的傳輸很少會(huì)丟棄數(shù)據(jù)包。?
目前的RDMA硬件提供一種數(shù)據(jù)報(bào)傳輸:不可靠的數(shù)據(jù)報(bào)(UD),并且不支持memory verbs。
?
3.3 RDMA三種不同的硬件實(shí)現(xiàn)
? ? 目前RDMA有三種不同的硬件實(shí)現(xiàn)。分別是InfiniBand、iWarp(internet Wide Area RDMA Protocol)、RoCE(RDMA over Converged Ethernet)。
目前,大致有三類RDMA網(wǎng)絡(luò),分別是Infiniband、RoCE、iWARP。其中,Infiniband是一種專為RDMA設(shè)計(jì)的網(wǎng)絡(luò),從硬件級(jí)別保證可靠傳輸 , 而RoCE 和 iWARP都是基于以太網(wǎng)的RDMA技術(shù),支持相應(yīng)的verbs接口,如圖1所示。從圖中不難發(fā)現(xiàn),RoCE協(xié)議存在RoCEv1和RoCEv2兩個(gè)版本,主要區(qū)別RoCEv1是基于以太網(wǎng)鏈路層實(shí)現(xiàn)的RDMA協(xié)議(交換機(jī)需要支持PFC等流控技術(shù),在物理層保證可靠傳輸),而RoCEv2是以太網(wǎng)TCP/IP協(xié)議中UDP層實(shí)現(xiàn)。從性能上,很明顯Infiniband網(wǎng)絡(luò)最好,但網(wǎng)卡和交換機(jī)是價(jià)格也很高,然而RoCEv2和iWARP僅需使用特殊的網(wǎng)卡就可以了,價(jià)格也相對(duì)便宜很多。
?
3.4 RDMA技術(shù)
傳統(tǒng)上的RDMA技術(shù)設(shè)計(jì)內(nèi)核封裝多層網(wǎng)絡(luò)協(xié)議并且涉及內(nèi)核數(shù)據(jù)傳輸。RDMA通過(guò)專有的RDMA網(wǎng)卡RNIC,繞過(guò)內(nèi)核直接從用戶空間訪問(wèn)RDMA enabled NIC網(wǎng)卡。RDMA提供一個(gè)專有的Verbs Interface而不是傳統(tǒng)的TCP/IP Socket Interface。要使用RDMA首先要建立從RDMA到應(yīng)用程序內(nèi)存的數(shù)據(jù)路徑 ,可以通過(guò)RDMA專有的Verbs Interface接口來(lái)建立這些數(shù)據(jù)路徑,一旦數(shù)據(jù)路徑建立后,就可以直接訪問(wèn)用戶空間buffer。
3.5 RDMA整體系統(tǒng)架構(gòu)圖
? ? 上訴介紹的是RDMA整體框架架構(gòu)圖。從圖中可以看出,RDMA在應(yīng)用程序用戶空間,提供了一系列verbs interface接口操作RDMA硬件。RDMA繞過(guò)內(nèi)核直接從用戶空間訪問(wèn)RDMA 網(wǎng)卡(RNIC)。RNIC網(wǎng)卡中包括Cached Page Table Entry,頁(yè)表就是用來(lái)將虛擬頁(yè)面映射到相應(yīng)的物理頁(yè)面。
3.6 RDMA技術(shù)詳解
RDMA 的工作過(guò)程如下:
1)當(dāng)一個(gè)應(yīng)用執(zhí)行RDMA 讀或?qū)懻?qǐng)求時(shí),不執(zhí)行任何數(shù)據(jù)復(fù)制.在不需要任何內(nèi)核內(nèi)存參與的條件下,RDMA 請(qǐng)求從運(yùn)行在用戶空間中的應(yīng)用中發(fā)送到本地NIC( 網(wǎng)卡)。
2) NIC 讀取緩沖的內(nèi)容,并通過(guò)網(wǎng)絡(luò)傳送到遠(yuǎn)程N(yùn)IC。
3) 在網(wǎng)絡(luò)上傳輸?shù)腞DMA 信息包含目標(biāo)虛擬地址、內(nèi)存鑰匙和數(shù)據(jù)本身.請(qǐng)求既可以完全在用戶空間中處理(通過(guò)輪詢用戶級(jí)完成排列) ,又或者在應(yīng)用一直睡眠到請(qǐng)求完成時(shí)的情況下通過(guò)系統(tǒng)中斷處理.RDMA 操作使應(yīng)用可以從一個(gè)遠(yuǎn)程應(yīng)用的內(nèi)存中讀數(shù)據(jù)或向這個(gè)內(nèi)存寫數(shù)據(jù)。
4) 目標(biāo)NIC 確認(rèn)內(nèi)存鑰匙,直接將數(shù)據(jù)寫人應(yīng)用緩存中.用于操作的遠(yuǎn)程虛擬內(nèi)存地址包含在RDMA 信息中。
3.7 RDMA操作細(xì)節(jié)
? ? ? ?RDMA提供了基于消息隊(duì)列的點(diǎn)對(duì)點(diǎn)通信,每個(gè)應(yīng)用都可以直接獲取自己的消息,無(wú)需操作系統(tǒng)和協(xié)議棧的介入。
? ? ? ?消息服務(wù)建立在通信雙方本端和遠(yuǎn)端應(yīng)用之間創(chuàng)建的Channel-IO連接之上。當(dāng)應(yīng)用需要通信時(shí),就會(huì)創(chuàng)建一條Channel連接,每條Channel的首尾端點(diǎn)是兩對(duì)Queue Pairs(QP)。每對(duì)QP由Send Queue(SQ)和Receive Queue(RQ)構(gòu)成,這些隊(duì)列中管理著各種類型的消息。QP會(huì)被映射到應(yīng)用的虛擬地址空間,使得應(yīng)用直接通過(guò)它訪問(wèn)RNIC網(wǎng)卡。除了QP描述的兩種基本隊(duì)列之外,RDMA還提供一種隊(duì)列Complete Queue(CQ),CQ用來(lái)知會(huì)用戶WQ上的消息已經(jīng)被處理完。
? ? ? ?RDMA提供了一套軟件傳輸接口,方便用戶創(chuàng)建傳輸請(qǐng)求Work Request(WR),WR中描述了應(yīng)用希望傳輸?shù)紺hannel對(duì)端的消息內(nèi)容,WR通知QP中的某個(gè)隊(duì)列Work Queue(WQ)。在WQ中,用戶的WR被轉(zhuǎn)化為Work Queue Element(WQE)的格式,等待RNIC的異步調(diào)度解析,并從WQE指向的Buffer中拿到真正的消息發(fā)送到Channel對(duì)端。
3.7.1 RDAM單邊操作 (RDMA READ)
READ和WRITE是單邊操作,只需要本端明確信息的源和目的地址,遠(yuǎn)端應(yīng)用不必感知此次通信,數(shù)據(jù)的讀或?qū)懚纪ㄟ^(guò)RDMA在RNIC與應(yīng)用Buffer之間完成,再由遠(yuǎn)端RNIC封裝成消息返回到本端。
對(duì)于單邊操作,以存儲(chǔ)網(wǎng)絡(luò)環(huán)境下的存儲(chǔ)為例,數(shù)據(jù)的流程如下:
1.? ?首先A、B建立連接,QP已經(jīng)創(chuàng)建并且初始化。
2.? ?數(shù)據(jù)被存檔在B的buffer地址VB,注意VB應(yīng)該提前注冊(cè)到B的RNIC (并且它是一個(gè)Memory Region) ,并拿到返回的local key,相當(dāng)于RDMA操作這塊buffer的權(quán)限。
3.? ?B把數(shù)據(jù)地址VB,key封裝到專用的報(bào)文傳送到A,這相當(dāng)于B把數(shù)據(jù)buffer的操作權(quán)交給了A。同時(shí)B在它的WQ中注冊(cè)進(jìn)一個(gè)WR,以用于接收數(shù)據(jù)傳輸?shù)腁返回的狀態(tài)。
4.? ?A在收到B的送過(guò)來(lái)的數(shù)據(jù)VB和R_key后,RNIC會(huì)把它們連同自身存儲(chǔ)地址VA到封裝RDMA READ請(qǐng)求,將這個(gè)消息請(qǐng)求發(fā)送給B,這個(gè)過(guò)程A、B兩端不需要任何軟件參與,就可以將B的數(shù)據(jù)存儲(chǔ)到A的VA虛擬地址。
5.? ?A在存儲(chǔ)完成后,會(huì)向B返回整個(gè)數(shù)據(jù)傳輸?shù)臓顟B(tài)信息。
單邊操作傳輸方式是RDMA與傳統(tǒng)網(wǎng)絡(luò)傳輸?shù)淖畲蟛煌?#xff0c;只需提供直接訪問(wèn)遠(yuǎn)程的虛擬地址,無(wú)須遠(yuǎn)程應(yīng)用的參與其中,這種方式適用于批量數(shù)據(jù)傳輸。
3.7.2 RDMA 單邊操作 (RDMA WRITE)
對(duì)于單邊操作,以存儲(chǔ)網(wǎng)絡(luò)環(huán)境下的存儲(chǔ)為例,數(shù)據(jù)的流程如下:
1.? ?首先A、B建立連接,QP已經(jīng)創(chuàng)建并且初始化。
2.? ?數(shù)據(jù)remote目標(biāo)存儲(chǔ)buffer地址VB,注意VB應(yīng)該提前注冊(cè)到B的RNIC(并且它是一個(gè)Memory Region),并拿到返回的local key,相當(dāng)于RDMA操作這塊buffer的權(quán)限。
3.? ?B把數(shù)據(jù)地址VB,key封裝到專用的報(bào)文傳送到A,這相當(dāng)于B把數(shù)據(jù)buffer的操作權(quán)交給了A。同時(shí)B在它的WQ中注冊(cè)進(jìn)一個(gè)WR,以用于接收數(shù)據(jù)傳輸?shù)腁返回的狀態(tài)。
4.? ?A在收到B的送過(guò)來(lái)的數(shù)據(jù)VB和R_key后,RNIC會(huì)把它們連同自身發(fā)送地址VA到封裝RDMA WRITE請(qǐng)求,這個(gè)過(guò)程A、B兩端不需要任何軟件參與,就可以將A的數(shù)據(jù)發(fā)送到B的VB虛擬地址。
5.? ?A在發(fā)送數(shù)據(jù)完成后,會(huì)向B返回整個(gè)數(shù)據(jù)傳輸?shù)臓顟B(tài)信息。
單邊操作傳輸方式是RDMA與傳統(tǒng)網(wǎng)絡(luò)傳輸?shù)淖畲蟛煌?#xff0c;只需提供直接訪問(wèn)遠(yuǎn)程的虛擬地址,無(wú)須遠(yuǎn)程應(yīng)用的參與其中,這種方式適用于批量數(shù)據(jù)傳輸。
?3.7.3?RDMA 雙邊操作 (RDMA SEND/RECEIVE)
?RDMA中SEND/RECEIVE是雙邊操作,即必須要遠(yuǎn)端的應(yīng)用感知參與才能完成收發(fā)。在實(shí)際中,SEND/RECEIVE多用于連接控制類報(bào)文,而數(shù)據(jù)報(bào)文多是通過(guò)READ/WRITE來(lái)完成的。
對(duì)于雙邊操作為例,主機(jī)A向主機(jī)B(下面簡(jiǎn)稱A、B)發(fā)送數(shù)據(jù)的流程如下:
1.? ?首先,A和B都要?jiǎng)?chuàng)建并初始化好各自的QP,CQ
2.? ?A和B分別向自己的WQ中注冊(cè)WQE,對(duì)于A,WQ=SQ,WQE描述指向一個(gè)等到被發(fā)送的數(shù)據(jù);對(duì)于B,WQ=RQ,WQE描述指向一塊用于存儲(chǔ)數(shù)據(jù)的Buffer。
3.? ?A的RNIC異步調(diào)度輪到A的WQE,解析到這是一個(gè)SEND消息,從Buffer中直接向B發(fā)出數(shù)據(jù)。數(shù)據(jù)流到達(dá)B的RNIC后,B的WQE被消耗,并把數(shù)據(jù)直接存儲(chǔ)到WQE指向的存儲(chǔ)位置。
4.? AB通信完成后,A的CQ中會(huì)產(chǎn)生一個(gè)完成消息CQE表示發(fā)送完成。與此同時(shí),B的CQ中也會(huì)產(chǎn)生一個(gè)完成消息表示接收完成。每個(gè)WQ中WQE的處理完成都會(huì)產(chǎn)生一個(gè)CQE。
雙邊操作與傳統(tǒng)網(wǎng)絡(luò)的底層Buffer Pool類似,收發(fā)雙方的參與過(guò)程并無(wú)差別,區(qū)別在零拷貝、Kernel Bypass,實(shí)際上對(duì)于RDMA,這是一種復(fù)雜的消息傳輸模式,多用于傳輸短的控制消息。
總結(jié)
以上是生活随笔為你收集整理的深入浅出全面解析RDMA的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一周一论文(翻译)——[SIGMOD 2
- 下一篇: apache搭建的 webserver下