从来没接触过RDMA,也是最近才开始学习,搜了一些博客和知乎,大致了解了一下RDMA是什么、干什么的、怎么干的、为什么要有RDMA。这里简单整理一篇文章,其实也就是我自己的一个粗糙的学习笔记,很多知乎写的都很专业,链接也放在文中,方便大家参考学习。
初识RDMA技术——RDMA概念,特点,协议,通信流程 - 知乎 (zhihu.com)
深入浅出全面解析RDMA技术 - 知乎 (zhihu.com)
一、基本概述
首先,通过计算机原理的学习我们肯定知道了DMA是什么东西
DMA:外部设备(PCIe设备)能绕过CPU直接访问主机的系统主存
PCIe(Peripheral Component Interconnect Express)是一种高速串行计算机扩展总线标准,广泛用于连接各种外设,如显卡、SSD和网络卡等(高速串行点对点双通道高带宽传输,所连接的设备分配独享通道带宽,不共享总线带宽)
DMA升级一下,得到RDMA
RDMA(Remote Direct Memory Access):远程直接内存访问,指外部设备能够绕过CPU,不仅可以访问本地主机的主存,它还可以访问另一台远端主机上用户态的系统主存。
- Remote:数据通过网络与远程机器间进行数据传输。
- Direct:没有内核的参与,有关发送传输的所有内容都卸载到网卡上。
- Memory:在用户空间虚拟内存与RNIC网卡直接进行数据传输不涉及到系统内核,没有额外的数据移动和复制。
- Access:send、receive、read、write、atomic操作。
解决网络传输中客户端与服务器端数据处理的延迟
传统Socket套接字网络中:应用程序向操作系统申请网络资源时,要通过特定的API来管理程序的行为。
RDMA仅仅使用操作系统建立一个通道,在不需要操作系统干预的情况下,应用程序之间能直接进行消息传递
二、TCP/IP存在的问题
主要问题——I/O瓶颈问题
高速网络环境下与网络I/O相关的主机处理的高开销(数据移动操作和复制操作)限制了机器之间的传输带宽
传统的TCP/IP是通过内核发送消息(性能低、灵活性差)
性能低的主要原因是:由于网络通信通过内核传递,需要在内核中频繁进行协议封装和解封操作,造成很大的数据移动和数据复制开销。
灵活性差的原因是:是因为网络通信协议在内核中进行处理,这种方式很难支持新的网络协议和新的消息通信协议以及发送和接收接口。
RDMA——为了消除传统网络通信带给计算任务的瓶颈(更快和更轻量级的网络通信)
三、RDMA的原理
原理:RDMA利用栈旁路和零拷贝技术提供了低延迟的特性
效果:减少了CPU占用,减少了内存带宽瓶颈,提高了带宽利用率 提供了一个基于IO的通道,允许一个应用程序通过RDMA设备对远程的虚拟内存进行直接的读写
- 传统网络传输中,数据需要经过“用户空间→内核→网卡→远程网卡→内核→用户空间”(多次数据拷贝)
- RDMA:通过硬件卸载(HCA)和零拷贝技术,数据直接在用户空间和远程内存之间传输,无需内核参与
HCA(Host Channel Adapter,主机通道适配器):RDMA专用网卡,负责硬件级的数据传输
PRE | Preamble(前导码) | 同步信号,用于接收端同步数据包,类似以太网的前导码 |
LRH | Local Routing Header(本地路由头) | 用于 InfiniBand 网络的本地子网路由,指定数据包在本地交换机的转发路径 |
GRH | Global Routing Header(全局路由头) | 用于跨子网传输,包含源和目的的全局地址(如 InfiniBand 的 GID),支持大规模网络拓扑 |
BTH | Base Transport Header(基础传输头) | 核心控制字段,包含: - Opcode(操作码,如 RDMA Read/Write) - 数据包长度 - 源和目的 QPN(队列对编号,标识通信双方的队列) - 序列号(用于排序和重传) |
ETH | Extended Transport Header(扩展传输头) | 可选字段,用于 RoCEv2 等协议,包含额外的传输层信息(如 UDP 端口号) |
Payload | 用户数据 | 应用程序需要传输的实际数据,直接从用户空间传递到 HCA,无需内核拷贝 |
CRCs | Cyclic Redundancy Check(循环冗余校验) | 错误检测字段,确保数据完整性 |
- 用户空间准备数据:应用程序在用户空间(User Space)中准备好需要传输的数据(Payload),并将其注册到 HCA(通过内存键 MR,Memory Region)。
- HCA 封装数据包:HCA 从用户空间直接读取 Payload,并自动添加 PRE、LRH、GRH、BTH、ETH 等头部字段,以及 CRCs 校验字段。
- 硬件级传输:数据包通过网络发送到远程 HCA,远程 HCA 根据头部信息(如 GRH、BTH)直接将 Payload 写入远程应用程序的内存(无需远程内核参与)。
- 异步通知完成:传输完成后,HCA 通过 “完成队列”(Completion Queue)向应用程序发送通知,整个过程无需 CPU 干预。
四、RDMA主要技术/特点
CPU Offload(CPU Bypass)
无需CPU干预,应用程序可以远程访问主机内存而不消耗远程主机中的任何CPU。远程主机内存能够被读取而不需要远程主机上的进程(或CPU)参与。远程主机的CPU的缓存(cache)不会被访问的内存内容所填充。
将传统网络通信中的 CPU 密集型操作卸载到专用硬件(如网卡)
HCA 承担了传统网络协议栈的大部分功能
- 连接管理:HCA 维护 RDMA 连接状态,无需内核参与
- 可靠性保证:HCA 处理错误恢复、重传和顺序保证
- 流量控制:硬件级别的流量控制机制
- 原子操作:支持远程原子操作(如 Fetch-And-Add),无需分布式锁
Kernel Bypass(内核旁路)
应用程序可以直接在用户态执行数据传输,不需要在内核态和用户态之间做上下文切换。
在传统的基于 TCP/IP 的网络传输中,数据在应用程序(用户态)和网络设备(受内核管理)之间传递时,需要频繁进行内核态与用户态的上下文切换
数据拷贝开销:应用程序发送数据时,需要先将数据从用户空间拷贝到内核空间的网络缓冲区,内核再将数据从缓冲区拷贝到网卡的发送队列。接收数据时,流程相反,数据要从网卡接收队列先拷贝到内核空间,再拷贝到用户空间
上下文切换开销:每次从用户态切换到内核态,或从内核态切换回用户态,CPU 都需要保存和恢复当前的执行环境(如寄存器值、程序计数器等),这会消耗一定的 CPU 时间。
协议处理负担:内核需要处理复杂的 TCP/IP 协议栈,包括数据包的封装、解封、流量控制、拥塞控制等操作,这进一步加重了 CPU 的负担,限制了数据传输的速度和效率。
Zero Copy(零拷贝)
零拷贝主要的任务就是避免CPU将数据从一块存储拷贝到另一块存储
应用程序在进行 RDMA 数据传输前,会对需要使用的内存区域进行注册。注册后的内存区域会被标记为可以被 HCA 直接访问
数据传输过程中,数据可以直接在用户空间和远程内存之间传输,无需在内核空间中转,实现了零拷贝(Zero - Copy)
通过内存注册,HCA 获得访问用户空间内存的权限,并且可以在不经过内核干预的情况下进行数据读写操作。
异步接口
在RDMA中,所有的接口都是异步接口,允许应用程序在发起数据传输操作后无需等待操作完成,即可继续执行其他任务
传统同步接口的局限性:
1.阻塞式操作模型:
• 应用程序调用发送 / 接收函数后,会被阻塞直到操作完成
• CPU 资源在等待期间被浪费,无法处理其他任务
• 高并发场景下需要创建大量线程 / 进程,导致上下文切换开销剧增
2.性能瓶颈
• 在低延迟网络环境中,等待网络操作完成的时间可能远超数据传输本身
• 同步模型无法充分利用多核 CPU 和高速网络带宽
• 对于微秒级延迟的应用(如高频交易),阻塞等待会显著降低系统响应速度
RDMA 异步接口通过事件驱动和非阻塞操作彻底改变了传统网络编程模型
核心概念
工作请求 (Work Request, WR) | 应用程序提交给 RDMA 网卡(HCA)的操作指令,包括发送、接收、RDMA Read/Write 等 |
工作队列 (Work Queue, WQ) | 存储待处理工作请求的队列 |
完成队列 (Completion Queue, CQ) | HCA 返回操作结果的队列 |
完成事件 (Completion Event) | 标识特定工作请求的完成状态 |
异步操作流程
- 提交请求:应用程序将工作请求(如发送数据)放入工作队列
- 立即返回:函数调用立即返回,应用程序继续执行后续代码
- 硬件执行:HCA 从工作队列取出请求并异步执行
- 完成通知:HCA 将操作结果(成功 / 失败)放入完成队列
- 轮询 / 中断:应用程序通过轮询或中断机制检查完成队列
五、RDMA通信协议
IB(InfiniBand)、 以太网RoCE(RDMA over Converged Ethernet)、 以太网iWARP(internet Wide Area RDMA Protocal) 三种技术都可以使用同一套API来使用,但它们有着不同的物理层和链路层
InfiniBand(IB)
InfiniBand,到底是个啥? - 知乎 (zhihu.com)
专为高性能、低延迟、高带宽的互联场景设计的全栈式通信协议
不仅定义了物理层和链路层规范,还包含了完整的传输层、网络层及应用接口,是 RDMA 技术落地的核心载体。
InfiniBand 的核心通信机制:
InfiniBand 的通信模型围绕队列对(Queue Pair, QP) 和内存注册展开,是实现 RDMA 特性的关键
队列对(QP):通信的端点
每个 InfiniBand 设备(如 HCA,主机通道适配器)上的通信端点,由发送队列(Send Queue, SQ)和接收队列(Receive Queue, RQ)组成。
- 应用程序通过向 SQ 提交 “工作请求(Work Request, WR)” 发起通信(如发送数据、RDMA Read);
- 远程节点通过 RQ 接收请求,并通过 “完成队列(Completion Queue, CQ)” 返回操作结果;
- QP 之间通过全局唯一标识符(QPN,Queue Pair Number) 识别,类似网络中的端口号。
内存注册:实现 “直接访问”
应用程序将用户态内存缓冲区注册到 HCA,使其被远程节点可见并可直接访问。
- 生成本地密钥(LKey) 和远程密钥(RKey),用于权限验证(防止非法访问);
- 锁定内存物理地址(避免虚拟内存换页导致地址失效),确保 RDMA 操作的稳定性;
- 支持 “零拷贝” 传输:数据直接在内存与 HCA 间传输,无需内核缓冲区中转。
InfiniBand 定义了多种传输类型,满足不同可靠性和延迟需求(可靠/不可靠连接、可靠/不可靠数据报),根据场景灵活选择
RoCE
太好了!终于有人肝了一夜,总结了RoCE!是个网工都想学习! - 知乎 (zhihu.com)
RoCE(RDMA over Converged Ethernet)是将 RDMA(远程直接内存访问)技术与以太网相结合的通信协议,旨在利用现有以太网基础设施实现高性能、低延迟的数据传输。
通过在以太网帧中封装 RDMA 操作,使应用程序能够在不改变网络基础架构的前提下,获得接近 InfiniBand 的性能优势。
RoCE 采用与 InfiniBand 相同的异步编程模型
RoCEv1:
基于以太网二层(MAC 层)直接传输 RDMA 帧,不依赖 IP 层
仅支持无损以太网(如 DCB,Data Center Bridging)
适用于封闭网络环境(如单一数据中心内)不支持三层路由,跨子网通信需额外配置;依赖严格的无损网络,部署复杂度高
RoCEv2:
在 UDP/IP 层封装 RDMA 帧(UDP 端口 4791),支持三层路由
兼容标准以太网交换机(需支持 ECN,显式拥塞通知)
引入基于优先级的流控制(PFC,Priority-based Flow Control)支持跨子网通信,扩展性更强;降低对无损网络的依赖,部署更灵活;
RoCE依赖以下技术确保以太网的无损传输:
PFC(Priority-based Flow Control):
基于 IEEE 802.1Qbb 标准,为特定优先级流量提供暂停机制;
当交换机缓冲区接近满时,向发送方发送 PAUSE 帧,防止丢包。
ECN(Explicit Congestion Notification):
基于 IEEE 802.1Qau 标准,交换机通过标记 IP 报头通知发送方拥塞;
发送方动态调整发送速率,避免网络拥塞。
iWARP
19. RDMA之iWARP & Soft-iWARP - 知乎 (zhihu.com)
基于 TCP/IP 协议栈实现远程内存直接访问,旨在提供跨广域网的高性能通信能力。与 InfiniBand 和 RoCE 不同,iWARP 不依赖专用网络或无损以太网,而是通过 TCP 协议的可靠性保障 RDMA 操作的正确性,同时利用硬件卸载减轻 CPU 负担。
iWARP 并非简单地在 TCP 上封装 RDMA,而是通过以下方式优化性能:
- 硬件卸载:将 TCP 连接建立、数据确认、重传等操作卸载到网卡(RNIC);
- 零拷贝传输:数据直接在用户空间内存与网卡间传输,无需内核缓冲区;
- 异步操作:采用与 InfiniBand 相同的异步完成队列模型,减少 CPU 等待时间。
基于TCP的可靠性保证:iWARP 利用 TCP 的连接管理、顺序交付、错误恢复、拥塞控制这几个特性确保数据传输的可靠性
连接管理:通过 TCP 的三次握手建立可靠连接;
顺序交付:依赖 TCP 的序列号机制保证数据按序到达;
错误恢复:利用 TCP 的重传机制处理丢包;
拥塞控制:继承 TCP 的拥塞控制算法(如 CUBIC、BBR),适应广域网络环境。
RDMA操作封装:iWARP将RDMA操作(如Read/Write)封装在 TCP 报文中
CPU 卸载与零拷贝:iWARP网卡(RNIC)承担了大部分网络处理任务 RNIC 处理 TCP 连接建立、ACK 生成、重传等,整个过程无需内核参与,实现零拷贝。
异步完成通知:与其他 RDMA 协议类似,iWARP 采用异步完成队列(CQ)机制
应用程序提交操作后继续执行其他任务;
RNIC 处理请求并将结果写入完成队列;
应用程序通过轮询或中断检查完成队列,获取操作状态。
【这些只是简单帮助理解RDMA技术是如何发挥作用的以及一些主要的技术特点,后面会继续深入学习总结】