RDMA 高性能架构基本原理与设计方案

 在进行本文的学习学习之前,我们先对RDMA是什么做一个简单的科普与认识:一文带你了解什么是RDMA-CSDN博客

目录:

目录:

一、RDMA和传统网络方案的比较 

        1.1 传统网络方案:

1.1.1 缺点一:以太网卡(socket)通信过程

1.1.2 缺点二:以太网卡(socket)数据流

1.2 RDMA的方案

1.2.1 优点:RDMA的控制通路和数据通路

1.2.2 优点:RDMA 网卡的数据流 

二、RDMA协议类型

三、RDMA软件架构:

 四、RDMA 的基本元素和操作类型

4.1 WQ&WQE

4.1.1 工作队列元素(WQE)

4.1.2 工作队列(WQ)

4.1.3 关系与比较

4.2 QP(核心元素)

4.2.1 队列对(QP)

4.2.2 发送队列(SQ)

4.2.3 接收队列(RQ)

4.2.4 SEND-RECV流程

4.2.5 图示说明

4.2.6 队列对(QP)

4.2.7 QP编号(QPN)

4.2.8 通信流程

4.3 CQ

4.3.1 完成队列(CQ)

4.3.2 完成队列元素(CQE)

4.3.3 一般流程

4.4 RDMA Write操作(典型操作)

4.4.1 RDMA WRITE操作

4.4.2 地址转换

4.4.3 实际应用和性能优势

 4.5 Memory Region

4.5.1 Memory Region(MR)

4.5.2 解决问题

4.5.3 实际应用

4.6 RDMA各种元素的实体形式

4.7 典型实例

4.7.1 获取设备列表

4.7.2 打开请求的设备

 4.7.3 查询设备的工作能力

4.7.4 分配保护域和资源

4.7.5 注册内存区域

4.7.6 创建完成队列

4.7.7 创建队列对(QP)

4.7.8 提交 QP

4.7.9  发布工作请求并轮询完成

4.7.10 清理

五、RDMA 设计思路 

5.1 应用程序的执行流程和每一步的主要工作

5.2 设计思路

5.2.1 初始化和配置等低频操作可以进入内核态执行

5.2.2 数据传输等高频操作旁路内核

5.2.3 独立的QP、CQ资源保证多线程并发

5.2.4 小结

六、RDMA通信过程

6.1 连接建立:

6.2 队列对(QP)的初始化:

6.3 发送 RDMA 请求:

6.4 NIC 处理与数据传输:

6.5 数据确认与写入:

6.6 单边与双边操作:

6.6.1 单向通信-读Read

6.6.2 单向通信-写Write

6.6.3 双向通信-Send\Recv 


RDMA的主要优点包括低延迟、高吞吐量、减少CPU负担和支持零拷贝网络。它允许数据直接在网络接口卡(NIC)和内存之间传输,减少了数据传输过程中的中间环节,从而显著降低了延迟。RDMA技术能够实现高速的数据传输,适用于需要大量数据交换的应用场景。由于数据传输不需要CPU的参与,CPU可以更多地专注于计算任务,提高了系统的整体效率。RDMA的软件架构通常包括用户空间库、内核驱动和硬件设备三个主要部分。典型的应用场景包括高性能计算、数据中心网络和存储系统等RDMA的基本元素包括队列对、保护域和内存区域等,这些元素共同完成了RDMA通信的建立和数据传输。设计RDMA的主要思路是尽可能减少数据传输路径上的中间环节,降低延迟,提高吞吐量,并减轻CPU的负担。

如今随着社会的发展,我们希望更快和更轻量级的网络通信。 

一、RDMA和传统网络方案的比较 

1.1 传统网络方案:

1.1.1 缺点一:以太网卡(socket)通信过程

下图展示了使用传统以太网卡时,两台机器通讯过程中所需要的软件模块(分层)以及软硬件之间的关系。

传统的sendsendto等系统调用涉及了从用户态到内核态的转换,这一过程会增加数据传输的延迟。当应用程序使用这些系统调用发送数据时,数据首先会被复制到内核空间的缓冲区,然后才从内核发送到网络上。这种数据在用户空间和内核空间之间的复制操作,以及与之相关的上下文切换,是导致额外开销和延迟的主要原因。

1.1.2 缺点二:以太网卡(socket)数据流

下图展示了使用以太网卡(Socket模型)时,数据在两个运行在不同机器上的APP之间传导的过程。假设机器1为发送方,机器2为接收方。

传统网络数据传输过程中数据在用户空间、内核空间和硬件之间的流动过程:

  1. 用户空间至内核空间的数据复制:应用层通过系统调用(如sendsendto)将数据从用户空间传输到内核空间。这一步骤涉及CPU将数据复制到内核缓冲区中。

  2. 网络协议处理:一旦数据到达内核空间,内核中的网络协议栈会给数据添加必要的网络协议头(例如TCP/IP头),可能还会进行数据的分片和封装处理,并进行必要的校验。

  3. DMA传输到网卡使用DMA(Direct Memory Access)技术,数据从主机内存被高效地复制到发送端网卡的内部缓存中,准备发送到网络上。

  4. 通过物理链路发送数据发送端网卡处理完数据后,通过物理链路(例如以太网)将数据发送给对端设备的网卡。

  5. 接收端硬件DMA操作:接收端的网卡通过DMA操作将接收到的数据从网卡的缓存复制到系统内存中,这避免了CPU直接参与数据的初步传输过程。

  6. 数据处理与传递给用户空间:CPU介入处理接收到的数据包,如进行逐层的解析和校验等,最后将数据从内核空间复制到用户空间的应用程序中。

1. 用户空间与内核空间之间的数据复制:在传统的网络通信中,当应用程序需要发送数据时,它必须通过系统调用(如`send`或`sendto`)将数据从用户空间复制到内核空间。这个复制过程增加了数据传输的延迟,因为它需要CPU的直接参与。同样,在接收数据时,数据需要从内核空间复制到用户空间,这同样增加了

延迟。

2. CPU参与数据包的封装和解析:在发送数据时,CPU需要参与数据包的封装过程,包括添加各种网络协议头(如IP、TCP/UDP头)。在接收数据时,CPU需要对数据包进行解析和校验,以确保数据的完整性和正确性。这些操作在数据量较大时会对CPU造成较重的负担,因为CPU需要处理大量的数据包,这会占用大量的CPU资源,影响系统的整体性能

如上图,在传统模式下,两台服务器上的应用之间传输数据,过程是这样的: 

数据发送流程:

  1. 数据拷贝到内核空间:数据首先需要从应用程序的用户空间缓存复制到内核空间的 Socket Buffer。这是为了让操作系统能够管理数据传输。

  2. 添加数据包头:在内核空间中,发送方的 TCP 协议栈会为数据包添加必要的协议头,进行数据封装,以便网络传输。

  3. 拷贝到网络驱动层:封装后的数据从内核空间的 Socket Buffer 复制到网络驱动层,以便将其发送到网络接口卡(NIC)。

  4. 存入网卡缓存:最终,数据被送入网卡的缓存中,准备进行网络传输。

数据接收流程:

  1. 接收数据包:当接收方的网络接口卡接收到来自远程机器的数据包时,数据包首先存储在 NIC Buffer 中。

  2. 复制到内核空间:接收方需要将数据包从 NIC Buffer 复制到内核空间的 Socket Buffer。这使得操作系统能够对接收到的数据进行处理。

  3. 解析数据包:在内核空间,操作系统会经过一系列网络协议的解析,对数据包进行处理和验证。

  4. 拷贝到用户空间:解析后的数据从内核空间的 Socket Buffer 被复制到接收方的用户空间缓存中,以便应用程序可以访问和使用这些数据。

  5. 上下文切换:一旦数据被复制到用户空间,系统会进行上下文切换,调用相应的用户应用程序以处理接收到的数据。

1.2 RDMA的方案

1.2.1 优点:RDMA的控制通路和数据通路

下图中有一左一右两台机器,可互相发送接收数据。在这里将RDMA的分层模型分成“控制通路"和“数据通路控制通路需要进入内核态准备通信所需的各种资源(如QP、MR等),数据通路负责数据收发(如RDMA Write:和RDMA Read)。

RDMA技术允许网络设备直接访问主机内存,而不需要CPU的介入。这使得数据可以在网络设备和内存之间直接传输,大大减少了延迟和CPU的负担。

1.2.2 优点:RDMA 网卡的数据流 

下图展示了使用RDMA网卡时,数据在两个运行在不同机器上的APP之间传递的过程。假设机器1为发送方,机器2为接收方。

  1. 发送端网卡的数据处理

    • 数据首先从用户空间通过系统调用(如sendsendto)复制到内核空间。
    • 内核中的网络协议栈负责添加各协议层头部(如IP、TCP/UDP头)和校验信息。
    • 然后,数据通过DMA(Direct Memory Access)技术从内核空间的缓冲区复制到发送端网卡的内部缓存中。
    • 发送端网卡通过物理链路将数据发送给对端的网卡。
  2. 接收端网卡的数据处理

    • 接收端网卡通过物理链路接收到数据后,首先进行初步处理,如校验和检查。
    • 如果校验通过,网卡会使用DMA技术将数据从网卡的内部缓存复制到内核空间的缓冲区。
    • 内核中的网络协议栈负责剥离各协议层头部和校验信息,并将数据传递给相应的套接字缓冲区(socket buffer)。
    • 最后,数据通过系统调用(如recvrecvfrom)从内核空间复制到用户空间的应用程序。

 零拷贝:避免了数据在用户空间和内核空间之间的多次拷贝,减少了数据传输的总体延迟,因为数据传输过程减少了对CPU的依赖,CPU资源可以被用于其他计算任务,从而提高了系统的整体效率,零拷贝使得数据传输过程更高效,网络带宽可以得到更充分的利用。

硬件协议处理:传统网络通信需要操作系统内核参与大量的协议处理工作,包括数据包的封装、解析和校验等。RDMA技术允许这些操作在硬件级别完成,极大地减轻了CPU的工作负担。硬件级别的数据包处理通常比软件实现更快,因为它可以并行处理多个操作,并专门针对这些任务进行优化。

Kernel BypassRDMA 提供一个专有的 Verbs interface 而不是传统的TCP/IP Socket interface。应用程序可以直接在用户态执行数据传输,不需要在内核态与用户态之间做上下文切换

以上RDMA (远程直接内存访问)整体框架的架构图显示了 RDMA 提供的一系列 Verbs 接口,这些接口允许应用程序在用户空间内直接操作 RDMA 硬件。与传统网络传输不同,RDMA 通过绕过内核,能够直接从用户空间访问 RDMA 网卡(RNIC)。RNIC,即 RDMA 网络接口卡,内部包含缓存页表条目(Cached Page Table Entry),用于将虚拟页面映射到对应的物理页面。这种设计显著提高了数据传输的效率和性能,减少了内存复制和延迟。

二、RDMA协议类型

RDMA指的是一种远程直接内存访问技术。具体到协议层面,它主要包含了Infiniband(IB),RDMA over Converged Ethernet(RoCE)和lInternet Wide Area RDMA Protocol(iWARP)三种协议。三种协议都符合RDMA标准,共享相同的上层用户接口(Vrbs),只是在不同层次上有一些差别。下图对比了这几个协议在不同层次的差异。

三、RDMA软件架构:

RDMA的软件架构在Linux系统中按层次可分为两部分,即rdma-core内核RDMA子系统,分别运行在用户态内核态。整个软件架构适用于所有类型的RDMA网卡,无论网卡硬件执行哪种RDMA协议(Infiniband、RoCE、iWARP)。

一个RDMA应用程序的部分流程:

 四、RDMA 的基本元素和操作类型

4.1 WQ&WQE

4.1.1 工作队列元素(WQE)

  • 作用WQE是RDMA硬件执行任务的指令单元。它包含了软件希望硬件执行的具体任务类型,如远程读取、远程写入、发送或接收等操作。
  • 内容每个WQE详细描述了任务的具体信息,包括数据所在的内存地址、数据长度、访问密钥(如用于保护内存区域的密钥)等。
  • 类比:在以太网方案中,描述符(Descriptor)也用于指导硬件如何处理数据包,但RDMA的WQE提供了更高级的抽象,直接指向内存区域,而不是单个数据包。

4.1.2 工作队列(WQ)

  • 作用WQ是容纳WQE的容器,类似于以太网方案中的发送/接收队列。
  • 结构WQ采用先进先出(FIFO)队列的形式,确保WQE按顺序被处理。
  • 类比:在以太网方案中,发送/接收队列用于管理待发送或待接收的数据包,而RDMA的WQ管理的是待执行的内存操作任务。

4.1.3 关系与比较

  • WQ与WQE的关系:WQ是WQE的集合,WQE是WQ中的元素。WQ管理着一系列WQE,确保它们按顺序被硬件处理。
  • 与以太网方案的比较虽然RDMA的WQ和WQE与以太网方案中的队列和描述符在功能上有相似之处,但RDMA提供了更直接的内存到内存的数据传输方式,减少了CPU的干预,从而实现了更高的性能和更低的延迟。

通过这种架构,RDMA技术能够高效地处理大规模的内存操作请求,非常适合高性能计算和数据中心等需要高速数据传输的场景。

4.2 QP(核心元素)

4.2.1 队列对(QP)

  • 定义QP是RDMA通信中的基本单元,由一对工作队列组成,即发送队列(SQ)和接收队列(RQ)。
  • 功能:QP用于管理发送和接收任务,确保数据传输的正确性和顺序。

4.2.2 发送队列(SQ)

  • 作用SQ专门用于存放发送任务的WQE。
  • 操作:发送端在需要发送数据时,会将表示发送任务的WQE放入SQ中(这种操作称为Post Send)。

4.2.3 接收队列(RQ)

  • 作用RQ专门用于存放接收任务的WQE。
  • 操作:接收端在需要接收数据时,会将表示接收任务的WQE放入RQ中(这种操作称为Post Receive),这样硬件在接收到数据后,就知道应该将数据放到内存中的哪个位置。

4.2.4 SEND-RECV流程

  • 发送端:发送端在执行发送操作时,会将发送任务的WQE放入SQ中,通知硬件执行发送操作。
  • 接收端:接收端在执行接收操作时,会将接收任务的WQE放入RQ中,通知硬件在接收到数据后,将数据放到指定的内存位置。

4.2.5 图示说明

  • 图示:下图展示了两个终端,左边的终端正在执行Post Send操作右边的终端正在执行Post Receive操作。这表明在RDMA通信中,发送和接收操作是并行进行的,且需要双方都准备好相应的队列和WQE。

4.2.6 队列对(QP)

  • 定义:在RDMA通信中,QP是基本的通信单元,它由一个发送队列(SQ)和一个接收队列(RQ)组成。QP是进程间通信的桥梁,而不是节点本身。

  • 使用每个节点上的每个进程都可以申请和使用多个QP。这些QP可以用于不同的通信目的,例如不同的数据流或不同的通信模式。

  • 连接每个本地QP可以“连接到”一个远端的QP。这种连接是通过网络建立的,使得本地QP中的发送任务能够发送到远端QP,而远端QP中的接收任务能够接收来自本地QP的数据。

  • 例子:节点A的进程2使用的QP2连接到了节点B的进程1使用的QP0。这意味着QP2中的发送任务将被发送到QP0,而QP0中的接收任务将等待来自QP2的数据。

4.2.7 QP编号(QPN)

  • 唯一标识每个节点的每个QP都有一个唯一的编号,称为QP编号(QPN)。QPN是一个整数,用于在网络中唯一标识一个QP。

  • 作用:通过QPN,通信双方可以准确地识别和定位到对方节点上的QP,从而确保数据能够正确地发送到目标QP。

4.2.8 通信流程

  • 建立连接:在进行RDMA通信之前,通信双方需要通过某种机制(如IBA或RoCE协议)交换QP信息,包括QPN和QP的状态。

  • 数据传输一旦QP连接建立,数据传输就可以通过这些QP进行。发送端将数据放入SQ,接收端将接收位置信息放入RQ,硬件根据这些信息直接在内存之间传输数据,无需CPU干预。

4.3 CQ

Completion Queue(完成队列,简称CQ)和CQE(Completion Queue Element,完成队列元素)的描述十分准确。

4.3.1 完成队列(CQ)

  • 定义:CQ是RDMA通信中的一个重要组成部分,它被设计来存放由硬件生成的完成报告,这些报告被称为CQE。

  • 功能CQ的主要作用是让软件知道其提交给硬件的工作请求(即WQE)何时被完成,以及完成的状态(成功或失败)。

4.3.2 完成队列元素(CQE)

  • 定义:CQE是CQ中的元素,它包含了某个WQE的完成信息,可以被视为硬件对软件的一种反馈。

  • 关系:每个CQE都与一个特定的WQE有关,表明该WQE的执行结果。硬件在完成一个WQE之后,会生成一个相应的CQE并放入CQ中。

  • 内容:一个CQE通常会包含以下信息:关联的WQE的标识、操作的状态(成功或失败)、如果失败了,失败的原因是什么,以及其他可能的信息。

4.3.3 一般流程

  • 提交任务:软件通过将WQE放入SQ或RQ来提交一个任务。

  • 完成任务:硬件根据WQE中的信息执行任务,然后生成一个CQE,包含该任务的完成信息,并将CQE放入CQ。

  • 检查结果:软件可以检查CQ,查看其提交的任务的完成情况。如果发现某个任务失败,还可以通过查看相应的CQE来了解失败的原因。

4.4 RDMA Write操作(典型操作)

4.4.1 RDMA WRITE操作

  • 基本定义RDMA WRITE操作允许一端的应用程序直接写入另一端的内存,而无需远端的CPU介入。这种操作的效率非常高,因为它减少了网络通信中的CPU使用和中断。

  • 单端操作这是一种单端操作,即只有数据的发送方(源端)需要主动执行操作,而接收方(目标端)的CPU并不参与数据的接收过程,也不会被通知数据的到达。这一点是RDMA技术区别于传统网络通信的显著特征。

4.4.2 地址转换

  • 虚拟地址操作操作的发起端通过虚拟地址来指定要写入的数据和目标内存的位置。这使得上层应用能够非常方便地控制数据的发送。

  • 地址转换虽然应用程序使用虚拟地址,但实际的内存访问需要物理地址。这一转换过程由RDMA网卡(也称为RNIC)负责。RNIC在执行数据传输前,会把虚拟地址转换为物理地址,确保数据能够正确地写入远端机器的物理内存。

4.4.3 实际应用和性能优势

  • 低延迟高效率:由于远端CPU不参与数据接收过程,RDMA WRITE操作可以实现极低的延迟和高吞吐量,这对于需要高性能计算和数据密集型应用(如数据中心和大规模分布式系统)非常有利。

  • 内存一致性:尽管远端CPU不直接参与,RDMA协议仍然能够保证内存的一致性和数据的正确性,通过硬件级别的同步机制来实现。

 4.5 Memory Region

4.5.1 Memory Region(MR)

  • 定义:MR是预定义的内存区域,它将一段虚拟内存映射到对应的物理内存。每个MR都有一个唯一标识符(Key或R_Key),这个标识符在RDMA操作中用来验证访问权限。

4.5.2 解决问题

   1. 虚拟地址到物理地址的转换

  • 当应用程序通过虚拟地址进行RDMA操作时,RDMA网卡(RNIC)需要知道相应的物理地址才能进行数据读写。使用MR时,RDMA网卡通过与操作系统内核协作,预先获得这段内存的虚拟地址到物理地址的映射。
  • 在MR创建时,操作系统的内存管理单元(MMU)会参与到MR的初始化,确保每个虚拟地址都能正确映射到物理地址。这样,当RDMA操作发生时,网卡能够直接使用这些信息进行高效的数据传输。

  2. 安全控制和访问权限验证

  • 为了防止恶意软件通过指定非法的虚拟地址来访问或篡改关键系统内存,MR在创建时需进行权限设置和验证。
  • 每个MR都与一个键(Key)关联,这个键在RDMA操作时需要被提供并验证。如果操作的Key与MR的Key不匹配,则操作将被拒绝,这样可以保证只有授权的操作才能访问特定的内存区域。
  • 操作系统在创建MR时可以对这段内存区域进行保护设置,防止它包含敏感或关键的系统数据。

4.5.3 实际应用

在实际应用中,通过合理配置和使用MR,可以确保RDMA操作的高效性和安全性。系统管理员或应用开发者需确保MR按需正确设置,既满足性能要求又确保系统安全。RDMA技术的这种设计使其非常适用于需要快速、直接内存访问的场景,如高性能计算和大规模存储系统。

4.6 RDMA各种元素的实体形式

所有的RDMA元素在实际方案中都以数据的形式体现、管理和使用。

下图简单展示了这些元素对应的数据的存放位置以及它们之间的关系。

4.7 典型实例

使用 RDMA(远程直接内存访问)技术对 IB(InfiniBand)设备进行操作的典型步骤。

4.7.1 获取设备列表

首先,通过查询系统的可用 IB 设备,获取设备列表。个设备通常会包含以下信息:

  • 设备名称:用于标识设备。
  • GUID:全局唯一标识符,确保在多个设备中唯一。

4.7.2 打开请求的设备

遍历设备列表,选择要打开的设备,通常可以通过设备的 GUID 或名称进行匹配和打开。

 4.7.3 查询设备的工作能力

打开设备后,查询其能力和特性,包括:

  • 支持的最大消息大小。
  • 支持的传输速率。
  • 特殊功能,如 RDMA 读/写、发送/接收等。

4.7.4 分配保护域和资源

保护域(Protection Domain, PD)用于限制组件间的交互,确保安全性。资源可以包括:

  • AH(地址句柄):用于表示远程目标。
  • QP(队列对):用于发送和接收请求。
  • MR(内存区域):表示已注册的内存区域。
  • MW(内存窗口)SRQ(共享接收队列)

4.7.5 注册内存区域

对要使用的内存区域进行注册,确保内存在 RDMA 操作中是可用的。注册时,设置内存权限,并获取:

  • 本地密钥(lkey):用于本地访问此内存区域。
  • 远程密钥(rkey):用于远程访问此内存区域。

4.7.6 创建完成队列

创建完成队列(Completion Queue, CQ),用于存储已完成的工作请求(Work Request, WR)。每个工作请求完成后,生成一个完成队列实体(Completion Queue Entry, CQE),指示工作请求的执行结果。

4.7.7 创建队列对(QP)

队列对用于发送和接收数据的操作。创建 QP 时,会自动创建相关的发送队列和接收队列。

4.7.8 提交 QP

创建的 QP 在使用前必须转换为特定的状态,最终进入 Ready To Send(RTS)状态,这样 QP 才能开始发送和接收数据。

4.7.9  发布工作请求并轮询完成

使用已创建的 QP 进行数据传输,发布工作请求,并通过轮询 CQ 来检查工作请求是否完成,处理 CQE 以了解结果。

4.7.10 清理

在完成所有操作后,按照创建对象的相反顺序进行清理,确保正确释放资源

  • 删除 QP。
  • 删除 CQ。
  • 取消注册内存区域(MR)。
  • 释放保护域(PD)。
  • 关闭设备。

五、RDMA 设计思路 

5.1 应用程序的执行流程和每一步的主要工作

 5.2 设计思路

5.2.1 初始化和配置等低频操作可以进入内核态执行

  • 目的和逻辑初始化和配置操作,如设置保护域(PD)、创建队列对(QP)、配置内存区域(MR)等,是设置RDMA环境的基础步骤。这些操作通常频率较低,但需要高权限和精确控制。
  • 内核态的优势在内核态执行这些操作可以利用操作系统提供的安全和管理机制。例如,操作系统能够管理和保护内存访问,防止非法访问,并且可以对硬件资源进行有效的配置和管理。

5.2.2 数据传输等高频操作旁路内核

  • 目的和逻辑:数据传输是RDMA的核心功能,特点是频繁且对延迟敏感。直接在用户态执行数据传输操作可以极大地减少上下文切换和系统调用的开销,从而降低延迟和提高吞吐量。
  • 旁路内核的实现:通过在用户空间提供直接访问网络接口和硬件的能力,避开传统的内核网络栈处理。这通常通过操作系统提供的特定API(如Linux的ibverbs库)实现,使得应用程序能直接与RDMA硬件交互。

5.2.3 独立的QP、CQ资源保证多线程并发

  • 目的和逻辑在RDMA中,每个队列对(QP)和完成队列(CQ)是执行数据传输和接收操作的基本单位。为每个连接或每个线程配置独立的QP和CQ,可以提高并发性,并减少资源争用。
  • 多线程并发的优势:当多个线程或多个应用同时进行RDMA操作时,各自使用独立的资源(QP和CQ)可以避免交互影响和锁竞争,提高系统的整体性能和响应速度。

5.2.4 小结

这三点设计思路共同体现了RDMA技术的高效性和并发性,是RDMA在高性能计算和大规模数据中心得以广泛应用的技术基础。通过智能地分配任务至内核态和用户态,以及优化资源管理,RDMA能够显著提高数据传输的效率并减少延迟,同时保证在高并发环境下的稳定性和可靠性。

六、RDMA通信过程

RDMA 是一种允许计算机直接读写远程主机内存的技术,能够提供极低的延迟和高吞吐量。这种机制使得应用程序在进行网络通信时可以避免传统的 TCP/IP 协议栈的开销。

6.1 连接建立

RDMA 操作的首要步骤是与远程主机建立连接。通过连接管理器(Connection Manager, CM)进行 QP 的信息交换,以确保两端的 QP 正确初始化。

6.2 队列对(QP)的初始化

每个 RDMA 连接都通过 QP 进行管理,类似于套接字(socket)。在 QP 建立后,应用程序可以使用 verbs API 来执行各种 RDMA 操作。

6.3 发送 RDMA 请求

当应用程序发起读或写请求时,数据直接从用户空间的应用程序发送到本地的网络接口控制器(NIC),无需内核介入。这种设计显著提高了性能,因为它减少了上下文切换和数据复制的需要。

6.4 NIC 处理与数据传输

本地 NIC 读取应用程序缓冲区中的内容,并通过网络将数据发送到远程 NIC。传输的信息包含虚拟地址、内存钥匙以及数据本身。

6.5 数据确认与写入

目标 NIC 确认内存钥匙的有效性后,直接将数据写入远程应用的缓冲区。远程虚拟内存地址在 RDMA 信息中被传递。

6.6 单边与双边操作

单边操作(如 Read/Write):本地端明确定义数据源和目的地址,远程应用不需要参与。这使得数据的读或写操作通过 RDMA 在本地 NIC 和远程应用缓冲区之间进行,减少了通信延迟。

双边操作(如 Send/Receive):需要远程应用的参与,通常用于控制消息的传递。数据报文的传输则通常通过 Read/Write 完成。这种模式确保双方能够进行有效的交互。

6.6.1 单向通信-读Read

RDMA 数据传输过程清晰地阐明了主机 A 和主机 B 之间如何通过 RDMA 操作实现高效的数据读取。

  1. 建立连接与初始化:主机 A 和 B 之间已经建立了连接,并且 QP(队列对)已经创建并初始化。

  2. 数据存储与注册:主机 B 将数据存储在其缓冲区中,地址为 VB。此地址在 B 的 RNIC(远程网络接口控制器)中进行了注册,形成一个内存区域(Memory Region)。B 收到了一个返回的本地密钥(local key),用于授权 RDMA 操作对该缓冲区的访问。

  3. 封装操作权信息:B 将数据的地址 VB 和对应的远程密钥(R_key)封装到专用报文中,并将其发送到 A。这一步骤相当于 B 将访问其数据缓冲区的权限转交给 A。

  4. 准备 RDMA 读取请求:在收到 B 发送的信息后,A 知道了 VB(数据地址)和 R_key。A 现在准备发送一个 RDMA 读取请求。此请求将本地存储数据的地址(VA)和接收到的 VB 地址连同 R_key 封装到读取请求消息中。

  5. 发送 RDMA 读取请求A 将封装好的读取请求消息发送到 B。这个过程完全依赖于硬件(RNIC),没有任何软件干预,确保高效传输。

  6. 数据传输B 的 RNIC 在收到 A 的读取请求后,验证 R_key 的有效性,并直接将 VB 中的数据传输到 A 的 VA 地址。这个过程是单边的,意味着数据的传输是由 B 的 NIC 直接完成的,A 不需要参与。

  7. 返回状态信息:数据传输完成后,B 通过 WQ(工作队列)中注册的 WR(工作请求)向 A 返回数据传输的状态信息。这个状态信息指示了数据传输是否成功完成。

 6.6.2 单向通信-写Write

RDMA 数据传输过程清晰地阐明了主机 A 和主机 B 之间如何通过 RDMA 操作实现高效的数据写入。

  1. 连接与初始化:主机 A 和 B 已经建立连接,并且 QP(队列对)已成功创建和初始化,以便进行后续的数据传输。

  2. 数据存储与注册:主机 B 在其缓冲区中定义了目标存储空间,地址为 VB。这个地址已经在 B 的 RNIC(远程网络接口控制器)中注册为一个内存区域(Memory Region),并且 B 获取了一个本地密钥(local key),这相当于赋予 RDMA 对该缓冲区的访问权限。

  3. 封装操作权信息:B 将 VB 地址和对应的远程密钥(R_key)封装到专用报文中,并将其发送到主机 A。这一步骤相当于 B 将对数据缓冲区的操作权限转交给 A,使 A 能够在远程缓冲区中进行数据写入。

  4. 准备 RDMA 写入请求:当 A 收到 B 发送的 VB 地址和 R_key 后,A 准备发送一个 RDMA 写入请求。A 将这些信息连同本地存储数据的地址 VA 封装到写请求中。

  5. 发送 RDMA 写入请求A 将封装好的写请求发送到 B,此过程完全依赖于硬件(RNIC),不需要任何软件干预,确保了高效的数据传输。

  6. 数据写入B 的 RNIC 在收到 A 的写请求后,会验证 R_key 的有效性,并直接将 A 中的 VA 中的数据写入到 B 的 VB 地址。这是一个单边操作,意味着数据传输是在 B 的 NIC 和 A 的缓冲区之间直接完成的,A 不需要参与数据的传输过程。

  7. 返回状态信息:数据写入完成后,B 将通过在其 WQ(工作队列)中注册的 WR(工作请求)向 A 返回数据传输的状态信息。这一状态信息指示了数据写入是否成功。

6.6.3 双向通信-Send\Recv 

RDMA 操作流程清晰地阐明了主机 A 和主机 B 之间的通信过程,特别是在使用队列对(QP)、完成队列(CQ)和工作请求(WQE)方面。

 

  1. 创建和初始化 QP 和 CQ:主机 A 和 B 都需要创建并初始化各自的队列对(QP)和完成队列(CQ)。QP 用于管理数据传输,而 CQ 用于提供操作完成的反馈。

  2. 注册工作请求(WQE):A 和 B 在各自的工作队列(WQ)中注册工作请求(WQE)。

        A 和 B 在各自的工作队列(WQ)中注册工作请求(WQE)。 

        对于 A:WQ 是发送队列(SQ),WQE 描述了要发送的数据缓冲区。这个缓冲区包含了准备发送到 B 的数据。

        对于 B:WQ 是接收队列(RQ),WQE 描述了一个用于存储接收到数据的缓冲区。

       3. 异步调度 WQE:当 A 的 RNIC(远程网络接口控制器)调度到 A 的 WQE 时,它会解析到这是一个发送消息。此时,A 的 RNIC 会直接从 A 的缓冲区中读取数据,并将其发送到 B。

        4. 数据到达 B:数据流到达 B 的 RNIC,B 的 WQE 被消耗,B 的 RNIC 将接收到的数据直接存储到 WQE 指向的存储位置,即 B 的缓冲区。

        5. 完成消息生成:当 AB 之间的通信完成后,A 的完成队列(CQ)中会生成一个完成消息(CQE),表示发送操作已完成。同时,B 的完成队列(CQ)中也会生成一个完成消息(CQE),表示接收操作已完成。

        6. WQE 处理完成:每个工作队列中的 WQE 一旦处理完成,都会产生一个对应的完成消息(CQE),这提供了操作的同步和状态反馈。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妄北y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值