RDMA Networking - Intro

· 1088 words · 3 minute read

前言 🔗

最近给Seastar增加 RDMA 网络支持, 接触了一堆资料。比如:

修改示例、运行示例,再了解一些硬件特性 – 所谓“Mechanical Sympathy”,基本上能掌握一个大概。

“You don’t have to be an engineer to be be a racing driver, but you do have to have Mechanical Sympathy.” – Jackie Stewart, racing driver.

好记性不如烂笔头。这里记一些基础知识,主要来自 Rohit Zambre 的博客

相关名词解析 🔗

InfiniBand & IB Verbs API 🔗

根据 Red Hat 的文档,InfiniBand 有两个不同的含义

  • InfiniBand 网络的物理链接层协议;
  • 高级编程接口,InfiniBand Verbs API, 也就是文档中常见的 IB verbs API (libibverbs).

和传统上基于 socket 的 TCP/IP 编程接口不同,IB 允许 RDMA 操作。IB verbs API 就是用户态的 RDMA 编程规范接口。IB verbs API 下层可以是 IB网络,也可以是 RoCE v1、RoCEv2 或者 iWRAP.

RDMA Networks

IB规范由IBTA定义, 目前最新的规范是v1.7, 需要成员资格才能下载。IB 规范分为软件规范和硬件规范,软件规范主要定义的就是 Verbs API.

libibverbs is the software component (Verbs API) of the IB interface. As sockets is to TCP/IP, libibverbs is to IB.

OFED & MOFED 🔗

OFED (Open Fabric Enterprise Distribution) 是以开源软件方式发布的 RDMA 以及 kernel bypass 应用,分为用户态和内核态两部分。

MOFED (Mellanox OFED) 包含一些针对 Mellanox 硬件的优化。

正如 drivers/infiniband 包含了若干厂家驱动,rdma-core 通过providers 方式包含厂家的用户态驱动。

OFI & libfabric 🔗

OFI (OpenFabric Interface) 是一个编程框架,由 OFIWG 维护,聚焦于向应用提供 fabric communication 服务。OFI 框架的设计目标是用来满足 HPC 等相关场景下的性能和扩展需求。作为 OFI 的实现,下图是 libfabric 的构架图:

libfabric

OFI 分为两大组件:

  • OFI framework: 实现通用服务;
  • Providers: 向 OFI 框架提供具体硬件服务,比如:socket provider (TCP), UDP provider, 其它 providers 包括:InfiniBand, Cray Aries networks (uGNI), CISCO usNIC or Intel Omni-Path Architecture (PSM2) 等等。

使用 libfabric 框架编程只需要配置好正确的 provider,而不必直接使用底层编程接口。

UCX 🔗

和 libfabric 类似,UCX (Unified Communication X)也是一个高性能的开源、产品级的统一通信框架。

UCX

MUG (MVAPICH User Group)做了一个比较

UCX vs libfabric

librdmacm 🔗

和 socket 一样,使用 RDMA 进行通信的前提是先要建立连接。在RDMA 协议下,建立连接意味着交换通信两端的 QP 信息,并切换 QP 状态。不同的连接方式(UD、UC、RC)下,需要交换或设置的信息略有不同。bRPC 的实现是通过 TCP 做前置信息交换,并建立 RC 连接。chogori-seastar 建连则不依赖 TCP.

因为建连琐碎而易错,因此 rdma-core 中包含了 librdmacm (connection manager) 用来专门做 RDMA 的连接管理。对于 iWRAP, 这也是唯一的建连方式。对于 IB 或者 RoCE 则可以纯用 libibverbs, 或者用librmdacm 建连、用Verbs API 做数据通信。

comments powered by Disqus