电竞比分网-中国电竞赛事及体育赛事平台

分享

解鎖RDMA 技術(shù):從原理到應用的深度剖析

 Sideboard_SoSE 2024-12-30 發(fā)布于四川

在當今這個數(shù)據(jù)爆炸的時代,數(shù)據(jù)的高效傳輸和處理成為了各個領域的關(guān)鍵需求。

無論是大規(guī)模的科學計算、海量數(shù)據(jù)的存儲與分析,還是實時性要求極高的金融交易和人工智能訓練,傳統(tǒng)的網(wǎng)絡通信技術(shù)在面對這些挑戰(zhàn)時,都顯得有些力不從心。

而今天,我們要一起探索的RDMA 技術(shù),就像是一把神奇的鑰匙,有望為我們打開高效網(wǎng)絡通信的新大門,讓數(shù)據(jù)傳輸變得更加快速、高效和低延遲。

1.       RDMA簡介

1.1.    RDMA 是何方神圣?

RDMA,全稱遠程直接數(shù)據(jù)存?。?/span>Remote Direct Memory Access),是一種創(chuàng)新性的網(wǎng)絡通信技術(shù)。

在傳統(tǒng)網(wǎng)絡通信模式下,數(shù)據(jù)傳輸往往需要經(jīng)過操作系統(tǒng)及多層軟件協(xié)議棧的處理,這會導致大量的 CPU 資源被占用,數(shù)據(jù)傳輸延遲較高。而 RDMA 技術(shù)的出現(xiàn),旨在解決這些問題,它能夠讓計算機直接訪問遠程計算機的內(nèi)存,而無需在本地和遠程計算機之間進行繁瑣的數(shù)據(jù)復制,從而顯著降低數(shù)據(jù)傳輸?shù)难舆t,提高數(shù)據(jù)處理效率,這使得它在現(xiàn)代網(wǎng)絡通信中占據(jù)著至關(guān)重要的地位,尤其在對網(wǎng)絡性能要求極高的領域,如:高性能計算(HPC)、數(shù)據(jù)中心、云計算等,發(fā)揮著不可或缺的作用。

1.2.    技術(shù)背景

1.2.1.     傳統(tǒng)網(wǎng)絡通信的困境

在深入探討 RDMA 技術(shù)之前,我們先來了解一下傳統(tǒng)網(wǎng)絡通信存在的問題。以常見的 TCP/IP 通信模式為例,當數(shù)據(jù)在網(wǎng)絡中傳輸時,需要經(jīng)過操作系統(tǒng)內(nèi)核以及多層軟件協(xié)議棧的處理。這一過程會涉及到多次的數(shù)據(jù)拷貝和上下文切換,從而導致較高的延遲和大量的CPU 資源消耗。

具體來說,當發(fā)送端應用程序要發(fā)送數(shù)據(jù)時,數(shù)據(jù)首先會從用戶空間的緩沖區(qū)拷貝到內(nèi)核空間的緩沖區(qū),然后經(jīng)過協(xié)議棧的封裝,再通過網(wǎng)卡發(fā)送出去。在接收端,數(shù)據(jù)則需要從網(wǎng)卡接收,經(jīng)過協(xié)議棧的解封裝,再從內(nèi)核空間拷貝到用戶空間的緩沖區(qū),以供應用程序使用。

這些數(shù)據(jù)拷貝和上下文切換操作不僅占用了寶貴的 CPU 時間,還使得數(shù)據(jù)傳輸?shù)难舆t難以降低,尤其是在處理大量小數(shù)據(jù)塊的傳輸或者對實時性要求較高的應用場景時,傳統(tǒng)網(wǎng)絡通信的這些問題就顯得更加突出,嚴重影響了系統(tǒng)的整體性能和響應速度。

傳統(tǒng)的 TCP/IP 網(wǎng)絡通信,數(shù)據(jù)需要通過用戶空間發(fā)送到遠程機器的用戶空間,在這個過程中需要經(jīng)歷若干次內(nèi)存拷貝:

如上圖,在傳統(tǒng)模式下,兩臺服務器上的應用之間傳輸數(shù)據(jù),過程是這樣的:

1.       首先要把數(shù)據(jù)從應用緩存拷貝到Kernel中的TCP協(xié)議棧緩存;

2.       然后再拷貝到驅(qū)動層;

3.       最后拷貝到網(wǎng)卡緩存。

多次內(nèi)存拷貝需要CPU多次介入,導致處理延時大,達到數(shù)十微秒。同時整個過程中CPU過多參與,大量消耗CPU性能,影響正常的數(shù)據(jù)計算。

1.2.2.     TCP/IP存在的問題

傳統(tǒng)TCP/IP通信存在的主要問題就是I/O瓶頸問題。在高速網(wǎng)絡環(huán)境下與網(wǎng)絡I/O相關(guān)的主機處理的高開銷(數(shù)據(jù)移動操作和復制操作)限制了機器之間的傳輸帶寬。

具體來說,傳統(tǒng)的TCP/IP網(wǎng)絡通信是通過內(nèi)核發(fā)送消息。通過內(nèi)核來傳輸消息這種機制會導致性能低和靈活性差。

l 性能低的主要原因是:

由于網(wǎng)絡通信通過內(nèi)核傳遞,需要在內(nèi)核中頻繁進行協(xié)議封裝和解封操作,造成很大的數(shù)據(jù)移動和數(shù)據(jù)復制開銷。

l 靈活性差的原因是:

是因為網(wǎng)絡通信協(xié)議在內(nèi)核中進行處理,這種方式很難支持新的網(wǎng)絡協(xié)議和新的消息通信協(xié)議以及發(fā)送和接收接口。

2.       RDMA技術(shù)的核心原理

2.1.    RDMA原理概述

RDMA (繞過CPU,數(shù)據(jù)直接'傳’到對端內(nèi)存)為了消除傳統(tǒng)網(wǎng)絡通信帶給計算任務的瓶頸,我們希望更快和更輕量級的網(wǎng)絡通信,由此提出了RDMA技術(shù)。

RDMA利用 Kernel Bypass Zero Copy技術(shù)提供了低延遲的特性,同時減少了CPU占用,減少了內(nèi)存帶寬瓶頸,提供了很高的帶寬利用率。

RDMA提供了給基于 IO 的通道,這種通道允許一個應用程序通過RDMA設備對遠程的虛擬內(nèi)存進行直接的讀寫。

2.2.    RDMA 整體框架架構(gòu)

下面是 RDMA 整體框架架構(gòu)圖,從圖中可以看出,RDMA 提供了一系列 Verbs 接口,可在應用程序用戶空間,操作RDMA硬件。

RDMA繞過內(nèi)核直接從用戶空間訪問RDMA 網(wǎng)卡。RNIC(RDMA 網(wǎng)卡,RNICNIC = Network Interface Card ,網(wǎng)絡接口卡、網(wǎng)卡,RNIC RDMA Network Interface Card)中包括 Cached Page Table Entry,用來將虛擬頁面映射到相應的物理頁面。

2.3.    RDMA 技術(shù)有以下幾個特點:

2.3.1.     CPU Offload

無需CPU干預,應用程序可以訪問遠程主機內(nèi)存而不消耗遠程主機中的任何CPU。遠程主機內(nèi)存能夠被讀取而不需要遠程主機上的進程(或CPU)參與。遠程主機的CPU的緩存(cache)不會被訪問的內(nèi)存內(nèi)容所填充。

2.3.2.     Kernel Bypass

RDMA 提供一個專有的 Verbsinterface 而不是傳統(tǒng)的TCP/IP Socket interface。應用程序可以直接在用戶態(tài)執(zhí)行數(shù)據(jù)傳輸,不需要在內(nèi)核態(tài)與用戶態(tài)之間做上下文切換。

2.3.3.     Zero Copy

每個應用程序都能直接訪問集群中的設備的虛擬內(nèi)存,這意味著應用程序能夠直接執(zhí)行數(shù)據(jù)傳輸,在不涉及到網(wǎng)絡軟件棧的情況下,數(shù)據(jù)能夠被直接發(fā)送到緩沖區(qū)或者能夠直接從緩沖區(qū)里接收,而不需要被復制到網(wǎng)絡層。

2.4.    RDMA機制剖析

2.4.1.     直接內(nèi)存訪問機制

RDMA 的核心在于其直接內(nèi)存訪問機制。在傳統(tǒng)的網(wǎng)絡通信中,數(shù)據(jù)傳輸需要CPU 的深度參與,例如數(shù)據(jù)從應用程序緩沖區(qū)拷貝到內(nèi)核緩沖區(qū),再通過網(wǎng)絡協(xié)議棧進行封裝和傳輸,接收端則需要逆向操作,將數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到應用程序緩沖區(qū),整個過程涉及多次數(shù)據(jù)拷貝和 CPU 上下文切換,效率較低。

RDMA 允許計算機直接存取其他計算機的內(nèi)存,繞過了處理器的繁瑣處理過程,數(shù)據(jù)傳輸?shù)拇蟛糠止ぷ饔捎布韴?zhí)行,直接在遠程系統(tǒng)的內(nèi)存之間進行讀寫操作,極大地提高了數(shù)據(jù)傳輸?shù)男屎退俣龋瑴p少了 CPU 的負擔,使得系統(tǒng)能夠?qū)⒏嗟馁Y源用于實際的數(shù)據(jù)處理任務,從而提升整體性能。

2.4.2.     零拷貝與內(nèi)核旁路

零拷貝技術(shù)是 RDMA 的另一大關(guān)鍵特性。在傳統(tǒng)通信模式下,數(shù)據(jù)在傳輸過程中需要在不同的內(nèi)存區(qū)域之間進行多次拷貝,例如從用戶空間拷貝到內(nèi)核空間,再從內(nèi)核空間拷貝到網(wǎng)絡設備緩沖區(qū)等,這些拷貝操作不僅消耗 CPU 資源,還會增加數(shù)據(jù)傳輸?shù)难舆t。而 RDMA 實現(xiàn)了零拷貝,使得數(shù)據(jù)能夠直接在應用程序的緩沖區(qū)與網(wǎng)絡之間進行傳輸,無需中間的拷貝環(huán)節(jié),大大減少了數(shù)據(jù)傳輸?shù)拈_銷和延遲。

內(nèi)核旁路也是 RDMA 提升性能的重要手段。在傳統(tǒng)網(wǎng)絡通信中,應用程序與網(wǎng)絡設備之間的通信需要經(jīng)過操作系統(tǒng)內(nèi)核的干預,這會導致上下文切換和系統(tǒng)調(diào)用的開銷。而 RDMA 允許應用程序在用戶態(tài)直接與網(wǎng)卡進行交互,避免了內(nèi)核態(tài)與用戶態(tài)之間的上下文切換,進一步降低了 CPU 的負擔,提高了數(shù)據(jù)傳輸?shù)男屎晚憫俣?。例如,在一些對實時性要求極高的金融交易系統(tǒng)中,RDMA 的零拷貝和內(nèi)核旁路技術(shù)能夠確保交易數(shù)據(jù)的快速傳輸和處理,減少交易延遲,提高交易效率。

2.4.3.   RDMA通信協(xié)議

目前,有三種支持RDMA的通信技術(shù):

InfiniBand(IB): 基于InfiniBand 架構(gòu)的 RDMA技術(shù),需要專用的 IB 網(wǎng)卡和 IB 交換機。從性能上,很明顯Infiniband網(wǎng)絡最好,但網(wǎng)卡和交換機是價格也很高。

RoCE:即RDMA over Ethernet(RoCE), 基于以太網(wǎng)的 RDMA 技術(shù),也是由 IBTA 提出。RoCE支持在標準以太網(wǎng)基礎設施上使用RDMA技術(shù),但是需要交換機支持無損以太網(wǎng)傳輸,只不過網(wǎng)卡必須是支持RoCE的特殊的NIC

iWARPInternet Wide Area RDMA Protocal,基于 TCP/IP 協(xié)議的 RDMA 技術(shù)(在現(xiàn)有TCP/IP協(xié)議?;A上實現(xiàn)RDMA技術(shù),在TCP協(xié)議上增加一層DDP),由 IETF 準定義。iWARP 支持在標準以太網(wǎng)基礎設施上使用 RDMA 技術(shù),而不需要交換機支持無損以太網(wǎng)傳輸,但服務器需要使用支持iWARP的網(wǎng)卡。與此同時,受 TCP 影響,性能稍差。

這三種技術(shù)都可以使用同一套API來使用,但它們有著不同的物理層和鏈路層;需要注意的是,上述幾種協(xié)議都需要專門的硬件(網(wǎng)卡)支持。

2.4.3.1.InfiniBand

InfiniBandIB)是一種服務器和存儲器的互聯(lián)技術(shù),它具有高速、低延遲、低CPU負載、高效率和可擴展的特性。

InfiniBand的關(guān)鍵特性之一是它天然地支持遠程直接內(nèi)存訪問(RDMA)。InfiniBand能夠讓服務器與服務器之間、服務器與存儲設備之間的數(shù)據(jù)傳輸不需要主機CPU的參與。

InfiniBand使用I/O通道進行數(shù)據(jù)傳輸,每個I/O通道提供虛擬的NICHCA語義。InfiniBand提供了多種技術(shù)方案,每個端口的速度可以有10GB/s、40GB/s56GB/s、100GB/s,截止目前已經(jīng)達到了200GB/s。InfiniBand使用同軸電纜和光纖進行連接。

2.4.3.2.RoCE

RDMA首先從InfiniBand規(guī)范和產(chǎn)品里引入工業(yè)界,但是目前在企業(yè)界部署著大量基于以太網(wǎng)的產(chǎn)品,因此IBTA規(guī)范組織又定義了一套字符規(guī)范,使得RDMA不僅可以在infiniBand網(wǎng)絡上運行,同時也可以在以太網(wǎng)上運行。

RoCE是基于以太網(wǎng)(Ethernet)的RDMA技術(shù)標準,它也是由IBTA組織指定的。

RoCE為以太網(wǎng)提供了RDMA語義,并不需要復雜低效的TCP傳輸(IWARP需要)。

RoCE是現(xiàn)在最有效的以太網(wǎng)低延遲方案。它消耗很少的CPU負載,在數(shù)據(jù)中心橋接以太網(wǎng)中利用優(yōu)先流控制(PFC)來達到網(wǎng)絡的無損連接。

RoCE 有兩個版本,RoCE v1是一種鏈路層協(xié)議,允許在同一個廣播域下的任意兩臺主機直接訪問。RoCE v2是一種Internet層協(xié)議,即可以實現(xiàn)路由功能。

雖然RoCE協(xié)議這些好處都是基于融合以太網(wǎng)的特性,但是RoCE協(xié)議也可以使用在傳統(tǒng)以太網(wǎng)網(wǎng)絡或者非融合以太網(wǎng)絡中。

2.4.3.3.iWARP

這是一種基于 TCP RDMA 網(wǎng)絡協(xié)議,它利用了 TCP 的可靠性來實現(xiàn)遠程內(nèi)存訪問,能夠在現(xiàn)有的 TCP/IP 網(wǎng)絡基礎上部署 RDMA 技術(shù),具有良好的兼容性和廣泛的適用性。

然而,由于 TCP 協(xié)議本身的一些特性,如在大型組網(wǎng)情況下,大量的 TCP 連接會占用較多的內(nèi)存資源,對系統(tǒng)規(guī)格要求相對較高。不過,在一些對網(wǎng)絡兼容性要求較高,且數(shù)據(jù)傳輸量相對較小、對延遲不太敏感的場景中,iWARP 協(xié)議仍然具有一定的優(yōu)勢,例如:一些企業(yè)內(nèi)部的小型網(wǎng)絡環(huán)境或者對成本控制較為嚴格的場景。

3.       RDMA編程詳解

3.1.    傳輸操作

RDMA有兩種基本操作,包括Memory verbsMessaging verbs。

3.1.1.     Memory verbs

包括read、writeatomic操作。不管是 RDMA 還是 RDMA ,遠程主機都不會意識到操作正在執(zhí)行(除了權(quán)限和相關(guān)資源的準備操作)。

3.1.2.     RDMA Read

從遠程主機讀取部分內(nèi)存。調(diào)用者指定遠程虛擬地址,像本地內(nèi)存地址一樣用來拷貝。

在執(zhí)行 RDMA 讀操作之前,遠程主機必須提供適當?shù)臋?quán)限來訪問它的內(nèi)存。一旦權(quán)限設置完成,RDMA 讀操作就可以在對遠程主機沒有任何通知的條件下執(zhí)行。

3.1.3.     RDMA Write

RDMA Read類似,只是數(shù)據(jù)寫到遠端主機中。RDMA寫操作在執(zhí)行時不通知遠程主機

然而帶即時數(shù)RDMA寫操作會將即時數(shù)通知給遠程主機。

3.1.4.     RDMA Atomic

包括:原子取、原子加、原子比較和原子交換,屬于RDMA原子操作的擴展。

3.2.    Messaging verbs

包括sendreceive操作。

3.2.1.     RDMA Send

發(fā)送操作允許你把數(shù)據(jù)發(fā)送到遠程 QP 的接收隊列里。接收端必須已經(jīng)事先注冊好了用來接收數(shù)據(jù)的緩沖區(qū)。

發(fā)送者無法控制數(shù)據(jù)在遠程主機中的放置位置??蛇x擇是否使用即時數(shù),一個4位的即時數(shù)可以和數(shù)據(jù)緩沖一起被傳送。這個即時數(shù)發(fā)送到接收端是作為接收的通知,不包含在數(shù)據(jù)緩沖之中。

3.2.2.     RDMA Receive

這是與發(fā)送操作相對應的操作。接收主機被告知接收到數(shù)據(jù)緩沖,還可能附帶一個即時數(shù)。接收端應用程序負責接收緩沖區(qū)的維護和發(fā)布。

3.3.    傳輸模式

按照“連接”和“可靠”兩個標準,可以劃分出四種不同的傳輸模式:

3.3.1.     可靠連接(RC):

一個QP只和另一個QP相連,消息通過一個QP的發(fā)送隊列可靠地傳輸?shù)搅硪粋€QP的接收隊列。

數(shù)據(jù)包按序交付,RC連接很類似于TCP連接。

3.3.2.     不可靠連接(UC):

一個QP只和另一個QP相連,連接是不可靠的,所以數(shù)據(jù)包可能有丟失。

傳輸層出錯的消息不會進行重傳,錯誤處理必須由高層的協(xié)議來進行。

3.3.3.     不可靠數(shù)據(jù)報(UD):

一個 QP 可以和其它任意的 UD QP 進行數(shù)據(jù)傳輸和單包數(shù)據(jù)的接收。

不保證按序性和交付性。交付的數(shù)據(jù)包可能被接收端丟棄。

支持多播消息(一對多)。UD連接很類似于UDP連接。

3.4.    RDMA的編程接口

RDMA 的編程接口主要包括: Verbs API RDMA CMConnection ManagerAPI 等,其中:Verbs API 提供了一套完整的 RDMA 操作函數(shù),是實現(xiàn) RDMA 功能的關(guān)鍵所在。

在使用 Verbs API 進行編程時,首先,需要進行設備查詢和初始化操作,例如使用ibv_get_device_list函數(shù)獲取系統(tǒng)中的 RDMA 設備列表。然后,選擇合適的設備并通過ibv_open_device函數(shù)打開設備,獲取設備上下文ibv_context)。這一步是后續(xù)所有操作的基礎,只有正確地獲取并初始化設備,才能進行后續(xù)的內(nèi)存注冊、隊列對創(chuàng)建等操作。

內(nèi)存注冊是通過ibv_reg_mr函數(shù)來實現(xiàn)的,它將內(nèi)存塊固定(防止被交換出)并返回一個包含uint32_t鍵(key)的ibv_mr結(jié)構(gòu)體指針,這個key允許遠程訪問注冊的內(nèi)存,同時該結(jié)構(gòu)體還包含了內(nèi)存區(qū)域的上下文(context)、地址(addr)、長度(length)等信息,這些信息在后續(xù)的數(shù)據(jù)傳輸操作中起著重要作用。

隊列對(Queue Pair的創(chuàng)建和管理也是使用 Verbs API 的重要部分。首先,需要使用ibv_alloc_pd函數(shù)分配一個保護域Protection Domain),然后通過ibv_create_cq函數(shù)創(chuàng)建完成隊列Completion Queue),并使用ibv_create_qp函數(shù)創(chuàng)建隊列對,包括:發(fā)送隊列(Send Queue 接收隊列(Receive Queue)。在創(chuàng)建隊列對時,需要配置一些參數(shù),如:隊列的深度、服務級別等,以滿足不同的應用需求。

數(shù)據(jù)發(fā)送和接收,則是通過ibv_post_sendibv_post_recv函數(shù)來完成的。

對于發(fā)送操作,需要先,構(gòu)建一個ibv_send_wr結(jié)構(gòu)體,設置好操作碼(opcode、工作隊列元素列表(sg_list)、遠程地址(remote_addr)、遠程鍵(rkey)等參數(shù);然后,將其提交到發(fā)送隊列中。

接收操作類似,構(gòu)建ibv_recv_wr結(jié)構(gòu)體并提交到接收隊列中。當操作完成后,完成隊列中會生成相應的完成隊列元素(Completion Queue ElementCQE,通過輪詢完成隊列可以獲取操作的完成狀態(tài)和結(jié)果信息。

以下是一個簡單的偽代碼示例,展示了如何使用 Verbs API 進行 RDMA 數(shù)據(jù)傳輸:

#include <infiniband/verbs.h>

// 全局變量定義
struct ibv_context *ctx;
struct ibv_pd *pd;
struct ibv_mr *mr;
struct ibv_qp *qp;
struct ibv_cq *cq;

// 初始化RDMA資源
void init_rdma() {
    // 查詢RDMA設備
    struct ibv_device **dev_list = ibv_get_device_list(NULL);
    if (!dev_list) {
        perror("Failed to get RDMA device list");
        exit(1);
    }
    ctx = ibv_open_device(dev_list[0]);
    if (!ctx) {
        perror("Failed to open RDMA device");
        exit(1);
    }
    // 創(chuàng)建保護域
    pd = ibv_alloc_pd(ctx);
    if (!pd) {
        perror("Failed to allocate protection domain");
        exit(1);
    }
    // 注冊內(nèi)存區(qū)域
    char *buf = malloc(1024);
    mr = ibv_reg_mr(pd, buf, 1024, IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_READ);
    if (!mr) {
        perror("Failed to register memory region");
        exit(1);
    }
    // 創(chuàng)建完成隊列
    cq = ibv_create_cq(ctx, 10, NULL, NULL, 0);
    if (!cq) {
        perror("Failed to create completion queue");
        exit(1);
    }
    // 創(chuàng)建隊列對
    struct ibv_qp_init_attr qp_attr = {
      .send_cq = cq,
      .recv_cq = cq,
      .cap = {
          .max_send_wr = 10,
          .max_recv_wr = 10,
          .max_send_sge = 1,
          .max_recv_sge = 1
       },
      .qp_type = IBV_QPT_RC
    };
    qp = ibv_create_qp(pd, &qp_attr);
    if (!qp) {
        perror("Failed to create queue pair");
        exit(1);
    }
}

// 發(fā)送數(shù)據(jù)
void send_data() {
    struct ibv_send_wr wr, *bad_wr;
    struct ibv_sge sge;
    memset(&wr, 0, sizeof(wr));
    memset(&sge, 0, sizeof(sge));
    sge.addr = (uint64_t)mr->addr;
    sge.length = 1024;
    sge.lkey = mr->lkey;
    wr.sg_list = &sge;
    wr.num_sge = 1;
    wr.opcode = IBV_WR_RDMA_WRITE;
    // 設置遠程地址和鍵(假設已獲?。?/span>
    wr.wr.rdma.remote_addr = remote_addr;
    wr.wr.rdma.rkey = remote_rkey;
    if (ibv_post_send(qp, &wr, &bad_wr)) {
        perror("Failed to post send");
        exit(1);
    }
}

// 接收數(shù)據(jù)
void receive_data() {
    struct ibv_recv_wr wr, *bad_wr;
    struct ibv_sge sge;
    memset(&wr, 0, sizeof(wr));
    memset(&sge, 0, sizeof(sge));
    sge.addr = (uint64_t)mr->addr;
    sge.length = 1024;
    sge.lkey = mr->lkey;
    wr.sg_list = &sge;
    wr.num_sge = 1;
    if (ibv_post_recv(qp, &wr, &bad_wr)) {
        perror("Failed to post receive");
        exit(1);
    }
}

// 輪詢完成隊列獲取完成事件
void poll_cq() {
    struct ibv_wc wc;
    while (ibv_poll_cq(cq, 1, &wc)) {
        if (wc.status == IBV_WC_SUCCESS) {
            // 處理完成事件
            printf("RDMA operation completed successfully\n");
        } else {
            perror("RDMA operation failed");
        }
    }
}

// 釋放RDMA資源
void cleanup() {
    ibv_dereg_mr(mr);
    ibv_destroy_qp(qp);
    ibv_destroy_cq(cq);
    ibv_dealloc_pd(pd);
    ibv_close_device(ctx);
}

在上述代碼中,

首先通過init_rdma函數(shù)完成了 RDMA 設備的查詢、打開,以及保護域、內(nèi)存區(qū)域、完成隊列和隊列對的創(chuàng)建等初始化操作。

然后,send_data函數(shù)用于向遠程節(jié)點發(fā)送數(shù)據(jù),receive_data函數(shù)用于接收遠程節(jié)點發(fā)送的數(shù)據(jù),poll_cq函數(shù)則通過輪詢完成隊列來獲取操作的完成狀態(tài)信息。

最后,cleanup函數(shù)用于釋放之前分配的 RDMA 資源,確保程序的正確退出和資源的有效回收。

通過這些函數(shù)的組合使用,開發(fā)者可以在應用程序中充分利用 RDMA 技術(shù)的優(yōu)勢,實現(xiàn)高效的遠程數(shù)據(jù)傳輸和處理,提高系統(tǒng)的整體性能和響應速度。

3.5.    內(nèi)存注冊與隊列對

內(nèi)存注冊是 RDMA 操作的重要前提。由于 RDMA 硬件對用于數(shù)據(jù)傳輸?shù)膬?nèi)存有特殊要求,在數(shù)據(jù)傳輸過程中,應用程序不能修改數(shù)據(jù)所在的內(nèi)存,操作系統(tǒng)也不能對其進行 page out 操作,即“物理地址”和“虛擬地址”的映射必須固定不變。而且,無論是 DMA 還是RDMA 都要求物理地址連續(xù),這是由 DMA 引擎所決定的。

內(nèi)存注冊的過程是通過創(chuàng)建兩個鍵(localremote)指向需要操作的內(nèi)存區(qū)域來實現(xiàn)的。注冊的鍵是數(shù)據(jù)傳輸請求的一部分,注冊一個Memory Region(內(nèi)存區(qū)域)后,該區(qū)域會具有一些屬性,如:上下文(context)、地址(addr)、長度(length)、本地鍵(lkey)和遠程鍵(rkey)等。只有將要操作的內(nèi)存注冊到 RDMA 內(nèi)存區(qū)域中,這塊內(nèi)存才能交給 RDMA 保護域來操作,之后便可以對該內(nèi)存進行 RDMA 操作,只要保證接收方的緩沖區(qū)接收長度大于等于發(fā)送方的緩沖區(qū)長度即可。

隊列對(Queue PairQP)在RDMA 通信中起著關(guān)鍵的調(diào)度作用。它由發(fā)送隊列(Send Queue,SQ)和接收隊列(Receive Queue,RQ)組成,任何通信過程都要有收發(fā)兩端,QP 就是這兩個隊列的組合。發(fā)送隊列專門用來存放發(fā)送任務,接收隊列專門用來存放接收任務。在一次 SEND - RECV 流程中,發(fā)送端需要把表示一次發(fā)送任務的工作隊列元素Work Queue Element,WQE)放到發(fā)送隊列中,接收端軟件則需要給硬件下發(fā)一個表示接收任務的 WQE,這樣硬件才知道收到數(shù)據(jù)后放到內(nèi)存中的哪個位置。

完成隊列(Completion QueueCQ)與工作隊列(Work Queue,WQ)緊密配合。CQ中的元素是完成隊列元素(Completion Queue Element,CQE),如果說工作隊列元素(Work Queue Element,WQE)是軟件下發(fā)給硬件的 “任務書”,那么 CQE 就是硬件完成任務之后返回給軟件的 “任務報告”。CQE 中描述了某個任務是被正確無誤地執(zhí)行,還是遇到了錯誤,如果遇到錯誤,還會說明錯誤的原因。每個 CQE 都包含某個 WQE 的完成信息,當發(fā)送端或接收端的硬件完成任務后,會生成 CQE 并放置到 CQ 中,上層應用通過輪詢 CQ 來獲取任務的完成信息,從而得知數(shù)據(jù)傳輸?shù)臓顟B(tài)和結(jié)果,以便進行后續(xù)的處理操作。

為了更清晰地展示數(shù)據(jù)傳輸過程中各組件的交互關(guān)系,以下是一個簡單的序列圖

@startuml
actor
發(fā)送端應用程序 as SenderApp
actor
接收端應用程序 as ReceiverApp
participant
發(fā)送端硬件 as SenderHW
participant
接收端硬件 as ReceiverHW
participant
發(fā)送隊列 as SendQueue
participant
接收隊列 as ReceiveQueue
participant
完成隊列 as CompletionQueue

SenderApp -> SendQueue:
提交發(fā)送任務(WQE)
SendQueue -> SenderHW:
通知有任務
SenderHW ->
發(fā)送端內(nèi)存: 讀取數(shù)據(jù)
SenderHW -> ReceiverHW:
發(fā)送數(shù)據(jù)
ReceiverHW ->
接收端內(nèi)存: 寫入數(shù)據(jù)
ReceiverHW -> ReceiveQueue:
放置接收完成信息
ReceiverApp -> ReceiveQueue:
輪詢接收完成情況
SenderHW -> CompletionQueue:
放置發(fā)送完成信息(CQE)
SenderApp -> CompletionQueue:
輪詢發(fā)送完成情況
@enduml

在這個序列圖中,發(fā)送端應用程序?qū)l(fā)送任務的 WQE 提交到發(fā)送隊列,發(fā)送隊列通知發(fā)送端硬件有任務待處理,發(fā)送端硬件從內(nèi)存讀取數(shù)據(jù)并發(fā)送給接收端硬件,接收端硬件將數(shù)據(jù)寫入內(nèi)存后,在接收隊列放置接收完成信息,同時在完成隊列放置發(fā)送完成信息,發(fā)送端和接收端應用程序通過輪詢相應隊列來獲取任務完成情況,從而實現(xiàn)了 RDMA 數(shù)據(jù)的可靠傳輸和任務的協(xié)調(diào)調(diào)度。

這種通過隊列對和完成隊列的協(xié)同工作機制,使得 RDMA 能夠高效地進行數(shù)據(jù)傳輸,充分發(fā)揮其低延遲、高帶寬的優(yōu)勢,滿足各種對網(wǎng)絡性能要求苛刻的應用場景的需求。

4.       RDMA的應用領域

4.1.    數(shù)據(jù)中心網(wǎng)絡的變革

在大規(guī)模數(shù)據(jù)中心中,RDMA 技術(shù)正發(fā)揮著至關(guān)重要的作用,深刻改變著服務器間的通信模式。傳統(tǒng)的 TCP/IP 通信方式在數(shù)據(jù)中心的海量數(shù)據(jù)傳輸場景下,往往顯得力不從心,存在著高延遲、低帶寬利用率以及 CPU 資源消耗大等問題。而 RDMA 技術(shù)的出現(xiàn),猶如一場及時雨,為這些問題提供了有效的解決方案。

云存儲服務為例,當用戶請求從云端下載或上傳大量數(shù)據(jù)時,使用RDMA 技術(shù)可以顯著加速數(shù)據(jù)的傳輸過程。在一個擁有數(shù)千臺服務器的大型數(shù)據(jù)中心中,采用 RDMA 技術(shù)的云存儲系統(tǒng),其數(shù)據(jù)傳輸速度相比傳統(tǒng)方式可提升數(shù)倍甚至更高。這意味著用戶能夠更快地獲取所需的數(shù)據(jù),大大提高了用戶體驗。同時,對于數(shù)據(jù)中心的運營者來說,這也意味著能夠在相同的時間內(nèi)處理更多的用戶請求,從而提高了服務的效率和競爭力。

分布式數(shù)據(jù)庫系統(tǒng)中,RDMA 同樣展現(xiàn)出了強大的優(yōu)勢。在進行大規(guī)模數(shù)據(jù)的分布式查詢和事務處理時,RDMA 技術(shù)能夠?qū)崿F(xiàn)服務器之間的高速數(shù)據(jù)交互,大大降低了數(shù)據(jù)傳輸?shù)难舆t。這使得數(shù)據(jù)庫系統(tǒng)能夠更快速地響應復雜的查詢請求,提高了事務處理的效率和并發(fā)能力。例如,在一些大型電商平臺的訂單處理系統(tǒng)中,RDMA 技術(shù)的應用使得訂單的查詢和處理速度得到了顯著提升,能夠在高并發(fā)的情況下依然保持穩(wěn)定的性能,確保了平臺的高效運行。

此外,在應對數(shù)據(jù)中心內(nèi)部的海量數(shù)據(jù)遷移和備份場景時,RDMA 技術(shù)也能夠發(fā)揮其高帶寬、低延遲的優(yōu)勢,大大縮短數(shù)據(jù)遷移和備份的時間窗口,減少對業(yè)務的影響,提高數(shù)據(jù)中心的整體可靠性和可用性。

4.2.    高性能計算的得力助手

在高性能計算(HPC)領域,RDMA技術(shù)已經(jīng)成為不可或缺的關(guān)鍵技術(shù)之一,為科學研究和工程計算等領域的發(fā)展提供了強大的動力。

在氣象模擬領域,科學家們需要處理海量的氣象數(shù)據(jù),并進行復雜的數(shù)值計算,以預測天氣變化和氣候趨勢。傳統(tǒng)的網(wǎng)絡通信方式往往無法滿足這種大規(guī)模數(shù)據(jù)處理和高速計算的需求,而 RDMA 技術(shù)的應用則帶來了顯著的改變。通過 RDMA,計算節(jié)點之間能夠?qū)崿F(xiàn)高速的數(shù)據(jù)共享和交互,大大縮短了數(shù)據(jù)傳輸?shù)臅r間,從而加速了整個氣象模擬的計算進程。例如,在一個全球氣候模擬項目中,使用 RDMA 技術(shù)后,數(shù)據(jù)傳輸?shù)难舆t降低了數(shù)倍,使得模擬計算的效率得到了大幅提升,原本需要數(shù)周甚至數(shù)月才能完成的模擬任務,現(xiàn)在能夠在更短的時間內(nèi)得到結(jié)果,為氣象研究提供了更及時、準確的支持。

在基因測序領域,RDMA 同樣發(fā)揮著重要作用?;驕y序會產(chǎn)生海量的基因數(shù)據(jù),對這些數(shù)據(jù)的分析和處理需要強大的計算能力和高效的數(shù)據(jù)傳輸能力。RDMA 技術(shù)使得基因測序設備與計算節(jié)點之間能夠快速傳輸數(shù)據(jù),減少了數(shù)據(jù)傳輸?shù)钠款i,提高了測序數(shù)據(jù)的處理速度。這不僅有助于加速科研項目的進展,例如在癌癥基因研究、遺傳疾病診斷等方面,能夠更快速地分析基因數(shù)據(jù),為疾病的診斷和治療提供更有力的依據(jù),而且也為基因技術(shù)在醫(yī)學、農(nóng)業(yè)等領域的廣泛應用奠定了基礎。

許多科研機構(gòu)和企業(yè)在其高性能計算集群中廣泛應用 RDMA 技術(shù),取得了顯著的性能提升和科研成果加速的效果。例如,某知名科研機構(gòu)在其超級計算機上采用 RDMA 技術(shù)后,在一系列復雜的科學計算任務中,計算效率提高了 30% 以上,使得原本需要耗費大量時間和資源的科研項目能夠更快地取得突破,推動了相關(guān)學科的發(fā)展和技術(shù)的進步。

4.3.    分布式存儲系統(tǒng)的優(yōu)化

在分布式存儲系統(tǒng)中,RDMA 技術(shù)的應用為數(shù)據(jù)的高效存儲和快速訪問提供了有力保障。

傳統(tǒng)的分布式存儲架構(gòu)在數(shù)據(jù)讀寫過程中,往往需要經(jīng)過多個中間節(jié)點的處理和數(shù)據(jù)復制,這會導致較高的延遲和較低的讀寫性能。而 RDMA 技術(shù)的出現(xiàn),使得存儲節(jié)點和計算節(jié)點之間能夠直接進行快速的數(shù)據(jù)傳輸,繞過了中間節(jié)點的繁瑣處理,大大減少了數(shù)據(jù)復制和中間節(jié)點處理的開銷。

CephGlusterFS等分布式存儲系統(tǒng)為例,當計算節(jié)點需要從存儲節(jié)點讀取大量數(shù)據(jù)時,RDMA 技術(shù)能夠?qū)崿F(xiàn)數(shù)據(jù)的直接內(nèi)存訪問,避免了傳統(tǒng)方式下數(shù)據(jù)在多個層次之間的拷貝和協(xié)議棧的處理,從而顯著提高了數(shù)據(jù)讀取的速度。在實際的應用場景中,如大規(guī)模的視頻存儲和在線播放平臺,使用 RDMA 技術(shù)的分布式存儲系統(tǒng)能夠更快地響應用戶的播放請求,減少視頻的緩沖時間,提升用戶的觀看體驗。

在數(shù)據(jù)寫入方面,RDMA 同樣表現(xiàn)出色。例如,在一些對數(shù)據(jù)寫入速度要求極高的大數(shù)據(jù)存儲場景中,如實時數(shù)據(jù)采集和存儲系統(tǒng),RDMA 技術(shù)能夠確保數(shù)據(jù)快速、準確地寫入存儲節(jié)點,提高了存儲系統(tǒng)的寫入性能和響應速度,保證了數(shù)據(jù)的及時性和完整性。

此外,RDMA 技術(shù)還能夠提高分布式存儲系統(tǒng)的可靠性和可用性。通過減少中間節(jié)點的故障點,以及快速的數(shù)據(jù)恢復和同步能力,RDMA 技術(shù)使得分布式存儲系統(tǒng)在面對節(jié)點故障或網(wǎng)絡異常時,能夠更快速地進行數(shù)據(jù)的冗余備份和恢復,確保數(shù)據(jù)的安全性和可用性,為企業(yè)的關(guān)鍵業(yè)務數(shù)據(jù)提供了更可靠的存儲解決方案。

5.       RDMA通信過程

為了執(zhí)行 RDMA 操作,首選需要建立與遠程主機的連接和適當?shù)恼J證。實現(xiàn)這些的機制是隊列對(QP 。與標準的 IP 協(xié)議棧類似,一個 QP 大概等同于一個接字(socket。QP 需要在連接兩端進行初始化。連接管理器(CM)用來在 QP 建立之前進行 QP 信息的交換。一旦一個 QP 建立起來, verbs API 就可以用來執(zhí)行 RDMA /寫和原子操作。與套接字的讀/寫類似的連續(xù)收/發(fā)操作也能執(zhí)行。

RDMA的操作過程大致如下:

1.      當一個應用程執(zhí)行度或者寫請求時,不執(zhí)行任何數(shù)據(jù)復制,再不需要任何內(nèi)核參與的條件下,RDMA請求從用戶空間中的應用發(fā)送到本地NIC網(wǎng)卡。

2.      NIC讀取緩沖區(qū)的內(nèi)容,并通過網(wǎng)絡傳輸?shù)竭h程NIC。

3.      在網(wǎng)絡上傳輸?shù)?/span>RDMA信息包括虛擬地址、內(nèi)存鑰匙和數(shù)據(jù)本身。請求既可以完全在用戶空間中處理,又或者在應用一直睡眠到請求完成時的情況下通過系統(tǒng)級中斷處理。RDMA操作使應用可以從一個遠程應用的內(nèi)存中讀取數(shù)據(jù)或向這個內(nèi)存中寫數(shù)據(jù)。

4.      目標NIC確認內(nèi)存鑰匙,直接將數(shù)據(jù)寫入應用緩存中,用于操作的遠程虛擬內(nèi)存地址包含在RDMA信息中。

RDMA操作中,Read/Write是單邊操作,秩序本地端明確信息的源和目的地址,遠端應用不必感知此次通信,數(shù)據(jù)的讀或?qū)懚纪ㄟ^RDMARNIC與應用Buffer之間完成,再由遠端RNIC封裝成消息返回到本地端。Send/Receive是雙邊操作,即必須要遠端的應用感知參與才能完成收發(fā),在實際中,Send/Receive多用于連接控制類報文,而數(shù)據(jù)報文是通過Read/Write來完成的

5.1.    單向通信-Read

 

1.     首先A、B建立連接,QP已經(jīng)創(chuàng)建并初始化。

2.     數(shù)據(jù)被存檔在Bbuffer,地址為VB,注意VB是提前注冊到BRNIC,并且它是一個Memory Region,并拿到返回的local key,相當于RDMA操作這塊buffer的權(quán)限。

3.     B把數(shù)據(jù)地址VB,key封裝到專用報文傳送到A,這相當于B把數(shù)據(jù)buffer的操作權(quán)交給了A。同時B在他的WQ中注冊一個WR,用于接收數(shù)據(jù)傳輸?shù)?/span>A返回的狀態(tài)。

4.     A在收到B發(fā)送過來的數(shù)據(jù)地址VBR_key之后,RNIC會把它們連同本地存儲數(shù)據(jù)的地址VA封裝到Read請求中,將這個請求消息發(fā)送到B,這個過程A、B兩端不需任何軟件參與,就可以將B中的數(shù)據(jù)存儲到AVA虛擬地址。

5.     A在存儲完成后,向B返回數(shù)據(jù)傳輸?shù)臓顟B(tài)信息。

5.2.    單向通信-Write

1.     首先A、B建立連接,QP已經(jīng)創(chuàng)建并初始化。

2.     數(shù)據(jù)遠端的目標存儲空間buffer的地址為VB,注意VB是提前注冊到BRNIC,并且它是一個Memory Region,并拿到返回的local key,相當于RDMA操作這塊buffer的權(quán)限。

3.     B把數(shù)據(jù)地址VBkey封裝到專用報文傳送到A,這相當于B把數(shù)據(jù)buffer的操作權(quán)交給了A。同時B在他的WQ中注冊一個WR,用于接收數(shù)據(jù)傳輸?shù)?/span>A返回的狀態(tài)。

4.     A在收到B發(fā)送過來的數(shù)據(jù)地址VBR_key之后,RNIC會把它們連同本地存儲數(shù)據(jù)的地址VA封裝到Write請求中,這個過程A、B兩端不需任何軟件參與,就可以將A中的數(shù)據(jù)存儲到BVB虛擬地址。

5.     A在發(fā)送數(shù)據(jù)完成后,向B返回數(shù)據(jù)傳輸?shù)臓顟B(tài)信息。

5.3.    雙向通信-Send\Recv

 

1.     首先,AB都要創(chuàng)建并初始化好各自的QP、CQ。

2.     AB分別向自己的WQ中注冊WQE,對于A來說,WQ=SQ,WQE描述指向一個等待被發(fā)送的數(shù)據(jù);對于B,WQ=RQ,WQE描述指向一塊用于存儲數(shù)據(jù)的Buffer。

3.     ARNIC異步調(diào)度輪到AWQE,解析到這是一個Send消息,從Buffer中直接向B發(fā)送數(shù)據(jù)。數(shù)據(jù)流到達BRNIC后,BWQE被消耗,并把數(shù)據(jù)直接存儲到WQE指向的存儲位置。

4.     AB通信完成后,ACQ中會產(chǎn)生一個完成消息CQE表示發(fā)送完成。同時,BCQ中會產(chǎn)生一個完成消息CQE表示接收完成。每個WQ中的WQE的處理完成都會產(chǎn)生一個CQE。

6.       全文總結(jié)

RDMA 技術(shù)作為現(xiàn)代網(wǎng)絡通信領域的一項關(guān)鍵技術(shù),以其獨特的直接內(nèi)存訪問、零拷貝和內(nèi)核旁路等特性,有效地解決了傳統(tǒng)網(wǎng)絡通信中的高延遲、低帶寬利用率以及 CPU 資源消耗大等問題,為眾多對網(wǎng)絡性能要求苛刻的應用場景提供了高效、可靠的數(shù)據(jù)傳輸解決方案。

從數(shù)據(jù)中心的大規(guī)模數(shù)據(jù)處理與存儲,到高性能計算領域的科學研究和工程計算,再到分布式存儲系統(tǒng)的優(yōu)化,RDMA 技術(shù)都展現(xiàn)出了強大的優(yōu)勢和巨大的應用潛力,推動了各行業(yè)的技術(shù)進步和業(yè)務創(chuàng)新,成為推動現(xiàn)代信息技術(shù)發(fā)展的重要力量。

盡管目前 RDMA 技術(shù)在實際應用中還面臨著網(wǎng)絡環(huán)境穩(wěn)定性要求高、硬件成本相對較高以及技術(shù)普及難度較大等挑戰(zhàn),但隨著網(wǎng)絡優(yōu)化技術(shù)的不斷發(fā)展、硬件成本的逐漸下降以及開源社區(qū)和行業(yè)標準的持續(xù)推動,這些問題正在逐步得到解決。

展望未來,RDMA 技術(shù)有望在硬件性能提升、應用領域拓展以及與其他新興技術(shù)融合等方面取得更多的突破和發(fā)展,為網(wǎng)絡通信和計算領域帶來更多的創(chuàng)新和機遇,持續(xù)推動各行業(yè)數(shù)字化轉(zhuǎn)型和智能化升級,其在未來信息技術(shù)領域的重要性和影響力也將不斷提升,值得我們持續(xù)關(guān)注和深入探索其更多的應用可能性。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多