RDMA(Remote Direct Memory Access,远程直接内存访问)是现代高性能网络(HPC、AI训练、大规模分布式存储等)的核心技术之一。
它的核心思想是:让一台机器的网卡直接读写另一台机器的内存,完全绕过对方的CPU、内核和内存拷贝,从而实现极低的延迟、极高的吞吐和极低的CPU占用。
下面我们系统梳理 RDMA 的基本元素(也叫核心组件或基本构建块),这些几乎是所有RDMA编程(verbs API)和理解RDMA协议的基础。
RDMA 核心元素一览表
| 缩写 | 全称 | 中文常用称呼 | 主要作用 / 含义 | 是否必须提前创建/注册 |
|---|---|---|---|---|
| QP | Queue Pair | 队列对 | RDMA通信的最基本单元,由一个发送队列SQ + 一个接收队列RQ组成 | 是(通信主体) |
| SQ | Send Queue | 发送队列 | 存放要发出去的操作(Work Request) | QP自带 |
| RQ | Receive Queue | 接收队列 | 存放接收方预先准备好的接收缓冲区信息 | QP自带(或使用SRQ) |
| SRQ | Shared Receive Queue | 共享接收队列 | 多个QP共享一个RQ,节省资源(常见于服务器端) | 可选 |
| WQE | Work Queue Element | 工作请求 / 工作队列元素 | 放在SQ或RQ里的具体任务描述(发送什么、读/写哪里、长度多少、rkey等) | 每次操作都要post |
| WR | Work Request | 工作请求 | 用户态对WQE的封装(ibv_send_wr / ibv_recv_wr) | 用户编程时使用 |
| CQ | Completion Queue | 完成队列 | 硬件完成任务后把结果写到这里(一个CQ可对应多个QP的SQ/RQ) | 是 |
| CQE | Completion Queue Element | 完成事件 / 完成队列元素 | 硬件写回的完成报告,包含成功/失败、字节数、opcode等信息 | 自动产生 |
| WC | Work Completion | 完成描述 | 用户态读取CQE后得到的结构体(ibv_wc) | 用户poll时使用 |
| MR | Memory Region | 内存区域 / 内存注册 | 提前注册给网卡的内存块(虚拟地址→物理地址映射 + 访问权限),包含lkey/rkey | 是(几乎所有操作都需要) |
| lkey | local key | 本地密钥 | 本地网卡用来访问本地MR的钥匙 | MR自带 |
| rkey | remote key | 远程密钥 | 远程网卡访问对方MR时使用的钥匙(RDMA读/写/原子操作需要) | MR自带,对方需知道 |
| PD | Protection Domain | 保护域 | 一种安全隔离机制,QP、MR、SRQ等必须属于同一个PD才能相互操作 | 是 |
| AH | Address Handle | 地址句柄 | 用于无连接服务类型(UD),保存远程节点的LID/GID等路由信息 | UD模式下需要 |
通信流程中这些元素如何协作(简要)
以最经典的 RDMA Write 为例:
- 接收方 先注册一块内存为 MR → 得到 rkey 和虚拟地址,把这两者通过控制通道(通常是TCP socket)告诉发送方。
- 接收方(可选)post Receive WR 到自己的 RQ(或SRQ),准备接收可能的Send操作。
- 发送方 注册自己的发送缓冲区为 MR。
- 发送方创建 QP(通常是RC可靠连接类型),通过RDMA_CM或手动交换连接信息(QPN、LID/GID、PSN等)建立连接。
- 发送方构造 WR(opcode=RDMA_WRITE),填写:
- 本地地址、长度、lkey
- 远程地址、rkey
- 调用 ibv_post_send → 把WR转成WQE放入 SQ
- 硬件(RNIC)自动执行:
- 从本地MR读取数据
- 通过网络发给对方(携带rkey、远程va)
- 对方RNIC收到后直接写到对方指定的MR地址(无需对方CPU参与)
- 发送完成后,硬件产生 CQE 到发送方的 CQ(SQ完成)
- (如果是对方的Send操作)对方也会在自己的CQ收到CQE(RQ完成)
RDMA 常见的操作类型(Verbs Opcode)
- SEND / RECV:类socket的发送接收(需要双方配合)
- RDMA WRITE:单边写(push),最常用
- RDMA READ:单边读(pull)
- ATOMIC:远程原子操作(Fetch&Add / Compare&Swap)
- RDMA WRITE WITH IMM:带立即数的写(常用于头部信息)
一句话总结 RDMA 基本元素的关系
QP 是通信主体,WQE/WR 是任务指令,CQ/CQE 是完成通知,MR + lkey/rkey 是内存访问门票,PD 是安全围栏。
所有高效RDMA程序的核心工作就是:
- 创建和管理这些对象(QP、CQ、PD、MR)
- 合理post WR / poll CQE
- 安全地交换 rkey / va / QPN 等信息
下一期可以深入讲解其中任意一个元素(比如 QP 的状态机、MR 注册原理、CQ 轮询优化、RC vs UC vs UD 的区别等),或者直接进入 verbs API 编程实战。
有想重点了解的元素吗?欢迎留言~