1. 什么是RDMA?
RDMA(Remote Direct Memory Access,远程直接内存访问) 是一种网络通信技术,它允许一台计算机直接访问另一台计算机的内存,而无需经过对方操作系统的内核、CPU的介入。这意味着数据可以直接从一台机器的用户态内存,传输到另一台机器的用户态内存,实现了零拷贝(Zero-Copy) 和内核旁路(Kernel Bypass)。
简单来说,RDMA就像是为两台服务器之间建立了一条"数据高速公路",数据包可以在这条高速公路上"直达",绕过了传统网络协议栈(如TCP/IP)中所有的"收费站"(内核协议栈处理)和"中转站"(CPU拷贝),从而实现了极低的延迟和极高的吞吐量。
2. RDMA的核心优势
与传统基于Socket的网络通信相比,RDMA带来了革命性的性能提升:
- 超低延迟(Ultra-Low Latency): 绕过内核和CPU,通信延迟可降至微秒(µs)级,甚至亚微秒级。
- 高带宽(High Bandwidth): 充分利用高速网络(如InfiniBand, RoCE)的物理带宽,吞吐量可达每秒数百Gb甚至更高。
- 极低的CPU占用(Low CPU Overhead): 数据传输过程几乎不消耗CPU资源,将宝贵的CPU算力释放给应用程序本身。
- 零拷贝(Zero-Copy): 数据直接从应用缓冲区发送到网卡,或从网卡直接写入应用缓冲区,避免了在内核空间和用户空间之间的多次内存拷贝。
3. RDMA的三种主流实现
目前,RDMA主要通过以下三种网络技术实现:
| 实现方式 | 全称 | 网络要求 | 特点 |
|---|---|---|---|
| InfiniBand (IB) | - | 专用InfiniBand网络和网卡 | 原生RDMA,性能最佳,延迟最低,但需要整套专用硬件,成本高。 |
| RoCE (RDMA over Converged Ethernet) | RDMA over Converged Ethernet | 支持无损以太网(如PFC, ECN) | 在以太网上承载RDMA,性价比高,是当前数据中心的主流选择。分v1(链路层)和v2(路由层)。 |
| iWARP | Internet Wide Area RDMA Protocol | 标准TCP/IP网络 | 在TCP/IP上实现RDMA,兼容性最好,可跨广域网,但协议开销稍大,性能低于前两者。 |
简单选择指南:
- 追求极致性能 : 选 InfiniBand。
- 数据中心内部高性能网络 : 选 RoCEv2。
- 需要跨标准IP网络或广域网 : 选 iWARP。
4. RDMA的核心概念与工作模式
理解RDMA,需要掌握几个关键概念:
- Queue Pair (QP,队列对): RDMA通信的基本端点,由一对队列组成:发送队列(SQ)和接收队列(RQ)。应用程序通过向队列提交工作请求(Work Request)来发起操作。
- Completion Queue (CQ,完成队列): 用于通知应用程序其提交的请求已完成(无论成功或失败)。
- Memory Region (MR,内存区域): 应用程序需要预先注册一块内存区域给RDMA网卡使用,网卡才能直接访问这块内存。
- Verbs: RDMA编程的底层API接口,分为"用户态Verbs"和"内核态Verbs"。
RDMA主要支持两种通信语义:
- 单边操作 (One-Sided Operations) :
- WRITE: 发起端直接向远端内存写入数据,远端CPU完全不知情。
- READ: 发起端直接从远端内存读取数据。
- 特点: 延迟最低,但需要双方预先协调好内存地址和权限。
- 双边操作 (Two-Sided Operations) :
- SEND/RECV: 类似于传统Socket,发送端发送消息,接收端需要提前发布接收缓冲区来接收。
- 特点: 编程模型更简单,但延迟略高于单边操作。
5. RDMA的典型应用场景
RDMA技术在高性能计算和大型互联网数据中心中已成为关键基础设施:
-
高性能计算 (HPC):
- 科学计算: 气候模拟、流体动力学、宇宙学模拟等需要万节点级紧密通信的应用。
- AI/机器学习 :
- 分布式训练: 在GPU服务器之间高速同步模型参数和梯度(例如NVIDIA的GPUDirect RDMA技术)。
- 推荐系统: 快速访问分布在多台机器上的巨大嵌入表。
-
存储系统:
- 分布式存储: Ceph, GlusterFS 等使用RDMA加速数据读写和元数据同步。
- 超融合基础设施 (HCI): VMware vSAN, Nutanix 利用RDMA提升存储网络性能。
- NVMe over Fabrics (NVMe-oF): 将本地NVMe SSD的性能通过网络(通常基于RDMA)扩展到远端,实现高性能共享存储。
-
数据库与大数据:
- 分布式数据库: Google Spanner, CockroachDB 利用RDMA实现跨数据中心低延迟复制。
- 内存计算: Apache Spark, Redis 集群使用RDMA加速Shuffle和数据交换过程。
-
金融行业:
- 高频交易 (HFT): 对网络延迟有极致要求,RDMA是关键技术。
6. 如何使用RDMA?(快速入门示例)
以下是一个使用Linux下libibverbs库(用户态Verbs)编写简单RDMA双边通信(SEND/RECV)的C语言代码框架,用于展示基本流程。
环境准备:
- 安装RDMA开发包:
sudo apt-get install libibverbs-dev(Ubuntu/Debian) - 确保系统已加载RDMA内核模块,并安装了兼容的RDMA网卡驱动。
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <infiniband/verbs.h> // 核心头文件
int main() {
struct ibv_device **dev_list;
struct ibv_context *context;
struct ibv_pd *pd; // 保护域
struct ibv_cq *cq; // 完成队列
struct ibv_qp *qp; // 队列对
struct ibv_mr *mr; // 内存区域
char *buffer;
// 1. 获取设备列表
dev_list = ibv_get_device_list(NULL);
if (!dev_list) { perror("Failed to get IB device list"); return 1; }
// 2. 打开第一个设备,创建上下文
context = ibv_open_device(dev_list[0]);
if (!context) { perror("Failed to open IB device"); return 1; }
// 3. 分配保护域 (PD)
pd = ibv_alloc_pd(context);
if (!pd) { perror("Failed to allocate PD"); return 1; }
// 4. 注册内存区域 (MR)
buffer = malloc(4096);
mr = ibv_reg_mr(pd, buffer, 4096,
IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_READ | IBV_ACCESS_REMOTE_WRITE);
if (!mr) { perror("Failed to register MR"); return 1; }
// 5. 创建完成队列 (CQ)
cq = ibv_create_cq(context, 10, NULL, NULL, 0); // 深度为10
if (!cq) { perror("Failed to create CQ"); return 1; }
// 6. 创建队列对 (QP)
struct ibv_qp_init_attr qp_init_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_init_attr);
if (!qp) { perror("Failed to create QP"); return 1; }
// 7. QP状态机转换 (INIT -> RTR -> RTS)
// ... (此处省略QP属性修改和状态转换的具体代码,需要双方交换信息)
printf("RDMA基础环境初始化成功!\n");
// 8. 清理资源 (反向顺序)
ibv_destroy_qp(qp);
ibv_destroy_cq(cq);
ibv_dereg_mr(mr);
free(buffer);
ibv_dealloc_pd(pd);
ibv_close_device(context);
ibv_free_device_list(dev_list);
return 0;
}
关键步骤说明:
- 发现与打开设备。
- 分配保护域(PD),相当于资源的"容器"。
- 注册内存区域(MR),告知网卡哪些内存可以被直接访问。
- 创建完成队列(CQ)和队列对(QP),建立通信的基本框架。
- 进行QP的状态迁移(从INIT到RTS),这通常需要通信双方通过带外方式(如TCP Socket)交换QP信息(如GID、QPN等)。
- 发布接收请求(RECV WR),提交发送请求(SEND WR),然后轮询CQ等待完成。
7. 总结与展望
RDMA通过其零拷贝、内核旁路的架构,彻底革新了数据中心内部的网络性能,是支撑AI、大数据、高性能存储等现代工作负载的基石技术。随着RoCE的普及和生态的成熟,RDMA正从HPC专属走向更广泛的商业数据中心。
对于开发者而言,直接使用libibverbs进行编程门槛较高。在实际应用中,更多是通过高性能通信库 (如OpenMPI 、UCX )或支持RDMA的存储/计算框架 (如Ceph RDMA 、Spark RDMA)来间接享受其带来的性能红利。
未来,随着DPU(数据处理单元)和智能网卡的兴起,RDMA将与计算卸载、存储卸载等技术更深度结合,进一步释放主机CPU的潜力,推动数据中心向更高效率、更低延迟的方向演进。