Featured image of post RDMA 技术及其编程方法(一):RDMA 简介与原理

RDMA 技术及其编程方法(一):RDMA 简介与原理

本文介绍了 RDMA(Remote Direct Memory Access)技术的基本概念和工作原理。首先,简要介绍了 RDMA 技术的背景和定义。接着,详细解释了 RDMA 工作原理中的几个重要概念,包括 Infiband 与以太网的对比、QRs/WRs 执行模型、通信语义和传输服务。此外,还介绍了 RDMA 架构的层级结构。然后,介绍了 Verbs 与 OFA Verbs API,包括 Verbs 的简介和 OFA Verbs API 对应用的支持。最后,对本文进行了总结。通过本文的阅读,读者可以了解 RDMA 技术的基本概念和工作原理,以及 Verbs 与 OFA Verbs API 的应用。

# RDMA 技术及其编程方法(一):RDMA 技术

# 一、 RDMA 技术简介

  • RDMA: Remote Direct Memory Access
    • RDMA 就是一种远程直接内存访问技术,它可以让远程主机直接访问本地内存,而不需要经过 CPU 的参与,从而大大减少了 CPU 的开销,提高了数据传输的效率。
术语含义
Remote数据在同一网络中的节点之间传输
Direct(1)传输过程没有操作系统内核的参与 (2)所有关于传输的协议都负载在网卡上
Memory(1)在用户态的应用程序的虚拟内存之间传输(2)没有额外的内存拷贝或缓存
Accesssend、receive、read、write、原子操作
  • RDMA 的各种协议
    • InfiniBand - (41.8% of top 500 supercomputers)
      • InfiniBand 是一个工业标准的分组交换网络
      • 在高性能计算机系统中越来越多地被采用
      • 用户层网络,可绕过操作系统内核
      • SDR 4x - 8 Gbps
      • DDR 4x - 16 Gbps
      • QDR 4x - 32 Gbps
      • FDQ 4x - 54 Gbps
    • RoCE - RDMA over Converged Ethernet
      • 允许在以太网络上执行 RDMA 的网络协议
      • RoCE v1 - 10 Gbps
      • RoCE v2 - 25 Gbps
    • iWarp - internet Wide Area RDMA Protocol
      • 运行在 TCP/IP 协议栈上的 RDMA 协议
      • 10 Gbps
  • RDMA 的支持嵌入在内核之中:Kernel 中的 drivers/infiniband
  • RDMA 协议优势
    1. Zero-copy:零拷贝,能够读写远程内存,能够直接访问远程缓冲区,无需在不同软件层之间复制数据
    2. Kernel bypass:跳过内核,可在相同的代码上下文(即用户空间或内核)中收发数据,节省了上下文切换时间
    3. No CPU involvement:无 CPU 参与,可使用专用硬件收发数据,而不需要 CPU 干预。可降低远程端的 CPU 使用率,因为不需要它执行任何主动操作
    4. Message based transactions:基于消息的事务,可在不同的连接上同时执行多个事务,而无需等待任何事务完成
    5. Scatter/gather entries support:支持分散/聚集条目,可在单个操作中传输多个缓冲区,而无需将它们合并到单个缓冲区中

# 二、 RDMA 工作原理

20230722174248

# 1. Infiband 与以太网的对比

Feature/Network TypeInfiniBandEthernet
Addressinglids, gidmacs, IP addresses
Path resolutionPath queriesARP
Lossless networkCredit-based flow controlPause frames/PFC
QoSSLs/VLsPriorities/TC
Virtual networksPkeysVLANs
  • 可以看到,InfiniBand 与以太网的区别首先在于网络地址的表示方式不同,以太网使用 mac 地址和 IP 地址,而 InfiniBand 使用 lid 和 gid
  • 其次,网络的路径解析方式不同,以太网使用 ARP 地址解析协议,而 InfiniBand 使用 path queries;
  • 然后,在网络的可靠性方面,以太网使用 Pause frames/PFC(Priority-based Flow Control,基于优先级的流量控制),而 InfiniBand 使用的是 Credit-based flow control(基于信用的流量控制)
  • 接着在网络的服务质量方面,以太网使用 Priorities/TC(Traffic Class,流量类别),而 InfiniBand 使用 SLs/VLs(Service Level,服务等级)
  • 最后,在网络的虚拟化方面,以太网使用 VLANs(Virtual Local Area Network,虚拟局域网),而 InfiniBand 使用 Pkeys(Partition Keys,分区键)。

# 2. RDMA 中的重要概念

缩写全称说明
PDProtection Domain保护域,是 RDMA 中的一种资源管理机制。PD 定义了一组内存区域和访问权限,用于控制 RDMA 操作的安全性。PD 与 QP、MR 均有关联。
MRMemory Region内存区域,是 RDMA 中的一种抽象,用于描述应用程序中的内存区域。MR 定义了一块内存区域的起始地址、大小和访问权限,并与 PD 关联。包含 R_Key 和 L_Key。MR 的配套机制用来解决 RDMA 操作中的两个问题:(1)APP 提供的地址都是虚拟地址,经过 MMU 的转换才能得到真实的物理地址,RDMA 网卡是如何得到真实物理地址从而去内存中读取或写入数据的?(2)假设网卡有能力获取目的地址,但如果用户恶意指定了一个非法的虚拟地址,网卡就有可能被指使去读写系统关键内存,如何预防?因此,MR 的作用之一就是实现虚拟地址与物理地址的转换,APP 只能看到虚拟地址,而且会在发起 RDMA Write 时把本地和对端的内存的虚拟地址传递给 RDMA 网卡。网卡需要知道 APP 提供的虚拟地址所对应的物理地址才能访问系统内存。在注册 MR 的过程中,软件会在内存中创建并填写一个虚拟地址到物理地址的映射表供网卡查询。MR 的第二个作用是控制 HCA 访问内存的权限,程序在注册 MR 时会产生两把钥匙 L_KEY(Local)和 R_KEY(Remote)。
QPQueue Pair队列对,是 RDMA 中的一种通信机制。QR 由发送队列(Send Queue, SQ)和接收队列(Receive Queue, RQ)组成,用于发送和接收 RDMA 操作的请求和数据。SQ 专门用来存放发送任务,RQ 专门用来存放接收任务。在一次 SEND-RECV 流程中,发送端需要把表示一次发送任务的 WR 放到 SQ 里面(这种操作称为 Post Send),接收端需要把表示一次接收任务的 WR 放到 QP 里面(称为 Post Receive),这样硬件才知道收到数据之后放到内存中的哪个位置。在 RDMA 中,通信的基本对象是 QP,而不是节点。对于每个节点来说,每个进程都可以申请和使用若干个 QP,而每个本地 QP 可以连接到一个远端的 QP。每个节点中的 QP 都有一个唯一的编号,称为 QPN,通过 QPN 可以唯一确定一个节点上的 QP。
CQCompletion Queue完成队列,用于存储 RDMA 操作的完成事件。当 RDMA 操作完成时,相关的完成事件会被放入 CQ 中,应用程序可以通过轮询或事件通知方式获取这些完成事件。CQ 与 QP 相关联。CQ 中有很多元素,称为 CQE。CQE 是硬件完成任务之后返回给软件的“完成报告”,与 WR 相反。每个 CQE 都包含某个 WR 的完成信息。
WRWork Request工作请求,用于描述 RDMA 操作的请求。WR 包含了操作类型、源地址、目的地址等信息,应用程序通过将 WR 放入 QP 的发送队列来触发 RDMA 操作。
SGEScatter/Gather Element即将读或写的内存地址。必须提供 L_Key 或 R_Key 来认证 MR 的连接
WCWork Completion工作完成,用于描述 RDMA 操作的完成事件。WC 包含了操作类型、状态、传输长度等信息,应用程序可以通过读取 CQ 中的 WC 来获取 RDMA 操作的结果。

# 3. QPs/WRs 执行模型

20230722225719
  • 硬件提供
    • 针对每个 QP 上下文
    • 虚拟到物理内存的转换
    • 安全的进程控制机制
    • 可靠性(取决于传输服务)
  • 操作系统管理资源创建
    • 但不发布 WR 和轮询 CQ
  • 结果
    • 应用程序以安全的方式直接访问硬件
    • 软件处理缓冲区而不是信息包
    • 在快速路径中不需要操作系统干预。
    • 完全异步的过程

# 4. 通信语义

  • Channel(消息传递)
    • 请求者提供源缓冲区
    • 接收者提供目的缓冲区
  • Remote Direct Memory Access(RDMA)
    • 请求者同时提供源缓冲区和目标缓冲区
    • 同时支持 RDMA 读取和写入

# 5. 传输服务

  • 分类:Connected(连接)与 Datagram(数据报)

  • 分类:Reliable(可靠)与 Unreliable(不可靠)

  • 两两组合形成四种类型的传输:

    • Reliable Connected(RC),例如 TCP
    • Unreliable Datagram(UD),例如 UDP
    • UC 也可以实现
    • RD 不支持,虽然它是由规范定义的,但在 API/DIVER/硬件中不支持
  • QP 的传输类型:

    • 可靠连接 RC
      • QP 仅与一个远程 QP 关联
      • 由一个 QP 的发送队列发送的消息被可靠地递送到另一个 QP 的接收队列。
      • 数据包按顺序发送
      • 发送端,每条消息都被划分为长度为路径 MTU 的数据包,接收方将数据包重组为消息。支持发送、RDMA write/read
    • 不可靠连接 RC
      • QP 仅与一个远程 QP 关联
      • 连接是不可靠的,即发送的数据包可能会丢失
      • 消息出错时不会重传,错误处理必须由更高级别的协议提供。
      • 支持发送、RDMA write
    • 不可靠数据报 UD
      • 队列对可以向/从任何其他多个 QP 发送和接收单数据包消息。
      • 不能保证有序和数据包到达,并且发送的数据包可能会被接收方丢弃。
      • 支持广播消息(一对多)
      • 只支持发送操作
  • RDMA 支持的传输操作

    • Send(立即)
      • 发送方需要加上时间戳
      • 接收方也需要在某些地方加上该时间戳用来标识该消息
    • RDMA Write(立即)
    • RDMA Read(异步)
    • Atomic operations(原子操作)
      • 发送方发送读/写请求,并指定其将访问读写的本地和远程地址
  • Send 操作流程:

    • 接收方需要发送接收请求(Receive Request, RR)给发送方
    • 发送方发送 Send 操作请求(Send Request, SR)给接收方
    • 只在可靠连接中发送 ACK
    • 接收方轮询 CQ,获取 SR 的完成事件
    • 发送方轮询 CQ,获取 RR 的完成事件
20230722232438
  • RDMA Write 操作流程:
    • 请求方发送 Send 操作请求(Send Request, SR)加上远程地址与 key 给接收方
    • 只在可靠连接中发送 ACK
    • 请求方轮询 CQ,获取 SR 的完成事件
  • RDMA Write 操作是一端应用主动写入远端内存的行为,除了准备阶段,远端 CPU 不需要参与,也不感知何时有数据写入、数据在何时接收完毕,所以这是一种单端操作。
  • 需要注意的是,操作发起端的应用程序是通过虚拟地址来读写远端内存的,上层应用可以非常方便的对其进行操作。实际的虚拟地址——物理地址的转换由 RDMA 网卡完成。
20230722232556
  • RDMA Read 与 Atomic 操作流程:
    • 请求方发送 Send 操作请求(Send Request, SR)加上远程地址与 key 给接收方
    • 只在可靠连接中发送 ACK
    • 请求方轮询 CQ,获取 SR 的完成事件
20230722232758
  • 小结:UD、UC、RC 三种 QP 传输方式对比,w/o->with/without
    操作原语UDUCRC
    Send(w/o immediate)支持支持支持
    RDMA Write(w/o immediate)不支持支持支持
    RDMA Read不支持不支持支持
    Atomic operations不支持不支持支持
    连接类型数据报(一对多)连接(一对一)连接(一对一)
    最大消息大小最大路径 MTU2GB2GB
    广播支持不支持不支持

# 6. RDMA 架构层级结构

20230722233900

20230728235849

# 三、Verbs 与 OFA Verbs API

# 1. Verbs 简介

  • Verbs 是对为使用 RDMA 的应用程序提供的功能的抽象描述
    • Verbs 不是 API
    • Verbs 有多种实现
  • Verbs 可以被分为两大类
    • 控制:管理资源,通常需要切换上下文。
      • 创建/销毁/修改/查询/处理事件
    • 数据:使用资源发送/接收数据,不需要切换上下文。
      • 发送 Send/发送 Receive/轮询 CQ/请求完成事件
  • Verbs 是对 RDMA 编程的底层描述。
  • Verbs 旨在提供延迟、带宽、消息速率等方面的最佳性能。它可以被视作许多应用构建的基石。
    • Sockets
    • 存储
    • 并行计算
  • InfiniBand 规范以 Verbs 接口形式编写
    • 所需行为的语义描述
    • 没有语法或操作系统特定的详细信息
    • 可以自由定义实现
      • 函数、结构、类型等的语法。
  • OpenFabrics Alliance (OFA) Verbs API
    • 一种 Verbs 接口,由 OpenFabrics Alliance(OFA)组织定义和推广。OFA Verbs 是基于 RDMA Verbs 的扩展,提供了更加统一和标准化的 RDMA 编程接口。OFA Verbs 是 RDMA 领域的一个重要标准,被广泛应用于高性能计算、数据中心和云计算等领域。
    • 旨在提供一个开放、跨平台的 RDMA 编程接口,使应用程序能够在不同的 RDMA 硬件和操作系统上进行移植和开发
    • OFA 统一 InfiniBand 市场的战略
    • OFA 面向 Linux、FreeBSD、Windows 等操作系统实现
    • 应用程序的软件接口:支持 C/C++程序的数据结构、函数原型
    • 用户态空间和内核态空间的变体:大多数应用程序和库都在用户态空间中
    • 客户端-服务器编程模型
      • 与 TCP/IP 套接字有一些明显的相似之处
      • 而许多的其它不同之处,则是由于 RDMA 与 TCP/IP 的不同导致

# 2. OFA Verbs API 支持应用

  1. MPI: Message Passing Interface,支持多种版本
    • OpenMPI
    • MVAPICH
    • Intel MPI
  2. 文件系统:
    • Lustre
    • NFS_RDMA
  3. DDN 和 NetApp 公司生产的存储设备
    • SRP:SCSI RDMA (Remote) Protocol – Linux kernel
    • iSER – iSCSI Extensions for RDMA – Linux kernel
  4. 伪 Socket 库
    • SDP – Sockets Direct Protocol – supported by Oracle
    • rsockets – RDMA Sockets – supported by Intel
    • mva – Mellanox Messaging Accelerator
    • SMC-R – proposed by IBM

# 四、总结

  • RDMA 技术是一种远程直接内存访问技术,它可以让远程主机直接访问本地内存,而不需要经过 CPU 的参与,从而大大减少了 CPU 的开销,提高了数据传输的效率。
  • RDMA 技术的各种协议:InfiniBand、RoCE、iWarp
  • RDMA 技术的优势:Zero-copy、Kernel bypass、No CPU involvement、Message based transactions、Scatter/gather entries support
  • RDMA 技术的传输服务:Connected(连接)与 Datagram(数据报)、Reliable(可靠)与 Unreliable(不可靠)
  • RDMA 技术的 QP 传输类型:RC、UC、UD
  • RDMA 技术的操作原语:Send、RDMA Write、RDMA Read、Atomic operations
  • RDMA 技术的 Verbs 与 OFA Verbs API
  • RDMA 技术的应用:MPI、文件系统、存储设备、伪 Socket 库

# 参考文献

  • Mellanox Technologies, Inc. (2017). RDMA Aware Networks Programming User Manual. Mellanox Technologies, Inc.
本博客已稳定运行
总访客数: Loading
总访问量: Loading
发表了 73 篇文章 · 总计 323.73k

使用 Hugo 构建
主题 StackJimmy 设计
基于 v3.27.0 分支版本修改