Featured image of post RDMA:Soft-RoCE 环境搭建实验

RDMA:Soft-RoCE 环境搭建实验

RoCE 是三大 RDMA 协议之一,全称为 RDMA Over Converged Ethernet,即基于融合以太网的 RDMA。它是一种基于传统以太网的部分下层协议,在其基础上实现 InfiniBand 的部分上层协议。Soft-RoCE 是 RoCE 的软件实现方式,可以在低成本下完成相关 RDMA 实验

# RDMA: Soft-RoCE 环境搭建实验

# 1. RoCE 简介

RoCE 是三大 RDMA 协议之一,全称为 RDMA Over Converged Ethernet,即基于融合以太网的 RDMA。它是一种基于传统以太网的部分下层协议,在其基础上实现 InfiniBand 的部分上层协议。

RoCE 的发展历史如下:

  • 1999 年,由 Compaq, Dell, HP, IBM, Intel, Microsoft 和 Sun 公司组成了 IBTA 组织。愿景是设计一种更高速的新的互联协议规范标准,来应对传统以太网在面对未来计算机行业的发展时可能遇到的瓶颈

  • 2000 年,IBTA 组织设计并发布了 Infiniband Architecture Specification 1.0(IB 规范)。

  • 2007 年,IETF 发布了 iWARP(Internet Wide Area RDMA Protocol)的一系列 RFC。

  • 2010 年,IBTA 发布了 RoCE v1 规范。

  • 2014 年,IBTA 发布了 RoCE v2 规范。

# 2. RoCE 的协议层次

首先是二层的以太网链路帧,然后是 IP 报文头和 UDP 报文头,最后是各层级协议的校验。而 Infiniband 传输层报文实际上是 UDP 层的负载,也就是深蓝色背景的部分。UDP 报文头中有一个字段 Destination Port Number(目的端口号),对于 RoCE v2 来说固定是 4791,当对端网卡收到报文后,会根据该字段识别是普通的以太网数据包,还是 RoCE 数据包,或者是其他协议的数据包,然后再进行解析。深蓝色背景的 IB 传输层部分又分成了 IB 报头,实际的用户数据(Payload)以及校验部分。

# 3. RoCE 的优势

为什么我们有了 Infiniband 协议之后,还要设计 RoCE 协议呢?最主要的原因还是成本问题:由于 Infiniband 协议本身定义了一套全新的层次架构,从链路层到传输层,都无法与现有的以太网设备兼容。也就是说,如果某个数据中心因为性能瓶颈,想要把数据交换方式从以太网切换到 Infiniband 技术,那么需要购买全套的 Infiniband 设备,包括网卡、线缆、交换机和路由器等等。商用级设备由于对可靠性有比较高的要求,所以这一套下来是非常昂贵的。

而 RoCE 协议的出现解决了这一问题,如果用户想要从以太网切换到 RoCE,那么只需要购买支持 RoCE 的网卡就可以了,线缆、交换机和路由器(RoCE v1 不支持以太网路由器)等网络设备都是兼容的——因为我们只是在以太网传输层基础上又定义了一套协议而已。

所以 RoCE 相比于 Infiniband,主要还是省钱,当然性能上相比 Infiniband 还是有一些损失,毕竟人家是全套重新设计的。

至于 iWARP,相比于 RoCE 协议栈更复杂,并且由于 TCP 的限制,只能支持可靠传输,即无法支持 UD 等传输类型。所以目前 iWARP 的发展并不如 RoCE 和 Infiniband。

# 4. Soft-RoCE

虽然 RoCE 相比 Infiniband 具有兼容性优势,价格也便宜,但是实际应用的时候依然需要专用的网卡支持

RoCE 本身确实可以由软件实现,也就是本节即将介绍的 Soft-RoCE,但是商用的时候,几乎不会有人用软件实现的 RoCE。RDMA 技术本身的一大特点就是“硬件卸载”,即把本来软件(CPU)做的事情放到硬件中实现以达到加速的目的。CPU 主要是用来计算的,让它去处理协议封包和解析以及搬运数据,这是对计算资源的浪费。所以 RoCE 网卡会把 TCP/IP 协议栈放到硬件中实现以解放 CPU,让它去做更重要的事。

我们说回 Soft-RoCE,它由 IBM 和 Mellanox 牵头的 IBTA RoCE 工作组实现。本身的设计初衷有几点:

  • 降低 RoCE 部署成本:Soft-RoCE 可以使不具备 RoCE 能力的硬件和支持 RoCE 的硬件间进行基于 IB 语义的交流,这样可以免于替换网络中的一些非关键节点的旧型号网卡。

  • 相比 TCP 提升性能:虽然软件实现 IB 传输层带来了一定的开销,但是相比基于 Socket-TCP/IP 的传统通信方式,Soft-RoCE 因为减少了系统调用(只在软件通知硬件下发了新 SQ WQE 时才会使用系统调用),发送端的零拷贝以及接收端的只需要单次拷贝等原因,仍然带来了性能上的提升。

  • 便于开发和测试 RDMA 程序:有了 Soft-RoCE,我们基于 Verbs API 编写的程序,就可以不依赖于硬件执行起来,可以很方便地运行程序。

实现原理

Soft-RoCE 就是把本来应该卸载到硬件的封包和解析工作,又拿到软件来做。其本身是基于 Linux 内核的 TCP/IP 协议栈实现的,网卡本身并不感知收发的数据包是 RoCE 报文,其驱动程序按照 IB 规范中的报文格式将用户数据封装成 IB 传输层报文,然后把报文整体当做数据填入 Socket Buffer 当中,由网卡进行下一步收发包处理。

# 5. 部署实验

# 5.1. 实验环境

本实验主要使用 Ubuntu 20.04 64 位作为系统环境,采用 2 台 2 核 4GB 云服务器作为 Soft-RoCE 的部署环境。

节点IP 地址RDMA 设备名
node1172.16.16.10node1
node2172.16.16.6node2

# 5.2. 部署 RDMA 软件栈

# 5.2.1. 确认当前内核是否支持 RXE

cat /boot/config-$(uname -r) | grep RXE

如果 CONFIG_RDMA_RXE 的值为 y 或者 m,表示当前的操作系统可以使用 RXE。

# 5.2.2. 安装用户态动态链接库

sudo apt-get install libibverbs1 ibverbs-utils librdmacm1 libibumad3 ibverbs-providers rdma-core

这几个软件包的作用如下:

软件包名主要功能
libibverbs1ibverbs 动态链接库
ibverbs-utilsibverbs 示例程序
librdmacm1rdmacm 动态链接库
libibumad3ibumad 动态链接库
ibverbs-providersibverbs 各厂商用户态驱动(包括 RXE)
rdma-core文档及用户态配置文件

安装完上述软件之后,可以执行 ibv_devices 看看有没有报错:

20230725152257

这是个基于 verbs 接口编写的小程序,用来获取并打印出当前系统中的 RDMA 设备列表。

查看安装的版本:

dpkg -L libibverbs1
20230725152107

可以看到安装的版本是 1.14.19.0

# 5.2.3. 安装 iproute2 和 perftest

iproute2 是用来替代 net-tools 软件包的,是一组开源的网络工具集合,比如用更强大 ip 命令替换了以前常用的 ifconfig。我们需要其中的 rdma 工具来对 RXE 进行配置。一般的操作系统都已经包含了,安装也很简单:

sudo apt-get install iproute2

perftest 是一个基于 Verbs 接口开发的开源 RDMA 性能测试工具,可以对支持 RDMA 技术的节点进行带宽和时延测试。相比于 rdma-core 自带的示例程序 ,功能更加强大,当然也更复杂。使用如下命令安装:

sudo apt-get install perftest

# 5.3. 配置 RXE 网卡

首先我们需要加载内核驱动,modprobe 会自动加载依赖的其他驱动。

sudo modprobe rdma_rxe

然后进行用户态配置:

sudo rdma link add rxe_0 type rxe netdev eth0

其中 rxe_0 是你希望的 RDMA 的设备名,可任意取名。eth0 为 Soft-RoCE 设备所绑定的网络设备名,也就是 ifconfig 中看到的网卡名。

接着我们用 rdma 工具查看是否添加成功:

rdma link
20230725152620

再次运行ibv_devices 程序,可以看到 RXE 网卡已经出现在设备列表里。

20230725152728

也可以运行ibv_devinfo -d node1 命令查看虚拟 RDMA 设备的信息。

20230725152801

# 5.4. 执行 perftest 测试

分别在两端执行以下命令:

ib_send_bw -d node2

以及:

ib_send_bw -d node1 172.16.16.6

ib_send_bw 是用来测试 SEND 操作的带宽的程序(infiniband_send bandwidth),其中 <server_ip> 表示对端的 IP

两端的结果如下,Server 端:

20230725152955

Client 端:

20230725153015

可以看到两端都打印出了一些测试信息以及最后的测试结果,也就是带宽信息。

Licensed under CC BY-NC-SA 4.0
本博客已稳定运行
总访客数: Loading
总访问量: Loading
发表了 73 篇文章 · 总计 323.75k

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