引言

在传统的网络编程中,发送数据意味着让 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"。

它通过三个维度的根本性变革实现这一目标:

  1. 数据流动路径: 消除了服务器内部的 CPU 数据搬运
  2. 数据处理路径: 将传输层协议栈卸载到专用硬件
  3. 处理逻辑: 从无结构的字节流升级为带语义的内存访问

这种转变释放了宝贵的 CPU 资源,让 CPU 真正用于计算而非搬运,为分布式存储、AI 训练、高性能计算等场景提供了接近硬件极限的通信能力。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐