# 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 设备名 |
---|---|---|
node1 | 172.16.16.10 | node1 |
node2 | 172.16.16.6 | node2 |
# 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
这几个软件包的作用如下:
软件包名 | 主要功能 |
---|---|
libibverbs1 | ibverbs 动态链接库 |
ibverbs-utils | ibverbs 示例程序 |
librdmacm1 | rdmacm 动态链接库 |
libibumad3 | ibumad 动态链接库 |
ibverbs-providers | ibverbs 各厂商用户态驱动(包括 RXE) |
rdma-core | 文档及用户态配置文件 |
安装完上述软件之后,可以执行 ibv_devices 看看有没有报错:
这是个基于 verbs 接口编写的小程序,用来获取并打印出当前系统中的 RDMA 设备列表。
查看安装的版本:
dpkg -L libibverbs1
可以看到安装的版本是 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
再次运行ibv_devices
程序,可以看到 RXE 网卡已经出现在设备列表里。
也可以运行ibv_devinfo -d node1
命令查看虚拟 RDMA 设备的信息。
# 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 端:
Client 端:
可以看到两端都打印出了一些测试信息以及最后的测试结果,也就是带宽信息。