michael1983
作者michael19832019-09-19 13:18
技术总监, 某证券

RDMA的原理、传输与Verbs

字数 2979阅读 1850评论 0赞 1

RDMA 最早专属于 infiniband 架构。在网络融合的大趋势下出现的 RoCE ,使高速、超低延时、极低 cpu 使用率的 RDMA 得以部署在目前使用最广泛的以太网上。
对比传统 DMA 的内部总线 IO , RDMA 通过 网络 在两个端点的应用软件之间实现 buffer 的直接传递;而对比传统的网络传输, RDMA 又无需操作系统和协议栈的介入。 RDMA 可以轻易实现端点间的超低延时、超高吞吐量传输,而且基本不需要 CPU 、 OS 的资源参与,在高速网络环境下,不必再为网络数据的处理和搬移耗费过多资源。一言概之, RDMA 三大特性: CPU offload 、 kernel bypass 、 zero-copy 。

              图  RDMA VS Traditional network

原理

传统的网络架构以“ 网络为中心 ”,网络公用的软件部分被实现到 OS 的协议栈,所以 OS 在所有应用的网络请求时都必须参与其中,并且 socket 、 skbuff 、 ring buffer 的转换都伴随着数据报文的拷贝,容易产生性能瓶颈。

图 网络环境下的 CPU 负载消耗

在 Infiniband/RDMA 的模型中,核心 “以服务为中心” ,围绕一个基本问题: 如何实现应用之间最简单、高效和直接的通信 。 RDMA 提供了基于消息队列的点对点通信,每个应用都可以直接获取自己的消息,无需 OS 和协议栈的介入。

消息服务建立在通信双方本端和远端应用之间创建的 channel-IO 连接之上。当应用需要通信时,就会创建一条 Channel 连接,每条 Channel 的首尾端点是两对 Queue Pairs ( QP ),每对 QP 由 Send Queue ( SQ )和 Receive Queue ( RQ )构成,这些队列中管理着各种类型的消息。 QP 会被映射到应用的虚拟地址空间,使得应用直接通过它访问 RNIC 。除了 QP 描述的两种基本队列之外, RDMA 还提供一种队列 -Complete Queue ( CQ ), CQ 用来知会用户 WQ 上的消息已经被处理完。

RDMA 提供了一套 software transport interface ,方便用户创建传输请求 -Work Request ( WR ), WR 中描述了应用希望传输到 Channel 对端的消息内容。 WR 通知给 QP 中的某个队列 -Work Queue ( WQ )。在 WQ 中,用户的 WR 被转化为 Work Queue Ellement ( WQE )的格式,等待 RNIC 的异步调度解析,并从 WQE 指向的 buffer 中拿到真正的消息发送到 Channel 对端。

传输


图 RDMA 的 send/receive 和 read/write 传输

RDMA 共有三种底层数据传输模式。 SEND/RECEIVE 是双边操作,即必须要远端的应用感知参与才能完成收发。 READ 和 WRITE 是单边操作,只需要本端明确信息的源和目的地址,远端应用不必感知此次通信,数据的读或存都通过远端的 DMA 在 RNIC 与应用 buffer 之间完成,再由远端 RNIC 封装成消息返回到本端。在实际中, SEND/RECEIVE 多用于连接控制类报文,而数据报文多是通过 READ/WRITE 来完成的。

对于双边操作为例, 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类似,收发双方的参与过程并无差别,区别在零拷贝、 kernel bypass,实际上传统网络中一些高级的网络 SOC已经实现类似功能。对于 RDMA,这是一种复杂的消息传输模式,多用于传输短的控制消息。

对于单边操作,以存储网络环境下的存储为例( A 作为文件系统, B 作为存储介质):

  1. 首先 A 、 B 建立连接, QP 已经创建并且初始化。
  2. 数据被存档在 A 的 buffer 地址 VA ,注意 VA 应该提前注册到 A 的 RNIC ,并拿到返回的 local key ,相当于 RDMA 操作这块 buffer 的权限。
  3. A 把数据地址 VA , key 封装到专用的报文传送到 B ,这相当于 A 把数据 buffer 的操作权交给了 B 。同时 A 在它的 WQ 中注册进一个 WR ,以用于接收数据传输的 B 返回的状态。
  4. B 在收到 A 的送过来的数据 VA 和 R_key 后, RNIC 会把它们连同存储地址 VB 到封装 RDMA READ ,这个过程 A 、 B 两端不需要任何软件参与,就可以将 A 的数据存储到 B 的 VB 虚拟地址。
  5. B 在存储完成后,会向 A 返回整个数据传输的状态信息。

单边操作传输方式是 RDMA与传统网络传输的最大不同,提供直接访问远程的虚拟地址,无须远程应用的参与,这种方式适用于批量数据传输。

Verbs

RDMAC ( RDMA Consortium )和 IBTA ( InfiniBand Trade Association )主导了 RDMA ,RDMAC 是 IETF 的一个补充,它主要定义的是 iWRAP 和 iSER ,IBTA 是 infiniband 的全部标准制定者,并补充了 RoCE v1 v2 的标准化。 应用和 RNIC 之间的传输接口层( software transport interface )被称为 Verbs 。 IBTA 解释了 RDMA 传输过程中应具备的特性行为,而并没有规定 Verbs 的具体接口和数据结构原型。这部分工作由另一个组织 OFA ( Open Fabric Alliance )来完成, OFA 提供了 RDMA 传输的一系列 Verbs API 。 OFA 开发出了 OFED ( Open Fabric Enterprise Distribution )协议栈,支持多种 RDMA 传输层协议。

OFED_中除了提供向下与 RNIC基本的队列消息服务,向上还提供了 ULP( Upper Layer Protocols),通过 ULPs,上层应用不需要直接到 Verbs API对接,而是借助于 ULP与应用对接,常见的应用不需要做修改,就可以跑在 RDMA传输层上。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

X社区推广