DMA、RDMA 基础概念
传统的网络通信方式
RDMA 详解
RDMA 基本操作
RDMA 三种不同的硬件实现
RDMA 工作流程
RDMA 具体操作
DMA 传输将数据从一个地址空间复制到另外一个地址空间。当 CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器 来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有影响 CPU 的工作,反而可以去处理其他的工作。DMA 传输对于高性能嵌入式系统和网络是很重要的。
RDMA(Remote Direct Memory Access)技术全称远程直接内存访问,就是为了解决网络传输中客户端与服务器端数据处理延迟而产生的。它将数据直接从一台计算机的内存传输到另一台计算机,无需操作系统 的介入。这允许高吞吐、低延迟的网络通信,尤其适合应用在大规模并行计算机集群中。RDMA 通过网络把数据直接传入计算机的内存中,将数据从一个系统快速移动到远程系统内存中,而不对操作系统造成任何影响,这样就不需要占用很多计算机的处理能力。它消除了数据包在用户空间和内核空间复制移动和上下文切换的开销,因而能解放内存带宽和 CPU 周期用于改进应用系统性能。
传统的 TCP/IP 网络通信,数据需要通过用户空间发送到远程机器的用户空间。数据发送方需要将数据从用户空间 buffer 复制到内核空间的 socket buffer 中。然后内核空间中添加数据包头,进行数据封装。通过一系列多层网络协议的数据包处理工作,这些协议包括传输控制协议(TCP)、用户数据报协议(UDP)、互联网协议(IP)等。数据才被 push 到 NIC 网卡中的 buffer 进行网络传输。消息接收方接收从远程机器发送的数据包后,要将数据包从 NIC buffer 中复制数据到 socket buffer。然后经过一些列的多层网络协议进行数据包的解析工作。解析后的数据被复制到相应位置的用户空间 buffer。这个时候再进行系统上下文切换,用户应用程序才被调用。以上就是传统的 TCP/IP 协议层的工作。
传统的 TPC/IP 存在的问题主要是指 I/O 瓶颈问题。在高速网络条件下与网络 I/O 相关的处理的高开销限制了机器之间发送数据的带宽。这里的高额开销是数据移动操作和复制操作。具体来讲,主要是传统的 TCP/IP 网络通信是通过内核发送消息。通过内核的消息传递(Messaging passing through kernel),这种方式会导致性能和灵活性很低。其中性能低的原因主要是由于网络通信通过内核传递,这种通信方式存在大量的数据移动和数据复制的开销。并且现如今内存带宽相较如CPU带宽和网络带宽有着很大的差异。其中灵活性低的原因主要是所有网络通信协议通过内核传递,这种方式很难去支持新的网络协议和新的消息通信协议以及发送和接收接口。
RDMA(Remote Direct Memory Access)技术全称远程直接内存访问,就是为了解决网络传输中服务器端数据处理延迟而产生的。RDMA 主要有以下三个特性:(1) 低延时、(2) 低 CPU 占用率、(3) 高带宽。
RDMA 通过专有的 RDMA 网卡 RNIC(RDMA-aware Network Interface Controller),绕过内核直接从用户空间访问 RDMA enabled NIC 网卡。RDMA 提供一个专有的 Verbs Interface 而不是传统的 TCP/IP Socket Interface。要使用 RDMA 首先要建立从 RDMA 到应用程序内存的数据路径 ,可以通过 RDMA 专有的 Verbs Interface 接口来建立这些数据路径,一旦数据路径建立后,就可以直接访问用户空间 buffer。
使用 RDMA 的优势有:
零拷贝(Zero-copy):应用程序能够直接执行数据传输,在不涉及到网络软件栈的情况下,数据能够被直接发送到缓冲区或者能够直接从缓冲区里接收。
内核旁路(Kernel bypass):应用程序可以直接在用户态执行数据传输,不需要在内核态与用户态之间做上下文切换。
不需要CPU干预(No CPU involvement):应用程序可以访问远程主机内存而不消耗远程主机中的任何 CPU。远程主机内存能够被读取而不需要远程主机上的进程(或CPU)参与。远程主机的CPU的缓存(cache)不会被访问的内存内容所填充。
消息基于事务(Message based transactions):数据被处理为离散消息而不是流,消除了应用程序将流切割为不同消息/事务的需求。
支持分散/聚合条目(Scatter/gather entries support):RDMA原生态支持分散/聚合。也就是说,读取多个内存缓冲区然后作为一个流发出去或者接收一个流然后写入到多个内存缓冲区里去。
Memory verbs:包括 RDMA read、write 和 atomic 操作,这些操作指定远程地址进行操作并且绕过接收者的 CPU。
Messaging verbs:包括 RDMA send、receive 操作,这些动作涉及的接收方 CPU,发送的数据被写入由接收方的 CPU 事先指定的接收地址中。
RDMA传输分为可靠和不可靠,并且可以再分为连接和不连接(数据报)。凭借可靠的传输,NIC使用确认来保证消息的按序传送。不可靠的传输不提供这样的保证。然而,像 InfiniBand 这样的现代 RDMA 实现使用了一个无损链路层。因此,不可靠的传输很少会丢弃数据包。 目前的 RDMA 硬件提供一种数据报传输:不可靠的数据报(UD),并且不支持 memory verbs。
目前 RDMA 有三种不同的硬件实现。分别是 InfiniBand、iWarp(internet Wide Area RDMA Protocol)、RoCE(RDMA over Converged Ethernet)。
目前,大致有三类 RDMA 网络,分别是 Infiniband、RoCE、iWARP。其中,InfiniBand 是一种专为 RDMA 设计的网络,从硬件级别保证可靠传输 , 而 RoCE 和 iWARP 都是基于以太网的 RDMA 技术,支持相应的 verbs 接口。如图所示不难发现, RoCE 协议存在 RoCE v1 和 RoCE v2 两个版本,主要区别 RoCE v1 是基于以太网链路层实现的 RDMA 协议(交换机需要支持PFC等流控技术,在物理层保证可靠传输),而 RoCE v2 是以太网 TCP/IP 协议中 UDP 层实现。很明显 Infiniband 网络的性能最好,但网卡和交换机是价格也很高,而 RoCE v2 和 iWARP 仅需使用特殊的网卡就可以了,价格也相对便宜很多。
InfiniBand:支持 RDMA 的新一代网络协议。 由于这是一种新的网络技术,因此需要支持该技术的 NIC 和交换机。
RoCE:一个允许在以太网上执行 RDMA 的网络协议。其较低的网络标头是以太网标头,其较高的网络标头(包括数据)是 InfiniBand。该模式支持在标准以太网基础设施(交换机)上使用 RDMA。这需要网卡支持 RoCE。
iWARP:一个允许在 TCP 上执行 RDMA 的网络协议。iWARP 提供的功能较 IB 和 RoCE 而言较少,但是它支持在标准以太网基础设施(交换机)上使用 RDMA。 只有网卡应该是特殊的,并且支持 iWARP,否则所有 iWARP 堆栈都可以在 SW 中实现,并且丧失了大部分 RDMA 性能优势。
RDMA 提供了基于消息队列的点对点通信,每个应用都可以直接获取自己的消息,无需操作系统和协议栈的介入。RDMA 宏观工作流程:① 初始化上下文信息,注册内存域; ② 建立 RDMA 链接; ③ 服务器和客户端通过 send/receive 操作交换信息; ④ 通过 read/write 操作进行数据传输; ⑤ 传输完成后发送 MSG_DONE 消息,关闭连接。
内存注册(Memory Registration)
创建两个 key(local 和 remote)指向需要操作的内存区域,注册的 keys 是数据传输请求的一部分。同时,RDMA 硬件对用来做数据传输的内存是有特殊要求的。
(1) 在数据传输过程中,应用程序不能修改数据所在的内存。
(2) 操作系统不能对数据所在的内存进行 page out 操作,即物理地址和虚拟地址的映射必须是固定不变的。
队列信息
消息服务建立在通信双方本端和远端应用之间创建的 Channel-IO 连接之上。当应用需要通信时,就会创建一条 Channel 连接,每条 Channel 的首尾端点是两对 Queue Pairs(QP)。
每对 QP 由 Send Queue(SQ)和 Receive Queue(RQ)构成,这些队列中管理着各种类型的消息。QP 会被映射到应用的虚拟地址空间,使得应用直接通过它访问 RNIC 网卡。
除了 QP 描述的两种基本队列之外,RDMA 还提供一种队列 Complete Queue(CQ),CQ 用来告知用户 WQ 上的消息已经被处理完。
RDMA 提供了一套软件传输接口,方便用户创建传输请求 Work Request(WR),WR中描述了应用希望传输到 Channel 对端的消息内容,WR 通知 QP 中的某个队列 Work Queue(WQ)。
在 WQ 中,用户的 WR 被转化为 Work Queue Element(WQE)的格式,等待 RNIC 的异步调度解析,并从 WQE 指向的 buffer 中拿到真正的消息发送到 Channel 对端。
RDMA 传输数据时的流程可以简单理解为:
(1) Host 提交工作请求(WR)到工作队列(WQ): 工作队列包括发送队列(SQ)和接收队列(CQ)。工作队列的每一个元素叫做 WQE, 也就是 WR。
(2) Host 从完成队列(CQ)中获取工作完成(WC):完成队列里的每一个叫做 CQE, 也就是 WC。
(3) 具有 RDMA 引擎的硬件就是一个队列元素处理器。RDMA 硬件不断地从工作队列(WQ)中去取工作请求(WR)来执行,执行完了就给完成队列(CQ)中放置工作完成(WC)。
read 和 write 是单边操作,只需要本端明确信息的源和目的地址,远端应用不必感知此次通信,数据的读或写都通过 RDMA 在 RNIC 与应用 buffer 之间完成,再由远端 RNIC 封装成消息返回到本端。RDMA 读操作本质上就是把远程系统内存里的数据拉回到本地系统的内存里。此时需要:① 接收方必须提供虚拟地址和目标存储内存的 remote_key。② 接收方需要初始和接受提醒通知,发送方是完全被动的,并且不会接受任何通知。
(1) 首先 A、B 建立连接,QP 已经创建并且初始化。
(2) 数据被存在 B 的 buffer 地址 VB,注意 VB 应该提前注册到 B 的 RNIC(并且它是一个Memory Region),并拿到返回的 local key,相当于 RDMA 操作这块 buffer 的权限。
(3) B 把数据地址 VB,key 封装到专用的报文传送到 A,这相当于 B 把数据 buffer 的操作权交给了 A。同时 B 在它的 WQ 中注册进一个 WR,以用于接收数据传输的 A 返回的状态。
(4) A 在收到 B 的送过来的数据 VB 和 R_key 后,RNIC 会把它们连同自身存储地址 VA 到封装 RDMA read 请求,将这个消息请求发送给 B,这个过程 A、B 两端不需要任何软件参与,就可以将 B 的数据存储到 A 的 VA 虚拟地址。
(5) A 在存储完成后,会向 B 返回整个数据传输的状态信息。
RDMA 写操作本质上就是把本地系统内存里的数据推送到远程系统的内存里。此时需要:① 发送方必须提供虚拟地址和目标读取内存的 remote_key。② 发送方需要初始和接受提醒通知,接受方是完全被动的,并且不会接受任何通知。
(1) 首先 A、B 建立连接,QP 已经创建并且初始化。
(2) 数据远程目标存储 buffer 地址 VB,注意 VB 应该提前注册到 B 的 RNIC(并且它是一个Memory Region),并拿到返回的 local key,相当于 RDMA 操作这块 buffer的权限。
(3) B 把数据地址 VB,key 封装到专用的报文传送到 A,这相当于 B 把数据 buffer 的操作权交给了 A。同时 B 在它的 WQ 中注册进一个 WR,以用于接收数据传输的 A 返回的状态。
(4) A 在收到 B 的送过来的数据 VB 和 R_key 后,RNIC 会把它们连同自身发送地址 VA 到封装 RDMA write 请求,这个过程 A、B 两端不需要任何软件参与,就可以将 A 的数据发送到 B 的 VB 虚拟地址。
(5) A 在发送数据完成后,会向 B 返回整个数据传输的状态信息。
单边操作传输方式是 RDMA 与传统网络传输的最大不同,只需提供直接访问远程的虚拟地址,无须远程应用的参与其中,这种方式适用于批量数据传输。
RDMA 中 send/receive 是双边操作,即必须要对端的应用感知参与才能完成收发工作。在实际中,send/receive 多用于连接控制类报文,而数据报文多是通过 read/write 来完成的。对于双边操作为例,主机 A 向主机 B(下面简称 A、B)发送数据的流程如下:
(1) A 和 B 都要创建并初始化好各自的 QP,CQ。
(2) A 和 B 分别向自己的 WQ 中注册 WQE,对于 A,WQ = SQ,WQE 描述指向一个等到被发送的数据;对于 B,WQ = RQ,WQE 描述指向一块用于存储数据的 buffer。
(3) A 的 RNIC 异步调度轮到 A 的 WQE,解析到这是一个 send 消息,从 buffer 中直接向 B 发出数据。数据流到达 B 的 RNIC 后,B 的 WQE 被消耗,并把数据直接存储到 WQE 指向的存储位置。
(4) AB 通信完成后,A 的 CQ 中会产生一个完成消息 CQE 表示发送完成。与此同时,B 的 CQ 中也会产生一个完成消息表示接收完成。每个 WQ 中 WQE 的处理完成都会产生一个 CQE。
双边操作与传统网络的底层 buffer pool 类似,收发双方的参与过程并无差别,区别在于零拷贝、内核旁路。实际上对于 RDMA,这是一种复杂的消息传输模式,多用于传输短的控制消息。
参考:
https://blog.csdn.net/qq_21125183/article/details/80563463
https://blog.csdn.net/qq_40323844/article/details/90680159
https://blog.csdn.net/NewB20143864/article/details/104781022