DMA與RDMA

DMA 技術(shù)是一個 直接內(nèi)存訪問技術(shù)。


在傳統(tǒng)的linux 內(nèi)存讀寫操作都必須經(jīng)過cpu,讀寫尋址都是有cpu 完成的, 現(xiàn)在有一中技術(shù) 讓數(shù)據(jù)讀寫完全由網(wǎng)卡自己完成。


這樣就必須有硬件支持,及系統(tǒng)必須有DMA 控制器。 DMA 控制器可以完成尋址,和數(shù)據(jù)傳輸。


DMA 可以有軟件觸發(fā),及軟中斷,也可有硬件觸發(fā) 及硬中斷。


在DMA 系統(tǒng)中 cpu 也不完全解放出來, 當(dāng)數(shù)據(jù)來時 觸發(fā)終端通知DMA 控制其,這是獲取數(shù)據(jù)的程序進入休眠狀態(tài)。在數(shù)據(jù)完成時 cpu 在發(fā)出中斷 恢復(fù)app。


那么DMA 和RDMA 又有什么區(qū)別呢?


1. DMA ?雖然解放了cpu 但是 他還是不能把數(shù)據(jù)之節(jié)從存儲設(shè)備copy 到user 層。


硬盤->kernel space->user space->app


這其中就要cpu 參與兩次 當(dāng)數(shù)據(jù)完全讀到kernel 層的 io buffer 時發(fā)出中斷 然后cpu 把數(shù)據(jù)copy 到user 層,然后cpu 發(fā)出中斷app 從睡眠中恢復(fù) 讀寫數(shù)據(jù)。


2. RDMA 則不然 他直接從硬盤把數(shù)據(jù)讀到user 層


硬盤->user space->app ?


在這個過程中cpu 就參與一次。


值得注意的是DMA/RDMA的引入會導(dǎo)致cache 內(nèi)容和RMA 中不一致的問題, 這里需要特別注意。



1. DMA和RDMA概念#

1.1 DMA#

DMA(直接內(nèi)存訪問)是一種能力,允許在計算機主板上的設(shè)備直接把數(shù)據(jù)發(fā)送到內(nèi)存中去,數(shù)據(jù)搬運不需要CPU的參與。


傳統(tǒng)內(nèi)存訪問需要通過CPU進行數(shù)據(jù)copy來移動數(shù)據(jù),通過CPU將內(nèi)存中的Buffer1移動到Buffer2中。DMA模式:可以同DMA Engine之間通過硬件將數(shù)據(jù)從Buffer1移動到Buffer2,而不需要操作系統(tǒng)CPU的參與,大大降低了CPU Copy的開銷。




1.2 RDMA#

RDMA是一種概念,在兩個或者多個計算機進行通訊的時候使用DMA, 從一個主機的內(nèi)存直接訪問另一個主機的內(nèi)存。




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


每一個應(yīng)用程序可以有很多QP和CQ。

每一個QP包括一個SQ和RQ。

每一個CQ可以跟多個SQ或者RQ相關(guān)聯(lián)。



2. RDMA的優(yōu)勢#

傳統(tǒng)的TCP/IP技術(shù)在數(shù)據(jù)包處理過程中,要經(jīng)過操作系統(tǒng)及其他軟件層,需要占用大量的服務(wù)器資源和內(nèi)存總線帶寬,數(shù)據(jù)在系統(tǒng)內(nèi)存、處理器緩存和網(wǎng)絡(luò)控制器緩存之間來回進行復(fù)制移動,給服務(wù)器的CPU和內(nèi)存造成了沉重負擔(dān)。尤其是網(wǎng)絡(luò)帶寬、處理器速度與內(nèi)存帶寬三者的嚴重"不匹配性",更加劇了網(wǎng)絡(luò)延遲效應(yīng)。


RDMA是一種新的直接內(nèi)存訪問技術(shù),RDMA讓計算機可以直接存取其他計算機的內(nèi)存,而不需要經(jīng)過處理器的處理。RDMA將數(shù)據(jù)從一個系統(tǒng)快速移動到遠程系統(tǒng)的內(nèi)存中,而不對操作系統(tǒng)造成任何影響。


在實現(xiàn)上,RDMA實際上是一種智能網(wǎng)卡與軟件架構(gòu)充分優(yōu)化的遠端內(nèi)存直接高速訪問技術(shù),通過將RDMA協(xié)議固化于硬件(即網(wǎng)卡)上,以及支持Zero-copy和Kernel bypass這兩種途徑來達到其高性能的遠程直接數(shù)據(jù)存取的目標。 使用RDMA的優(yōu)勢如下:


零拷貝(Zero-copy) - 應(yīng)用程序能夠直接執(zhí)行數(shù)據(jù)傳輸,在不涉及到網(wǎng)絡(luò)軟件棧的情況下。數(shù)據(jù)能夠被直接發(fā)送到緩沖區(qū)或者能夠直接從緩沖區(qū)里接收,而不需要被復(fù)制到網(wǎng)絡(luò)層。

內(nèi)核旁路(Kernel bypass) - 應(yīng)用程序可以直接在用戶態(tài)執(zhí)行數(shù)據(jù)傳輸,不需要在內(nèi)核態(tài)與用戶態(tài)之間做上下文切換。

不需要CPU干預(yù)(No CPU involvement) - 應(yīng)用程序可以訪問遠程主機內(nèi)存而不消耗遠程主機中的任何CPU。遠程主機內(nèi)存能夠被讀取而不需要遠程主機上的進程(或CPU)參與。遠程主機的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ū)里去。

在具體的遠程內(nèi)存讀寫中,RDMA操作用于讀寫操作的遠程虛擬內(nèi)存地址包含在RDMA消息中傳送,遠程應(yīng)用程序要做的只是在其本地網(wǎng)卡中注冊相應(yīng)的內(nèi)存緩沖區(qū)。遠程節(jié)點的CPU除在連接建立、注冊調(diào)用等之外,在整個RDMA數(shù)據(jù)傳輸過程中并不提供服務(wù),因此沒有帶來任何負載。


3. RDMA 三種不同的硬件實現(xiàn)#

RDMA作為一種host-offload, host-bypass技術(shù),使低延遲、高帶寬的直接的內(nèi)存到內(nèi)存的數(shù)據(jù)通信成為了可能。目前支持RDMA的網(wǎng)絡(luò)協(xié)議有:

InfiniBand(IB): 從一開始就支持RDMA的新一代網(wǎng)絡(luò)協(xié)議。由于這是一種新的網(wǎng)絡(luò)技術(shù),因此需要支持該技術(shù)的網(wǎng)卡和交換機。

RDMA過融合以太網(wǎng)(RoCE): 即RDMA over Ethernet, 允許通過以太網(wǎng)執(zhí)行RDMA的網(wǎng)絡(luò)協(xié)議。這允許在標準以太網(wǎng)基礎(chǔ)架構(gòu)(交換機)上使用RDMA,只不過網(wǎng)卡必須是支持RoCE的特殊的NIC。

互聯(lián)網(wǎng)廣域RDMA協(xié)議(iWARP): 即RDMA over TCP, 允許通過TCP執(zhí)行RDMA的網(wǎng)絡(luò)協(xié)議。這允許在標準以太網(wǎng)基礎(chǔ)架構(gòu)(交換機)上使用RDMA,只不過網(wǎng)卡要求是支持iWARP(如果使用CPU offload的話)的NIC。否則,所有iWARP棧都可以在軟件中實現(xiàn),但是失去了大部分的RDMA性能優(yōu)勢。

在三種主流的RDMA技術(shù)中,可以劃分為兩大陣營。一個是IB技術(shù), 另一個是支持RDMA的以太網(wǎng)技術(shù)(RoCE和iWARP)。其中, IBTA力挺的技術(shù)自然是IB和RoCE, Mellanox公司(一個以色列人搞的小公司)是這方面的急先鋒。而iWARP則是IEEE/IETF力挺的技術(shù),主要是Chelsio公司在推進。RoCE和iWARP的爭論,請參考Mellanox和Chelsio這兩家公司發(fā)布的白皮書。

在存儲領(lǐng)域,支持RDMA的技術(shù)早就存在,比如SRP(SCSI RDMA Protocol)和iSER(iSCSI Extensions for RDMA)。 如今興起的NVMe over Fabrics如果使用的不是FC網(wǎng)絡(luò)的話,本質(zhì)上就是NVMe over RDMA。 換句話說,NVMe over InfiniBand, NVMe over RoCE和NVMe over iWARP都是NVMe over RDMA。


4. RDMA基本術(shù)語#

4.1 Fabric#

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

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


4.2 CA(Channel Adapter)#

A channel adapter is the hardware component that connects a system to the fabric.

CA是Channel Adapter(通道適配器)的縮寫。那么,CA就是將系統(tǒng)連接到Fabric的硬件組件。 在IBTA中,一個CA就是IB子網(wǎng)中的一個終端結(jié)點(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, 它們的基本功能本質(zhì)上都是生產(chǎn)或消費數(shù)據(jù)包(packet)


4.3 Verbs#

在RDMA的持續(xù)演進中,有一個組織叫做OpenFabric Alliance所做的貢獻可謂功不可沒。 Verbs這個詞不好翻譯,大致可以理解為訪問RDMA硬件的“一組標準動作”。 每一個Verb可以理解為一個Function。


5. 核心概念#

5.1 Memory Registration(MR) | 內(nèi)存注冊#

RDMA 就是用來對內(nèi)存進行數(shù)據(jù)傳輸。那么怎樣才能對內(nèi)存進行傳輸,很簡單,注冊。 因為RDMA硬件對用來做數(shù)據(jù)傳輸?shù)膬?nèi)存是有特殊要求的。


在數(shù)據(jù)傳輸過程中,應(yīng)用程序不能修改數(shù)據(jù)所在的內(nèi)存。

操作系統(tǒng)不能對數(shù)據(jù)所在的內(nèi)存進行page out操作 -- 物理地址和虛擬地址的映射必須是固定不變的。

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


創(chuàng)建兩個key (local和remote)指向需要操作的內(nèi)存區(qū)域

注冊的keys是數(shù)據(jù)傳輸請求的一部分

注冊一個Memory Region之后,這個時候這個Memory Region也就有了它自己的屬性:


context : RDMA操作上下文

addr : MR被注冊的Buffer地址

length : MR被注冊的Buffer長度

lkey:MR被注冊的本地key

rkey:MR被注冊的遠程key

對Memrory Registration:Memory Registration只是RDMA中對內(nèi)存保護的一種措施,只有將要操作的內(nèi)存注冊到RDMA Memory Region中,這快操作的內(nèi)存就交給RDMA 保護域來操作了。這個時候我們就可以對這快內(nèi)存進行操作,至于操作的起始地址、操作Buffer的長度,可以根據(jù)程序的具體需求進行操作。我們只要保證接受方的Buffer 接受的長度大于等于發(fā)送的Buffer長度。


5.2 Queues | 隊列#

RDMA一共支持三種隊列,發(fā)送隊列(SQ)和接收隊列(RQ),完成隊列(CQ)。其中,SQ和RQ通常成對創(chuàng)建,被稱為Queue Pairs(QP)。


RDMA是基于消息的傳輸協(xié)議,數(shù)據(jù)傳輸都是異步操作。 RDMA操作其實很簡單,可以理解為:


Host提交工作請求(WR)到工作隊列(WQ): 工作隊列包括發(fā)送隊列(SQ)和接收隊列(RQ)。工作隊列的每一個元素叫做WQE, 也就是WR。

Host從完成隊列(CQ)中獲取工作完成(WC): 完成隊列里的每一個叫做CQE, 也就是WC。

具有RDMA引擎的硬件(hardware)就是一個隊列元素處理器。 RDMA硬件不斷地從工作隊列(WQ)中去取工作請求(WR)來執(zhí)行,執(zhí)行完了就給完成隊列(CQ)中放置工作完成(WC)。從生產(chǎn)者-消費者的角度理解就是:

Host生產(chǎn)WR, 把WR放到WQ中去

RDMA硬件消費WR

RDMA硬件生產(chǎn)WC, 把WC放到CQ中去

Host消費WC



6. RDMA數(shù)據(jù)傳輸#

6.1 RDMA Send | RDMA發(fā)送(/接收)操作 (Send/Recv)#

跟TCP/IP的send/recv是類似的,不同的是RDMA是基于消息的數(shù)據(jù)傳輸協(xié)議(而不是基于字節(jié)流的傳輸協(xié)議),所有數(shù)據(jù)包的組裝都在RDMA硬件上完成的,也就是說OSI模型中的下面4層(傳輸層,網(wǎng)絡(luò)層,數(shù)據(jù)鏈路層,物理層)都在RDMA硬件上完成。


6.2 RDMA Read | RDMA讀操作 (Pull)#

RDMA讀操作本質(zhì)上就是Pull操作, 把遠程系統(tǒng)內(nèi)存里的數(shù)據(jù)拉回到本地系統(tǒng)的內(nèi)存里。


6.3 RDMA Write | RDMA寫操作 (Push)#

RDMA寫操作本質(zhì)上就是Push操作,把本地系統(tǒng)內(nèi)存里的數(shù)據(jù)推送到遠程系統(tǒng)的內(nèi)存里。


6.4 RDMA Write with Immediate Data | 支持立即數(shù)的RDMA寫操作#

支持立即數(shù)的RDMA寫操作本質(zhì)上就是給遠程系統(tǒng)Push(推送)帶外(OOB)數(shù)據(jù), 這跟TCP里的帶外數(shù)據(jù)是類似的。


可選地,immediate 4字節(jié)值可以與數(shù)據(jù)緩沖器一起發(fā)送。 該值作為接收通知的一部分呈現(xiàn)給接收者,并且不包含在數(shù)據(jù)緩沖器中。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 因為看了一個介紹說低延時,然后就很好奇的去搜了下是怎么做到的,就搜索到了RDMA技術(shù) 背景面對高性能計算、大數(shù)據(jù)分...
    桑榆非晚95閱讀 10,975評論 0 2
  • 重新審視RDMA的網(wǎng)絡(luò)支持 本文為SIGCOMM 2018會議論文。筆者翻譯了該論文。由于時間倉促,且筆者英文能力...
    二進制研究員閱讀 3,596評論 0 2
  • KAFKA推送消息用到了sendfile,落盤技術(shù)用到了mmap,DMA貫穿其中。 先說說零拷貝 零拷貝并不是不需...
    胖虎大哥閱讀 14,962評論 2 27
  • 1.3 技術(shù)亮點 技術(shù)亮點 AI數(shù)據(jù)存儲與計算,核心機器學(xué)習(xí)算法 - 面向100G + RoCE 設(shè)計的自研...
    Feather輕飛閱讀 1,075評論 0 0
  • ??RDMA(Remote Direct Memory Access)全稱為遠程直接內(nèi)存訪問,是從DMA衍生出來的...
    北春南秋閱讀 6,337評論 0 2

友情鏈接更多精彩內(nèi)容