SNIA研讨会
在当今人工智能、机器学习、高性能计算和数据中心迅速发展的时代,RDMA(Remote Direct Memory Access,远程直接内存访问)因其高吞吐、低延迟的数据传输能力而变得至关重要。这项技术提升了系统的可扩展性,降低了CPU开销,并能高效处理海量数据,使其成为现代计算环境中的关键组成部分。那么,RDMA实际上是如何工作的呢?
本文整理自SNIA研讨会,在本研讨会的分享中,分享者将回顾RDMA的发展历史、深入探讨其显著优势、详细介绍其工作机制,主要包括:
- 了解RDMA技术的发展历程和演进
- 全面认识RDMA及其在现代计算中的作用
- 深入探讨RDMA的具体实现方式
- 解释Verbs API、RoCE和InfiniBand
RDMA概述
RDMA的概念
RDMA是基于DMA(Direct Memory Access,直接内存访问)发展而来。DMA是一种在不经过CPU的情况下由硬件直接在内存和设备之间传输数据的机制。例如,磁盘、打印机、扫描仪等外设通过DMA控制器,可以直接读取或写入主内存,从而减少CPU的参与,提高数据传输效率。RDMA是DMA 的一种扩展,它把DMA的理念应用到了网络传输中。它允许一台机器可以直接读写另一台机器的内存,而无需经过双方CPU的参与 。由于RDMA跳过了传统网络通信中的操作系统协议栈(如 TCP/IP),因此能够实现极低延迟、高吞吐的数据通信。
因此,RDMA本质上是通过网络来远程做DMA,它在底层仍然依赖DMA来搬运数据,但是在网络协议和硬件的支持下,将操作拓展到了远程机器上。
在40Gbps网络的实验中,RDMA相较于TCP在吞吐、时延、CPU利用率表现出显著的优势,同时在各种消息大小下均表现出了更好的性能稳定性。
RDMA概念于20世纪90年代初被提出,并得到了初步的研究。1999年InfiniBand协会成立,2000年协会发布了首个版本的InfiniBand架构规范,该规范定义了协议栈的二层至四层的规范,InfiniBand开始在高性能计算领域获得了一定的应用,但因其定制化的协议栈,未能像TCP/IP和以太网那样广泛普及。2010年RoCE(RDMA over Converged Etherner)出现,2014年RoCE v2发布,RoCE v2凭借着优异的性能与对以太网的兼容性,在数据中心领域得到了广泛的应用,也因而推动了RDMA在数据中心的快速发展。与此同时,NVMe over Fabrics也进一步促进了RDMA在存储数据中心的应用。如今,RDMA在AI、高性能计算、云计算等领域发挥着关键作用。
TCP/IP vs RDMA
在传统的基于TCP/IP的网络中,应用程序需要通过如socket之类的系统调用接口与操作系统交互,由操作系统完成连接建立、数据收发等工作。相比之下,RDMA 在初始化阶段仅需操作系统协助完成资源配置(如内存注册和连接建立),此后数据传输过程完全绕过操作系统,应用程序可以直接访问远程内存,实现高效、低延迟的消息传递,进而可显著提升分布式应用的通信效率。
除此之外,借助MPI(Message Passing Interface)等标准化框架,开发者可基于统一接口构建高性能应用,而无需关心底层RDMA实现细节。由于MPI与RDMA深度兼容,应用层代码在不同的RDMA传输协议(如RoCE和InfiniBand)之间切换时无需修改,从而提高了系统的灵活性和可移植性。
Socket通信:
-
发送端和接收端通过Socket库提供的接口建立连接,并分别在内存中申请好用于发送和接收的Socket Buffer
-
发送端APP通过Socket接口陷入内核态,将数据从用户空间Buffer复制到内核空间的Socket Buffer中,待发送数据经过TCP/IP协议栈的一层层封装
-
发送端通过网卡驱动,告知网卡可以发送数据了,网卡将通过DMA从Socket Buffer中复制封装好的数据包到内部缓存中,然后将其发送到物理链路
-
接收端网卡收到数据包后,将数据包拷贝至Socket Buffer,然后经过一系列的多层网络协议对数据包进行解析,取出有效的数据
-
接收端APP通过Socket接口陷入内核态,CPU将数据从内核空间的Socket Buffer复制到用户空间Buffer
传统的TPC/IP存在的问题主要是:需要频繁的上下文切换、内存拷贝、CPU的解析处理。
RDMA采用了数控分离的模式:
- 控制通路:需要内核的参与(用户态应用 → 用户态驱动 → Linux内核 → 内核驱动 → RDMA网卡),用于创建和管理数据传输时所需要的资源,虽然这部分操作虽然需要较长的执行时间,不过实际执行的次数较少。
- 数据通路:不需要内核的参与(用户态应用 → 用户态驱动 → RDMA网卡),用于传输业务数据。
RDMA中SEND-RECV的流程:
- 发送端和接收端分别通过控制通路陷入内核态创建好通信所需要的内存资源
- 在数据通路上,接收端APP通知RDMA网卡准备接收数据,告诉RDMA网卡将接收到的数据放在内存中的位置
- 在数据通路上,发送端APP通知RDMA网卡准备发送数据,告诉硬件待发送数据位于内存中的位置
- 发送端RDMA网卡从内存中搬移数据,组装报文发送给对端
- 接收端RDMA网卡收到报文,对其解析并通过DMA将有效载荷直接写入内存
- 接收端RDMA网卡通知上层APP,告知其数据已接收并存放到内存的指定位置
因此,RDMA的数据收发旁路了内核,并且并不需要CPU参与,其报文的封装和解析是由RDMA网卡硬件完成的。
项目 | TCP/IP | RDMA |
---|---|---|
零拷贝 | 否,多次复制(用户态 → 内核态 → 网卡) | 是,数据可直接在用户态缓冲区与网卡之间传输 |
内核旁路 | 否,传输过程中需要频繁的系统调用和上下文切换 | 是,初始化后数据传输在用户态完成,无需内核干预 |
CPU干预 | 高,数据搬运和协议处理均依赖CPU | 低,数据传输由NIC执行,CPU仅参与控制 |
传输类型 | 基于字节流(stream-based) | 基于离散消息(message-based) |
分散/聚合技术 | 不支持,需要手动实现 | 原生支持Scatter/Gather |
I/O操作类型 | 同步,阻塞为主 | 异步,非阻塞 |
TCP/IP优势 | 通用性强、部署简单、硬件通用、开发门槛低 | — |
RDMA劣势 | — | 暴露底层细节、对网络质量敏感、开发复杂、InfiniBand成本较高 |
应用场景 | 一般互联网通信、Web服务等 | 高性能计算、AI训练、分布式存储等 |
其中,字节流表示传输的数据是连续的、不带边界的字节序列,就像一个水管源源不断地输送水流,发送方分几次发,接收方不知道原来分几次发的。例如如果发射端发送两次send(“hello”) + send(“world”),接收端可能一次性收到"helloworld",也可能先收到"hel",再收到"loworld",完全不可预知。
其中,离散消息表示每次发送/接收的都是一条独立完整的消息,有明确的边界,就像“发一封信”或“发一个包裹”。因此,每个消息有自己的边界,发送方发几次消息,接收方就能收到几次。
其中,分散/聚合是一种内存操作技术,在高性能通信或 I/O 系统中非常常见,主要用于高效处理非连续内存数据块。分散指把一个连续的输入缓冲区拆分到多个非连续的内存位置,聚合指把多个非连续的内存块聚合成一个逻辑整体,一次性发送或处理。RDMA原生支持分散/聚合,也就是可以用一个RDM 请求读写多个内存区域,无需手动拷贝或合并,提高了性能。
RDMA技术细节
操作类型
RDMA操作分为通道语义操作(Channel Semantics)和内存语义操作(Memory Semantics)两种类型,通道语义操作包括SEND和RECV操作,内存语义操作包括READ、WRITE和原子操作。
SEND和RECV是两种不同的操作类型,但是如果发送方进行SEND操作,接收方必须进行RECV操作,因此SEND/RECV被称为双端操作。发送方发送消息时无需知道数据在接收方的存储位置,因此接收方需提前准备好Buffer,并告知硬件将收到的数据存放在什么地址。
WRITE全称是RDMA WRITE操作,是本端主动写入远端内存的行为,除了准备阶段,远端CPU不需要参与,也不感知何时有数据写入、数据在何时接收完毕。所以这是一种单端操作。READ是WRITE的相反过程,是本端主动读取远端内存的行为,远端CPU不同样需要参与,也不感知数据在内存中被读取的过程。
原子操作是本节点直接对远程节点的内存执行操作,而无需远程CPU的参与。常见的原子操作有:Compare and Swap(比较并交换),如果远程内存中的值等于给定值,则替换为新值,可用于实现自旋锁、互斥等机制;Fetch and Add(获取并加),获取远程内存中的当前值,并将其加上一个给定值,可用于计数器、队列索引递增等。
通道语义操作更像是支持零拷贝和协议栈卸载的传统模式,常用于两端交换控制信息等场景。当涉及大量数据的收发时,更多使用的是性能更强的内存语义操作。
RDMA基本元素
QP
队列对 (Queue Pair,QP):在RDMA通信模型中,QP是端到端通信的基本结构单位,每个QP由一个发送队列(Send Queue, SQ)和一个接收队列(Receive Queue, RQ)组成,每个QP都有一个节点内唯一的队列对编号(Queue Pair Number,QPN),此外每个进程不仅可以申请和使用多个QP。
工作队列(Work Queue,WQ):WQ 是实际承载RDMA操作请求的队列结构,SQ和RQ都是WQ。WQ以先进先出(FIFO)的方式管理请求,确保操作顺序的一致性。应用程序通过将操作请求提交到相应的工作队列中,触发底层硬件执行具体的RDMA操作。SQ中存放WRITE、READ、SEND等操作请求,RQ中存放的是RECV的操作请求。
工作队列项(Work Queue Entry,WQE):WQE 是工作队列中具体的操作单元,描述了每一个RDMA操作的详细参数,如操作类型(WRITE、READ、SEND、RECV等)、内存地址、数据长度、远程地址等,例如“把位于地址0x12345678的长度为12字节的数据发送给远程节点B的QP2”。应用将WQE提交至工作队列后,RDMA网卡会异步地处理这些请求,并将完成结果写入完成队列(Completion Queue,CQ)。WQE的设计使得RDMA能够高效支持零拷贝和内核旁路机制,是实现高性能通信的核心基础。
CQ
应用程序在QP上提交WQE,该WQE被RDMA网卡完成后,会在对应的CQ中生成完成队列项(Completion Queue Entry,CQE),用于通知应用程序WQE已完成。节点内的每个CQ都有一个唯一的完成队列编号(Completion Queue Number,CQN)。
多个QP可以使用一个CQ,与此同时QP的SQ和RQ也可以映射到相同或不同的CQ。由于每个应用程序可以拥有多个QP,自然而然地,每个应用程序也可以拥有多个CQ。
应用程序可通过轮询或事件机制检测这些 CQE,以获取操作完成的信息:轮询模式适用于追求低延迟和高吞吐量的场景,但会消耗较多CPU资源;中断模式可降低CPU使用率,应用程序仅在收到事件通知时读取CQ,需向RDMA网卡注册以接收CQ更新通知。
MR
内存区域(Memory Region,MR):MR是应用程序注册的一段内存区域,注册之后,RDMA网卡可以对这段内存进行直接的读写操作。MR有以下功能:
- 实现虚拟地址(Virtual Address,VA)到物理地址的转换:在注册MR的过程中,RDMA网卡驱动程序会创建MR地址转换表,实现虚拟地址到物理地址的映射
- 内存访问权限控制:在注册MR的过程中,RDMA网卡驱动程序会返回两个关键的密钥:L-KEY(Local Key)供本地应用程序使用,用于本地数据传输;R-KEY(Remote Key)供远程应用程序使用,用于远程访问这段内存
- 锁页:在注册MR的过程中实现锁页,可以避免内容被换页到硬盘
在READ、WRITE操作时,即需要提供数据的虚拟地址、偏移量、长度、本地密钥或远程密钥。
在提交WQE时,可使用分段/聚合技术,分段聚合表(Scatter/Gather List,SGL)则是最基本的数据组织形式,SGL的元素被称之为分段聚合元素(Scatter/Gather Element,SGE),每一个SGE标识着一个数据段,可指向不同的MR和内存偏移。具体而言,Scatter是指将一段连续的本地缓冲区数据分散写入到远端主机的多个不连续缓冲区中,Gather则是将本地多个不连续缓冲区的数据聚合读取到远端主机的一段连续缓冲区中。
在RDMA通信中,应用程序首先将需要操作的数据缓冲区注册为MR,并获得L_KE与R_KEY以允许RDMA网卡直接访问该区域。通信双方各自维护一对QP,每对QP包含一个SQ和一个RQ,应用程序通过向WQ提交WQE发起操作请求,每个WQE描述一次操作的本地内存地址、远端内存地址和相关权限信息。在完成操作后,RDMA网卡会将结果写入CQ,以通过CQE通知应用程序操作状态。整个过程绕过操作系统内核,避免不必要的上下文切换和数据拷贝,从而实现低延迟、高吞吐、低 CPU 占用的数据传输。
PD
SRQ
RDMA连接管理
RDMA Verbs
RDMA原理示例
初始化
建立连接
基于SEND/RECV操作交换密钥
READ/WRITE
传输层和拥塞控制
InfiniBand、RoCE、iWARP三种协议都符合RDMA标准,并共享相同的Verbs接口:
- InfiniBand:对从链路层到传输层均进行了定义与规范,尽管能够实现最优异的RDMA性能,然而其无法兼容现有以太网,在部署时需要InfiniBand网卡、InfiniBand交换机,部署成本极高
- RoCE:基于以太网的RDMA协议,凭借着兼容传统交换设备的能力,能以更低的部署成本实现较好的性能(InfiniBand使用credit-based机制实现无损网络,为实现类似InfiniBand的性能,RoCE需要无损以太网的支持,例如通过PFC机制实现),RoCE包括RoCE v1和RoCE v2两个版本:
- RoCE v1:其链路层使用以太网协议,而网络层、传输层仍采用InfiniBand规范
- RoCE v2:其链路层使用以太网协议,网络层采用IP+UDP的方式,输层仍采用InfiniBand规范
- iWARP:是IETF基于TCP提出的,其链路层采用以太网协议、网络层采用IP+TCP的方式、传输层采用定制化的iWARP协议,TCP在面对有损网络时能够为RDMA带来更好的可靠性,然而复杂的TCP协议(例如大量的连接管理、拥塞控制、丢包重传机制)会造成严重的性能问题与规模扩展问题
特性 | InfiniBand | RoCE v1 | RoCE v2 | iWARP |
---|---|---|---|---|
标准组织 | IBTA | IBTA | IBTA | IETF |
链路层 | IB链路层 | 以太网 | 以太网 | 以太网 |
网络层 | IB网络层 | IB网络层 | IP + UDP | IP + TCP |
传输层 | IB传输层 | IB传输层 | IB传输层 | iWARP |
性能 | 最优 | 与InfiniBand相当 | 与InfiniBand相当 | 受TCP影响较差 |
兼容性 | 不兼容以太网 | 兼容以太网 | 兼容以太网,且支持跨子网 | 完全兼容以太网,但扩展性差 |
RDMA的应用案例
小结
资料传送门
会议链接:Everything You Wanted to Know About RDMA But Were Too Proud to Ask | SNIA | Experts on Data
源讲义下载:Everything-You-Wanted-to-Know-About-RDMA-But-Were-Too-Proud-to-Ask-Final-v2.pdf
相关资料: