RDMA 技术本质:当网络传输变成了内存访问
引言
在传统的网络编程中,发送数据意味着让 CPU 把数据从用户态搬到内核态,再经过复杂的协议栈处理,最后交给网卡。这个过程消耗了大量 CPU 资源,却只是为了"搬运"数据,而非"计算"数据。
RDMA(Remote Direct Memory Access,远程直接内存访问)的出现,彻底颠覆了这一模式。本文将深入探讨 RDMA 技术的本质——它如何将"网络 I/O"转化为"内存 I/O",以及这种转变背后数据流动路径、处理路径和处理逻辑三个维度的根本性变革。
一、数据流动路径的变革:从"CPU 中转"到"总线直通"
传统网卡的发送路径
在传统网卡中,一次数据发送需要经历多次数据搬运:
用户态缓冲区 → (CPU 拷贝 1) → 内核态 Socket 缓冲区 → (CPU 协议栈封装) → skb → (网卡 DMA) → 网线
核心痛点: 数据从用户态到内核态必须经过一次 CPU 执行的内存拷贝。当传输大块数据时,CPU 的大量时间被消耗在数据搬运上,而非实际的业务计算。
RDMA 的发送路径
RDMA 通过内存注册(Memory Region,MR)机制,将用户态内存的物理地址映射表下发到网卡硬件:
用户态缓冲区 (MR) → (网卡 DMA 直接读取) → 网线
关键变化: 数据的起点是用户态内存,终点是网线。中间没有内核内存作为中转站。网卡通过硬件级的地址翻译表,直接通过 PCIe 总线从物理内存中取数据。
接收端的对称简化
- 传统网卡: 网卡 → 内核缓冲区 → CPU 拷贝 → 用户态缓冲区(伴随中断和上下文切换)
- RDMA: 网卡 → 直接 DMA 写入用户态缓冲区(远端 CPU 完全不知情)
二、数据处理路径的变革:从"软件栈"到"硬件卸载"
传统网卡依赖庞大的软件协议栈
普通网卡只负责最底层的"比特收发",所有智能处理都依赖 CPU 执行 Linux 内核协议栈:
应用 → 系统调用 → VFS/Socket → TCP/IP 协议栈(校验、分段、重传、拥塞控制)→ 邻居子系统 → 驱动层
这条路径包含数万行代码,每发送一个数据包,CPU 都要执行这些指令。
RDMA 将传输层下沉到硬件
RDMA 网卡(HCA)本质上是一个具备极强处理能力的协处理器,它在硬件中实现了完整的传输层逻辑:
- 消息封装: 硬件自动添加 IB 传输层头部(IBTH),包含 QPN(队列对编号)、PSN(包序列号)、操作码等字段
- 可靠传输: 硬件自动处理 ACK/NAK 应答机制,在微秒级完成丢包重传
- 乱序重组: 硬件根据 PSN 自动排序,保证按序交付
- 路由分拣: 硬件根据 QPN 将到达的数据包直接分发到正确的队列对
本质区别: 协议栈被"硬件化"了。TCP 的重传、排序、拥塞控制等逻辑由网卡芯片完成,不消耗主机 CPU 的任何时钟周期。
三、处理逻辑的变革:从"面向字节流"到"面向消息与内存"
传统网络:无结构的字节流
普通网卡看到的数据只是一串 0 和 1。应用写入 4KB 数据,内核可能拆成 3 个包发送;应用写入 100 字节两次,内核可能合并成 1 个包。接收端必须自己处理"粘包"和"拆包"问题。
RDMA:带语义的消息传输
RDMA 网卡理解数据的结构,甚至理解远端的虚拟内存地址:
Send/Recv 模式: 保留消息边界。发送的 4KB 消息,对端接收到的就是一个完整的 4KB 消息。
RDMA Read/Write 模式(精髓所在): 这是 RDMA 最具革命性的能力。本地 CPU 可以直接操作远端内存:
- 本地网卡发出指令:“将这块数据写入远端内存的
0x7ff...地址” - 远端网卡收到指令后,直接通过 PCIe 总线对远端物理内存执行 DMA 写入
- 远端 CPU 完全不参与,甚至可能在满负荷计算中
四、IB 传输层:硬件卸载的核心
分层校验策略
IB 传输层采用分层校验,追求极致速度:
- ICRC/VCRC: 仅校验传输层头部,确保 QPN、PSN、操作码等字段未被篡改
- 数据校验: 交由底层物理链路(SerDes 的 FCS)和上层应用负责
- 设计哲学: 信任底层物理链路,避免对每个字节做重度 CRC 计算带来的延迟
硬件可靠传输机制
发送端:
- 为每个数据包分配严格递增的 PSN
- 保留发送内容,等待 ACK
- 收到 NAK 后,硬件在微秒级自动重传
接收端:
- 根据 PSN 检查顺序,发现丢包立即发送 NAK
- 暂存乱序到达的数据包,等待补齐后一次性写入用户内存
- 应用程序永远看到发送端的原始顺序
五、Soft-RoCE:功能模拟,而非性能方案
Soft-RoCE(RXE)是在普通以太网卡上用内核线程模拟 RDMA 的行为。理解它为何性能不足,有助于更深入地理解 RDMA 的本质。
数据流动路径的倒退
用户态 MR → (CPU memcpy 拷贝 1) → 内核 RXE 缓冲区 → 协议栈封装 → 普通网卡队列 → 网线
即使在 UDP 之上实现了类似 KCP 的高效可靠传输算法,Soft-RoCE 依然无法避免 CPU 搬运数据这一物理缺陷。KCP 优化的是"大脑"(重传算法),但硬件 RDMA 省掉的是"体力活"(DMA vs CPU 拷贝)。
性能差距的本质
| 维度 | 硬件 RDMA | Soft-RoCE |
|---|---|---|
| 数据搬运 | 网卡 DMA 直接完成 | CPU 逐字节 memcpy |
| 协议处理 | 硬件芯片并行处理 | 内核线程串行执行 |
| 上下文切换 | 无(Doorbell 直接通知硬件) | 系统调用陷入内核 |
| 延迟 | 亚微秒级 (~1-2 μs) | 几十微秒级 (~10-50 μs) |
六、RDMA 的本质总结
如果要用一张图来描绘 RDMA 的本质:
-
传统网卡: 像一个"前台代收代发"。寄东西必须先把包裹搬到前台(内核),前台帮你打包、填单子,然后交给快递员(网卡)。收快递时,前台打电话(中断)通知你来取。
-
RDMA 网卡: 像一个"拥有你家钥匙的无人搬运机器人"。你告诉机器人(Doorbell):“卧室衣柜里的那包衣服(MR 地址),送到对面老王家的客厅(远端 MR 地址)”。机器人有你家地址的物理地图(MTT),自己开门取货(本地 DMA),用老王给的钥匙开门(R_Key),把东西放进客厅(远端 DMA)。全程不需要老王从沙发上起来(远端 CPU 旁路)。
最终凝练
RDMA 的本质,是将远端机器的内存地址空间,通过带有硬件传输层卸载能力的网卡,映射并延伸到了本地总线上,从而把昂贵的"网络 I/O"转化为了廉价的"内存 I/O"。
它通过三个维度的根本性变革实现这一目标:
- 数据流动路径: 消除了服务器内部的 CPU 数据搬运
- 数据处理路径: 将传输层协议栈卸载到专用硬件
- 处理逻辑: 从无结构的字节流升级为带语义的内存访问
这种转变释放了宝贵的 CPU 资源,让 CPU 真正用于计算而非搬运,为分布式存储、AI 训练、高性能计算等场景提供了接近硬件极限的通信能力。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)