打破網絡傳輸瓶頸,一文看懂RDMA技術
你有沒有過這樣的困惑:服務器 CPU、GPU 性能明明拉滿,可數據在節點間傳輸時卻總 “掉鏈子”?用 100G 網卡傳數據,實際速率連一半都跑不到;AI 訓練時,GPU 等著參數同步卻 “無事可做”;分布式存儲里,遠程讀寫延遲比本地高好幾倍 —— 這些問題的根源,大多藏在傳統 TCP/IP 通信的 “低效” 里。
傳統網絡傳輸要經過 “用戶態→內核態→網卡” 的多輪數據拷貝,還得靠 CPU 處理協議棧,不僅占滿計算資源,延遲還居高不下。而 RDMA(遠程直接內存訪問)恰恰是解決這個痛點的 “利器”:它能讓網卡直接訪問遠程服務器內存,繞開 CPU 和內核,實現 “零拷貝”“低延遲” 傳輸。今天這篇就從基礎原理、實現方式到應用場景,用最通俗的語言拆解 RDMA,不管你是開發、運維還是技術選型,都能搞懂這門讓數據 “飛起來” 的關鍵技術。
一、RDMA簡介
1.1RDMA 是何方神圣?
RDMA,全稱遠程直接數據存取(Remote Direct Memory Access),是一種創新性的網絡通信技術。在傳統網絡通信模式下,數據傳輸往往需要經過操作系統及多層軟件協議棧的處理,這會導致大量的 CPU 資源被占用,數據傳輸延遲較高。而 RDMA 技術的出現,旨在解決這些問題,它能夠讓計算機直接訪問遠程計算機的內存,而無需在本地和遠程計算機之間進行繁瑣的數據復制,從而顯著降低數據傳輸的延遲,提高數據處理效率,這使得它在現代網絡通信中占據著至關重要的地位,尤其在對網絡性能要求極高的領域,如高性能計算(HPC)、數據中心、云計算等,發揮著不可或缺的作用。
1.2技術背景
(1)傳統網絡通信的困境
在深入探討 RDMA 技術之前,我們先來了解一下傳統網絡通信存在的問題。以常見的 TCP/IP 通信模式為例,當數據在網絡中傳輸時,需要經過操作系統內核以及多層軟件協議棧的處理。這一過程會涉及到多次的數據拷貝和上下文切換,從而導致較高的延遲和大量的 CPU 資源消耗。
具體來說,當發送端應用程序要發送數據時,數據首先會從用戶空間的緩沖區拷貝到內核空間的緩沖區,然后經過協議棧的封裝,再通過網卡發送出去。在接收端,數據則需要從網卡接收,經過協議棧的解封裝,再從內核空間拷貝到用戶空間的緩沖區,以供應用程序使用。這些數據拷貝和上下文切換操作不僅占用了寶貴的 CPU 時間,還使得數據傳輸的延遲難以降低,尤其是在處理大量小數據塊的傳輸或者對實時性要求較高的應用場景時,傳統網絡通信的這些問題就顯得更加突出,嚴重影響了系統的整體性能和響應速度。傳統的 TCP/IP 網絡通信,數據需要通過用戶空間發送到遠程機器的用戶空間,在這個過程中需要經歷若干次內存拷貝:
圖片

如上圖,在傳統模式下,兩臺服務器上的應用之間傳輸數據,過程是這樣的:
- 首先要把數據從應用緩存拷貝到Kernel中的TCP協議棧緩存;
- 然后再拷貝到驅動層;
- 最后拷貝到網卡緩存。
多次內存拷貝需要CPU多次介入,導致處理延時大,達到數十微秒。同時整個過程中CPU過多參與,大量消耗CPU性能,影響正常的數據計算。
(2)TCP/IP存在的問題
傳統TCP/IP通信存在的主要問題就是I/O瓶頸問題。在高速網絡環境下與網絡I/O相關的主機處理的高開銷(數據移動操作和復制操作)限制了機器之間的傳輸帶寬。
具體來說,傳統的TCP/IP網絡通信是通過內核發送消息。通過內核來傳輸消息這種機制會導致性能低和靈活性差。
- 性能低的主要原因是:由于網絡通信通過
內核傳遞,需要在內核中頻繁進行協議封裝和解封操作,造成很大的數據移動和數據復制開銷。 - 靈活性差的原因是:是因為網絡通信協議在
內核中進行處理,這種方式很難支持新的網絡協議和新的消息通信協議以及發送和接收接口。
二、RDMA技術的核心原理
RDMA (繞過CPU,數據直接‘傳’到對端內存)為了消除傳統網絡通信帶給計算任務的瓶頸,我們希望更快和更輕量級的網絡通信,由此提出了RDMA技術。RDMA利用 Kernel Bypass 和 Zero Copy技術提供了低延遲的特性,同時減少了CPU占用,減少了內存帶寬瓶頸,提供了很高的帶寬利用率。RDMA提供了給基于 IO 的通道,這種通道允許一個應用程序通過RDMA設備對遠程的虛擬內存進行直接的讀寫。
RDMA 技術有以下幾個特點:
- CPU Offload:無需CPU干預,應用程序可以訪問遠程主機內存而不消耗遠程主機中的任何CPU。遠程主機內存能夠被讀取而不需要遠程主機上的進程(或CPU)參與。遠程主機的CPU的緩存(cache)不會被訪問的內存內容所填充
- Kernel Bypass:RDMA 提供一個專有的 Verbs interface 而不是傳統的TCP/IP Socket interface。應用程序可以直接在用戶態執行數據傳輸,不需要在內核態與用戶態之間做上下文切換
- Zero Copy:每個應用程序都能直接訪問集群中的設備的虛擬內存,這意味著應用程序能夠直接執行數據傳輸,在不涉及到網絡軟件棧的情況下,數據能夠被直接發送到緩沖區或者能夠直接從緩沖區里接收,而不需要被復制到網絡層。
下面是 RDMA 整體框架架構圖,從圖中可以看出,RDMA 提供了一系列 Verbs 接口,可在應用程序用戶空間,操作RDMA硬件。RDMA繞過內核直接從用戶空間訪問RDMA 網卡。RNIC(RDMA 網卡,RNIC(NIC=Network Interface Card ,網絡接口卡、網卡,RNIC即 RDMA Network Interface Card)中包括 Cached Page Table Entry,用來將虛擬頁面映射到相應的物理頁面。
圖片
2.1直接內存訪問機制
RDMA 的核心在于其直接內存訪問機制。在傳統的網絡通信中,數據傳輸需要 CPU 的深度參與,例如數據從應用程序緩沖區拷貝到內核緩沖區,再通過網絡協議棧進行封裝和傳輸,接收端則需要逆向操作,將數據從內核緩沖區拷貝到應用程序緩沖區,整個過程涉及多次數據拷貝和 CPU 上下文切換,效率較低。
而 RDMA 允許計算機直接存取其他計算機的內存,繞過了處理器的繁瑣處理過程,數據傳輸的大部分工作由硬件來執行,直接在遠程系統的內存之間進行讀寫操作,極大地提高了數據傳輸的效率和速度,減少了 CPU 的負擔,使得系統能夠將更多的資源用于實際的數據處理任務,從而提升整體性能。
2.2零拷貝與內核旁路
零拷貝技術是 RDMA 的另一大關鍵特性。在傳統通信模式下,數據在傳輸過程中需要在不同的內存區域之間進行多次拷貝,例如從用戶空間拷貝到內核空間,再從內核空間拷貝到網絡設備緩沖區等,這些拷貝操作不僅消耗 CPU 資源,還會增加數據傳輸的延遲。而 RDMA 實現了零拷貝,使得數據能夠直接在應用程序的緩沖區與網絡之間進行傳輸,無需中間的拷貝環節,大大減少了數據傳輸的開銷和延遲。
內核旁路也是 RDMA 提升性能的重要手段。在傳統網絡通信中,應用程序與網絡設備之間的通信需要經過操作系統內核的干預,這會導致上下文切換和系統調用的開銷。而 RDMA 允許應用程序在用戶態直接與網卡進行交互,避免了內核態與用戶態之間的上下文切換,進一步降低了 CPU 的負擔,提高了數據傳輸的效率和響應速度。例如,在一些對實時性要求極高的金融交易系統中,RDMA 的零拷貝和內核旁路技術能夠確保交易數據的快速傳輸和處理,減少交易延遲,提高交易效率。
2.3RDMA通信協議
目前,有三種支持RDMA的通信技術:
- InfiniBand(IB): 基于 InfiniBand 架構的 RDMA 技術,需要專用的 IB 網卡和 IB 交換機。從性能上,很明顯Infiniband網絡最好,但網卡和交換機是價格也很高。
- RoCE:即RDMA over Ethernet(RoCE), 基于以太網的 RDMA 技術,也是由 IBTA 提出。RoCE支持在標準以太網基礎設施上使用RDMA技術,但是需要交換機支持無損以太網傳輸,只不過網卡必須是支持RoCE的特殊的NIC。
- iWARP:Internet Wide Area RDMA Protocal,基于 TCP/IP 協議的 RDMA 技術(在現有TCP/IP協議棧基礎上實現RDMA技術,在TCP協議上增加一層DDP),由 IETF 標 準定義。iWARP 支持在標準以太網基礎設施上使用 RDMA 技術,而不需要交換機支持無損以太網傳輸,但服務器需要使用支持iWARP 的網卡。與此同時,受 TCP 影響,性能稍差。
這三種技術都可以使用同一套API來使用,但它們有著不同的物理層和鏈路層;需要注意的是,上述幾種協議都需要專門的硬件(網卡)支持。
(1)InfiniBand
InfiniBand(IB)是一種服務器和存儲器的互聯技術,它具有高速、低延遲、低CPU負載、高效率和可擴展的特性。InfiniBand的關鍵特性之一是它天然地支持遠程直接內存訪問(RDMA)。InfiniBand能夠讓服務器與服務器之間、服務器與存儲設備之間的數據傳輸不需要主機CPU的參與。InfiniBand使用I/O通道進行數據傳輸,每個I/O通道提供虛擬的NIC或HCA語義。InfiniBand提供了多種技術方案,每個端口的速度可以有10GB/s、40GB/s、56GB/s、100GB/s,截止目前已經達到了200GB/s。InfiniBand使用同軸電纜和光纖進行連接。
(2)RoCE
RDMA首先從InfiniBand規范和產品里引入工業界,但是目前在企業界部署著大量基于以太網的產品,因此IBTA規范組織又定義了一套字符規范,使得RDMA不僅可以在infiniBand網絡上運行,同時也可以在以太網上運行。RoCE是基于以太網(Ethernet)的RDMA技術標準,它也是由IBTA組織指定的。RoCE為以太網提供了RDMA語義,并不需要復雜低效的TCP傳輸(IWARP需要)。
RoCE是現在最有效的以太網低延遲方案。它消耗很少的CPU負載,在數據中心橋接以太網中利用優先流控制(PFC)來達到網絡的無損連接。RoCE 有兩個版本,RoCE v1是一種鏈路層協議,允許在同一個廣播域下的任意兩臺主機直接訪問。RoCE v2是一種Internet層協議,即可以實現路由功能。雖然RoCE協議這些好處都是基于融合以太網的特性,但是RoCE協議也可以使用在傳統以太網網絡或者非融合以太網絡中。
(3)iWARP
這是一種基于 TCP 的 RDMA 網絡協議,它利用了 TCP 的可靠性來實現遠程內存訪問,能夠在現有的 TCP/IP 網絡基礎上部署 RDMA 技術,具有良好的兼容性和廣泛的適用性。然而,由于 TCP 協議本身的一些特性,如在大型組網情況下,大量的 TCP 連接會占用較多的內存資源,對系統規格要求相對較高。不過,在一些對網絡兼容性要求較高,且數據傳輸量相對較小、對延遲不太敏感的場景中,iWARP 協議仍然具有一定的優勢,例如一些企業內部的小型網絡環境或者對成本控制較為嚴格的場景。
三、RDMA編程詳解
3.1傳輸操作
RDMA有兩種基本操作,包括Memory verbs和Messaging verbs。
(1)Memory verbs:包括read、write和atomic操作。
RDMA Read:從遠程主機讀取部分內存。調用者指定遠程虛擬地址,像本地內存地址一樣用來拷貝。在執行 RDMA 讀操作之前,遠程主機必須提供適當的權限來訪問它的內存。一旦權限設置完成, RDMA 讀操作就可以在對遠程主機沒有任何通知的條件下執行。不管是 RDMA 讀還是 RDMA 寫,遠程主機都不會意識到操作正在執行 (除了權限和相關資源的準備操作)。
RDMA Write:與RDMA Read類似,只是數據寫到遠端主機中。RDMA寫操作在執行時不通知遠程主機。然而帶即時數的RDMA寫操作會將即時數通知給遠程主機。
RDMA Atomic:包括原子取、原子加、原子比較和原子交換,屬于RDMA原子操作的擴展。
(2)Messaging verbs:包括send和receive操作。
RDMA Send:發送操作允許你把數據發送到遠程 QP 的接收隊列里。接收端必須已經事先注冊好了用來接收數據的緩沖 區。發送者無法控制數據在遠程主機中的放置位置。可選擇是否使用即時數,一個4位的即時數可以和數據緩沖一起被傳送。這個即時數發送到接收端是作為接收的通知,不包含在數據緩沖之中。
RDMA Receive:這是與發送操作相對應的操作。接收主機被告知接收到數據緩沖,還可能附帶一個即時數。接收端應用 程序負責接收緩沖區的維護和發布。
3.2傳輸模式
按照連接和可靠兩個標準,可以劃分出四種不同的傳輸模式:
- 可靠連接(RC):一個QP只和另一個QP相連,消息通過一個QP的發送隊列可靠地傳輸到另一個QP的接收隊列。數據包按序交付,RC連接很類似于TCP連接。
- 不可靠連接(UC):一個QP只和另一個QP相連,連接是不可靠的,所以數據包可能有丟失。傳輸層出錯的消息不會進行重傳,錯誤處理必須由高層的協議來進行。
- 不可靠數據報(UD):一個 QP 可以和其它任意的 UD QP 進行數據傳輸和單包數據的接收。不保證按序性和交付性。交付的數據包可能被接收端丟棄。支持多播消息(一對多)。UD連接很類似于UDP連接。
3.3RDMA的編程接口
RDMA 的編程接口主要包括 Verbs API 和 RDMA CM(Connection Manager)API 等,其中 Verbs API 提供了一套完整的 RDMA 操作函數,是實現 RDMA 功能的關鍵所在。
在使用 Verbs API 進行編程時,首先需要進行設備查詢和初始化操作,例如使用ibv_get_device_list函數獲取系統中的 RDMA 設備列表,然后選擇合適的設備并通過ibv_open_device函數打開設備,獲取設備上下文(ibv_context),這一步是后續所有操作的基礎,只有正確地獲取并初始化設備,才能進行后續的內存注冊、隊列對創建等操作。
內存注冊是通過ibv_reg_mr函數來實現的,它將內存塊固定(防止被交換出)并返回一個包含uint32_t鍵(key)的ibv_mr結構體指針,這個key允許遠程訪問注冊的內存,同時該結構體還包含了內存區域的上下文(context)、地址(addr)、長度(length)等信息,這些信息在后續的數據傳輸操作中起著重要作用。
隊列對(Queue Pair)的創建和管理也是使用 Verbs API 的重要部分。首先,需要使用ibv_alloc_pd函數分配一個保護域(Protection Domain),然后通過ibv_create_cq函數創建完成隊列(Completion Queue),并使用ibv_create_qp函數創建隊列對,包括發送隊列(Send Queue)和接收隊列(Receive Queue)。在創建隊列對時,需要配置一些參數,如隊列的深度、服務級別等,以滿足不同的應用需求。
數據發送和接收則是通過ibv_post_send和ibv_post_recv函數來完成的。對于發送操作,需要先構建一個ibv_send_wr結構體,設置好操作碼(opcode)、工作隊列元素列表(sg_list)、遠程地址(remote_addr)、遠程鍵(rkey)等參數,然后將其提交到發送隊列中;接收操作類似,構建ibv_recv_wr結構體并提交到接收隊列中。當操作完成后,完成隊列中會生成相應的完成隊列元素(Completion Queue Element,CQE),通過輪詢完成隊列可以獲取操作的完成狀態和結果信息。
以下是一個簡單的偽代碼示例,展示了如何使用 Verbs API 進行 RDMA 數據傳輸:
#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);
}
// 創建保護域
pd = ibv_alloc_pd(ctx);
if (!pd) {
perror("Failed to allocate protection domain");
exit(1);
}
// 注冊內存區域
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);
}
// 創建完成隊列
cq = ibv_create_cq(ctx, 10, NULL, NULL, 0);
if (!cq) {
perror("Failed to create completion queue");
exit(1);
}
// 創建隊列對
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);
}
}
// 發送數據
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;
// 設置遠程地址和鍵(假設已獲取)
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);
}
}
// 接收數據
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函數完成了 RDMA 設備的查詢、打開,以及保護域、內存區域、完成隊列和隊列對的創建等初始化操作。然后,send_data函數用于向遠程節點發送數據,receive_data函數用于接收遠程節點發送的數據,poll_cq函數則通過輪詢完成隊列來獲取操作的完成狀態信息。最后,cleanup函數用于釋放之前分配的 RDMA 資源,確保程序的正確退出和資源的有效回收。
通過這些函數的組合使用,開發者可以在應用程序中充分利用 RDMA 技術的優勢,實現高效的遠程數據傳輸和處理,提高系統的整體性能和響應速度。
3.4內存注冊與隊列對
內存注冊是 RDMA 操作的重要前提。由于 RDMA 硬件對用于數據傳輸的內存有特殊要求,在數據傳輸過程中,應用程序不能修改數據所在的內存,操作系統也不能對其進行 page out 操作,即物理地址和虛擬地址的映射必須固定不變。而且,無論是 DMA 還是 RDMA 都要求物理地址連續,這是由 DMA 引擎所決定的。
內存注冊的過程是通過創建兩個鍵(local和remote)指向需要操作的內存區域來實現的。注冊的鍵是數據傳輸請求的一部分,注冊一個Memory Region(內存區域)后,該區域會具有一些屬性,如上下文(context)、地址(addr)、長度(length)、本地鍵(lkey)和遠程鍵(rkey)等。只有將要操作的內存注冊到 RDMA 內存區域中,這塊內存才能交給 RDMA 保護域來操作,之后便可以對該內存進行 RDMA 操作,只要保證接收方的緩沖區接收長度大于等于發送方的緩沖區長度即可。
隊列對(Queue Pair,QP)在 RDMA 通信中起著關鍵的調度作用。它由發送隊列(Send Queue,SQ)和接收隊列(Receive Queue,RQ)組成,任何通信過程都要有收發兩端,QP 就是這兩個隊列的組合。發送隊列專門用來存放發送任務,接收隊列專門用來存放接收任務。在一次 SEND - RECV 流程中,發送端需要把表示一次發送任務的工作隊列元素(Work Queue Element,WQE)放到發送隊列中,接收端軟件則需要給硬件下發一個表示接收任務的 WQE,這樣硬件才知道收到數據后放到內存中的哪個位置。
完成隊列(Completion Queue,CQ)與工作隊列緊密配合。CQ 中的元素是完成隊列元素(Completion Queue Element,CQE),如果說 WQE 是軟件下發給硬件的 “任務書”,那么 CQE 就是硬件完成任務之后返回給軟件的 “任務報告”。CQE 中描述了某個任務是被正確無誤地執行,還是遇到了錯誤,如果遇到錯誤,還會說明錯誤的原因。每個 CQE 都包含某個 WQE 的完成信息,當發送端或接收端的硬件完成任務后,會生成 CQE 并放置到 CQ 中,上層應用通過輪詢 CQ 來獲取任務的完成信息,從而得知數據傳輸的狀態和結果,以便進行后續的處理操作。
為了更清晰地展示數據傳輸過程中各組件的交互關系,以下是一個簡單的序列圖:
@startuml
actor 發送端應用程序 as SenderApp
actor 接收端應用程序 as ReceiverApp
participant 發送端硬件 as SenderHW
participant 接收端硬件 as ReceiverHW
participant 發送隊列 as SendQueue
participant 接收隊列 as ReceiveQueue
participant 完成隊列 as CompletionQueue
SenderApp -> SendQueue: 提交發送任務(WQE)
SendQueue -> SenderHW: 通知有任務
SenderHW -> 發送端內存: 讀取數據
SenderHW -> ReceiverHW: 發送數據
ReceiverHW -> 接收端內存: 寫入數據
ReceiverHW -> ReceiveQueue: 放置接收完成信息
ReceiverApp -> ReceiveQueue: 輪詢接收完成情況
SenderHW -> CompletionQueue: 放置發送完成信息(CQE)
SenderApp -> CompletionQueue: 輪詢發送完成情況
@enduml在這個序列圖中,發送端應用程序將發送任務的 WQE 提交到發送隊列,發送隊列通知發送端硬件有任務待處理,發送端硬件從內存讀取數據并發送給接收端硬件,接收端硬件將數據寫入內存后,在接收隊列放置接收完成信息,同時在完成隊列放置發送完成信息,發送端和接收端應用程序通過輪詢相應隊列來獲取任務完成情況,從而實現了 RDMA 數據的可靠傳輸和任務的協調調度。這種通過隊列對和完成隊列的協同工作機制,使得 RDMA 能夠高效地進行數據傳輸,充分發揮其低延遲、高帶寬的優勢,滿足各種對網絡性能要求苛刻的應用場景的需求。
四、RDMA的應用領域
4.1數據中心網絡的變革
在大規模數據中心中,RDMA 技術正發揮著至關重要的作用,深刻改變著服務器間的通信模式。傳統的 TCP/IP 通信方式在數據中心的海量數據傳輸場景下,往往顯得力不從心,存在著高延遲、低帶寬利用率以及 CPU 資源消耗大等問題。而 RDMA 技術的出現,猶如一場及時雨,為這些問題提供了有效的解決方案。
以云存儲服務為例,當用戶請求從云端下載或上傳大量數據時,使用 RDMA 技術可以顯著加速數據的傳輸過程。在一個擁有數千臺服務器的大型數據中心中,采用 RDMA 技術的云存儲系統,其數據傳輸速度相比傳統方式可提升數倍甚至更高。這意味著用戶能夠更快地獲取所需的數據,大大提高了用戶體驗。同時,對于數據中心的運營者來說,這也意味著能夠在相同的時間內處理更多的用戶請求,從而提高了服務的效率和競爭力。
在分布式數據庫系統中,RDMA 同樣展現出了強大的優勢。在進行大規模數據的分布式查詢和事務處理時,RDMA 技術能夠實現服務器之間的高速數據交互,大大降低了數據傳輸的延遲。這使得數據庫系統能夠更快速地響應復雜的查詢請求,提高了事務處理的效率和并發能力。例如,在一些大型電商平臺的訂單處理系統中,RDMA 技術的應用使得訂單的查詢和處理速度得到了顯著提升,能夠在高并發的情況下依然保持穩定的性能,確保了平臺的高效運行。
此外,在應對數據中心內部的海量數據遷移和備份場景時,RDMA 技術也能夠發揮其高帶寬、低延遲的優勢,大大縮短數據遷移和備份的時間窗口,減少對業務的影響,提高數據中心的整體可靠性和可用性。
4.2高性能計算的得力助手
在高性能計算(HPC)領域,RDMA 技術已經成為不可或缺的關鍵技術之一,為科學研究和工程計算等領域的發展提供了強大的動力。
在氣象模擬領域,科學家們需要處理海量的氣象數據,并進行復雜的數值計算,以預測天氣變化和氣候趨勢。傳統的網絡通信方式往往無法滿足這種大規模數據處理和高速計算的需求,而 RDMA 技術的應用則帶來了顯著的改變。通過 RDMA,計算節點之間能夠實現高速的數據共享和交互,大大縮短了數據傳輸的時間,從而加速了整個氣象模擬的計算進程。例如,在一個全球氣候模擬項目中,使用 RDMA 技術后,數據傳輸的延遲降低了數倍,使得模擬計算的效率得到了大幅提升,原本需要數周甚至數月才能完成的模擬任務,現在能夠在更短的時間內得到結果,為氣象研究提供了更及時、準確的支持。
在基因測序領域,RDMA 同樣發揮著重要作用。基因測序會產生海量的基因數據,對這些數據的分析和處理需要強大的計算能力和高效的數據傳輸能力。RDMA 技術使得基因測序設備與計算節點之間能夠快速傳輸數據,減少了數據傳輸的瓶頸,提高了測序數據的處理速度。這不僅有助于加速科研項目的進展,例如在癌癥基因研究、遺傳疾病診斷等方面,能夠更快速地分析基因數據,為疾病的診斷和治療提供更有力的依據,而且也為基因技術在醫學、農業等領域的廣泛應用奠定了基礎。
許多科研機構和企業在其高性能計算集群中廣泛應用 RDMA 技術,取得了顯著的性能提升和科研成果加速的效果。例如,某知名科研機構在其超級計算機上采用 RDMA 技術后,在一系列復雜的科學計算任務中,計算效率提高了 30% 以上,使得原本需要耗費大量時間和資源的科研項目能夠更快地取得突破,推動了相關學科的發展和技術的進步。
4.3分布式存儲系統的優化
在分布式存儲系統中,RDMA 技術的應用為數據的高效存儲和快速訪問提供了有力保障。傳統的分布式存儲架構在數據讀寫過程中,往往需要經過多個中間節點的處理和數據復制,這會導致較高的延遲和較低的讀寫性能。而 RDMA 技術的出現,使得存儲節點和計算節點之間能夠直接進行快速的數據傳輸,繞過了中間節點的繁瑣處理,大大減少了數據復制和中間節點處理的開銷。
以 Ceph、GlusterFS 等分布式存儲系統為例,當計算節點需要從存儲節點讀取大量數據時,RDMA 技術能夠實現數據的直接內存訪問,避免了傳統方式下數據在多個層次之間的拷貝和協議棧的處理,從而顯著提高了數據讀取的速度。在實際的應用場景中,如大規模的視頻存儲和在線播放平臺,使用 RDMA 技術的分布式存儲系統能夠更快地響應用戶的播放請求,減少視頻的緩沖時間,提升用戶的觀看體驗。
在數據寫入方面,RDMA 同樣表現出色。例如,在一些對數據寫入速度要求極高的大數據存儲場景中,如實時數據采集和存儲系統,RDMA 技術能夠確保數據快速、準確地寫入存儲節點,提高了存儲系統的寫入性能和響應速度,保證了數據的及時性和完整性。
此外,RDMA 技術還能夠提高分布式存儲系統的可靠性和可用性。通過減少中間節點的故障點,以及快速的數據恢復和同步能力,RDMA 技術使得分布式存儲系統在面對節點故障或網絡異常時,能夠更快速地進行數據的冗余備份和恢復,確保數據的安全性和可用性,為企業的關鍵業務數據提供了更可靠的存儲解決方案。
五、RDMA通信過程
為了執行 RDMA 操作,首選需要建立與遠程主機的連接和適當的認證。實現這些的機制是隊列對(QP) 。與標準的 IP 協議棧類似,一個 QP 大概等同于一個接字(socket)。QP 需要在連接兩端進行初始化。連接管理器(CM)用來在 QP 建立之前進行 QP 信息的交換。一旦一個 QP 建立起來, verbs API 就可以用來執行 RDMA 讀/寫和原子操作。與套接字的讀/寫類似的連續收/發操作也能執行。RDMA的操作過程大致如下:
- 當一個應用程執行度或者寫請求時,不執行任何數據復制,再不需要任何內核參與的條件下,RDMA請求從用戶空間中的應用發送到本地NIC網卡。
- NIC讀取緩沖區的內容,并通過網絡傳輸到遠程NIC。
- 在網絡上傳輸的RDMA信息包括虛擬地址、內存鑰匙和數據本身。請求既可以完全在用戶空間中處理,又或者在應用一直睡眠到請求完成時的情況下通過系統級中斷處理。RDMA操作使應用可以從一個遠程應用的內存中讀取數據或向這個內存中寫數據。
- 目標NIC確認內存鑰匙,直接將數據寫入應用緩存中,用于操作的遠程虛擬內存地址包含在RDMA信息中。
在RDMA操作中,Read/Write是單邊操作,秩序本地端明確信息的源和目的地址,遠端應用不必感知此次通信,數據的讀或寫都通過RDMA在RNIC與應用Buffer之間完成,再由遠端RNIC封裝成消息返回到本地端。Send/Receive是雙邊操作,即必須要遠端的應用感知參與才能完成收發,在實際中,Send/Receive多用于連接控制類報文,而數據報文是通過Read/Write來完成的。
5.1單向通信-讀Read
圖片
- 首先A、B建立連接,QP已經創建并初始化。
- 數據被存檔在B的buffer,地址為VB,注意VB是提前注冊到B的RNIC,并且它是一個Memory Region,并拿到返回的local key,相當于RDMA操作這塊buffer的權限。
- B把數據地址VB,key封裝到專用報文傳送到A,這相當于B把數據buffer的操作權交給了A。同時B在他的WQ中注冊一個WR,用于接收數據傳輸的A返回的狀態。
- A在收到B發送過來的數據地址VB和R_key之后,RNIC會把它們連同本地存儲數據的地址VA封裝到Read請求中,將這個請求消息發送到B,這個過程A、B兩端不需任何軟件參與,就可以將B中的數據存儲到A的VA虛擬地址。
- A在存儲完成后,向B返回數據傳輸的狀態信息。
5.2 單向通信-寫Write
圖片
- 首先A、B建立連接,QP已經創建并初始化。
- 數據遠端的目標存儲空間buffer的地址為VB,注意VB是提前注冊到B的RNIC,并且它是一個Memory Region,并拿到返回的local key,相當于RDMA操作這塊buffer的權限。
- B把數據地址VB,key封裝到專用報文傳送到A,這相當于B把數據buffer的操作權交給了A。同時B在他的WQ中注冊一個WR,用于接收數據傳輸的A返回的狀態。
- A在收到B發送過來的數據地址VB和R_key之后,RNIC會把它們連同本地存儲數據的地址VA封裝到Write請求中,這個過程A、B兩端不需任何軟件參與,就可以將A中的數據存儲到B的VB虛擬地址。
- A在發送數據完成后,向B返回數據傳輸的狀態信息。
5.3雙向通信-Send\Recv
圖片
- 首先,A和B都要創建并初始化好各自的QP、CQ。
- A、B分別想自己的WQ中注冊WQE,對于A來說,WQ=SQ,WQE描述指向一個等待被發送的數據;對于B,WQ=RQ,WQE描述指向一塊用于存儲數據的Buffer。
- A的RNIC異步調度輪到A的WQE,解析到這是一個Send消息,從Buffer中直接向B發送數據。數據流到達B的RNIC后,B的WQE被消耗,并把數據直接存儲到WQE指向的存儲位置。
- AB通信完成后,A的CQ中會產生一個完成消息CQE表示發送完成。同時,B的CQ中會產生一個完成消息CQE表示接收完成。每個WQ中的WQE的處理完成都會產生一個CQE。































