基于融合以太网的 RDMA
远程直接内存访问 (RDMA) 支持服务器到服务器之间直接在应用程序内存之间进行数据移动,而无需 CPU 参与。基于融合以太网的 RDMA (RoCE) 将此功能扩展到无损以太网网络,从而以极低的延迟实现高效的数据传输。
随着可靠以太网技术的进步,NVIDIA® ConnectX® 以太网适配器卡系列利用 RDMA 传输来支持 10GigE 和 40GigE 链路速度下的主流数据中心应用。通过将 RDMA 传输服务卸载到硬件,这些适配器为性能关键型应用(包括金融系统、数据库、存储和内容交付网络)提供超低延迟。
当在以太网链路层上使用 RDMA 应用时,应注意以下几点
Fabric 中不需要存在子网管理器 (SM)。因此,在 RoCE 中以不同的方式管理需要与 SM 通信的操作。这不会影响 API,而只会影响在使用 API 时需要执行的操作,例如加入多播组
由于 LID 是 InfiniBand 协议栈的第 2 层属性,因此未为端口设置 LID,并且在查询端口时显示为零
对于 RoCE,未为 RC QP 设置备用路径。因此,不支持 APM(另一种高可用性类型,是 InfiniBand 协议的一部分)
由于 SM 不存在,因此无法查询路径。因此,必须在建立连接之前使用相关值填充路径记录结构。因此,建议使用 RDMA-CM 来建立连接,因为它负责填充路径记录结构
VLAN 标记的以太网帧携带 3 位优先级字段。此字段的值通过取 SL 字段的 3 个最低有效位从 IB SL 字段派生而来
RoCE 流量未显示在关联的以太网设备的计数器中,因为它由硬件卸载,并且不经过以太网网络驱动程序。RoCE 流量在 InfiniBand 流量的计数位置进行计数;
/sys/class/infiniband/<device>/ports/<port number>/counters/
RoCE 将 IB 传输封装在以下以太网数据包之一中
RoCEv1 - 专用以太网类型 (0x8915)
RoCEv2 - UDP 和专用 UDP 端口 (4791)
RoCEv1 和 RoCEv2 协议栈

RoCEv1
RoCE v1 协议定义为基于以太网标头的 RDMA(如上图所示)。它使用以太网类型 0x8915,并且可以在带或不带 VLAN 标记的情况下使用。常规以太网 MTU 适用于 RoCE 帧。
RoCEv2
RoCE 协议的直接扩展使流量能够在 IP 第 3 层环境中运行。此功能是通过简单修改 RoCE 数据包格式来实现的。与 RoCE 中使用的 GRH 不同,IP 可路由 RoCE 数据包携带 IP 标头(允许遍历 IP L3 路由器)和 UDP 标头(仅限 RoCEv2),后者充当 IP 上 RDMA 传输协议数据包的无状态封装层。
拟议的 RoCEv2 数据包使用众所周知的 UDP 目标端口值,该值明确区分数据报。与其他使用 UDP 封装的协议类似,UDP 源端口字段用于携带不透明的流标识符,该标识符允许网络设备实施数据包转发优化(例如 ECMP),同时保持与协议标头格式的具体细节无关。
此外,由于此更改仅影响线路上的数据包格式,并且由于 RDMA 语义数据包是在 AP 下生成和使用的,因此应用程序可以完全透明地在任何形式的 RDMA 服务上无缝运行。
默认情况下,RoCEv1 和 RoCEv2 均受支持;驱动程序将所有 GID 索引与 RoCEv1 和 RoCEv2 关联,因此,每个 RoCE 版本只有一个条目。
有关更多信息,请参阅 RoCE 部署的推荐网络配置示例 社区帖子。
每当在 NIC 端口的以太网设备之一上配置 IP 地址时,都会创建 GID 表条目。RoCE 端口的 GID 表中的每个条目都具有以下字段
GID 值
GID 类型
网络设备
GID 表被两个 GID 占用,这两个 GID 具有相同的 GID 值,但类型不同。条目中的网络设备是与 GID 关联的具有 IP 地址的以太网设备。GID 格式可以是 2 种类型;IPv4 和 IPv6。IPv4 GID 是 IPv4 映射的 IPv6 地址,而 IPv6 GID 是 IPv6 地址本身。与 IPv4 GID 关联的数据包的第 3 层标头将是 IPv4(对于 RoCEv2),而与 IPv6 GID 和 RoCEv1 的 IPv4 GID 关联的数据包的第 3 层标头将是 IPv6/GRH。
GID 表通过 sysfs 向用户空间公开
可以从以下位置读取 GID 值
/sys/
class
/infiniband/{device}/ports/{port}/gids/{index}
可以从以下位置读取 GID 类型
/sys/
class
/infiniband/{device}/ports/{port}/gid_attrs/types/{index}
可以从以下位置读取 GID net_device
/sys/
class
/infiniband/{device}/ports/{port}/gid_attrs/ndevs/{index}
为队列对 (QP) 设置 RoCE 模式
对于支持两种 RoCE 模式的设备,为 RC/UC QP(连接的 QP 类型)和 UD QP 设置 RoCE 模式是不同的。
要将 RC/UC QP(连接的 QP)从 INIT 修改为 RTR,必须提供地址向量 (AV)。AV 除其他属性外,还应指定端口的 GID 表的索引,用于 QP 的源 GID。该索引中的 GID 类型将用于设置 QP 的 RoCE 类型。
设置 RDMA_CM 应用的 RoCE 模式
RDMA_CM 接口仅要求对等方的活动端传递被动端的 IP 地址。RDMA_CM 决定要使用的源 GID,并从 GID 表中获取它。由于 GID 值的多个实例是可能的,因此查找也应根据 GID 类型进行。用于查找的类型定义为 RDMA_CM 模块的全局值。更改 GID 表查找的 GID 类型值是使用 cma_roce_mode 脚本完成的。
要打印设备端口的当前 RoCE 模式
cma_roce_mode -d <dev> -p <port>
要设置设备端口的 RoCE 模式:
cma_roce_mode -d <dev> -p <port> -m <
1
|2
>
GID 表示例
以下是 GID 表的示例。
DEV | 端口 | 索引 | GID | IPv4 | 类型 | Netdev |
mlx5_0 | 1 | 0 | fe80:0000:0000:0000:ba59:9fff:fe1a:e3ea | v1 | p4p1 | |
mlx5_0 | 1 | 1 | fe80:0000:0000:0000:ba59:9fff:fe1a:e3ea | v2 | p4p1 | |
mlx5_0 | 1 | 2 | 0000:0000:0000:0000:0000:ffff:0a0a:0a01 | 10.10.10.1 | v1 | p4p1 |
mlx5_0 | 1 | 3 | 0000:0000:0000:0000:0000:ffff:0a0a:0a01 | 10.10.10.1 | v2 | p4p1 |
mlx5_1 | 1 | 0 | fe80:0000:0000:0000:ba59:9fff:fe1a:e3eb | v1 | p4p2 | |
mlx5_1 | 1 | 1 | fe80:0000:0000:0000:ba59:9fff:fe1a:e3eb | v2 | p4p2 |
其中
端口 1 索引 0/1 上的条目是默认 GID,每种受支持的 RoCE 类型各一个
端口 1 索引 2/3 上的条目属于 eth1 上 IP 地址 192.168.1.70
端口 1 索引 4/5 上的条目属于 eth1.100 上 IP 地址 193.168.1.70
来自与这些 GID 索引关联的 QP 的数据包将具有 VLAN 标头 (VID=100)
端口 1 索引 6/7 上的条目是 IPv6 GID。来自与这些 GID 索引关联的 QP 的数据包将具有 IPv6 标头
为了可靠地运行,RoCE 需要某种形式的流控制。虽然可以使用全局流控制,但这通常是不希望的,因为性能原因。
使用 RoCE 的正常且最佳方式是使用优先级流控制 (PFC)。要使用 PFC,必须在流路径中的所有端点和交换机上启用 PFC。
配置基于 SwitchX® 的交换系统
要启用 RoCE,应按如下方式配置 SwitchX
面向主机的端口应配置为接入端口,并使用全局暂停或端口控制协议 (PCP) 进行优先级流控制
面向网络的端口应配置为中继端口,并使用端口控制协议 (PCP) 进行优先级流控制
有关如何配置 SwitchX 的更多信息,请参阅 SwitchX 用户手册
要安装和加载驱动程序
安装 MLNX_OFED(有关更多详细信息,请参阅安装部分)。
RoCE 在驱动程序安装时作为 mlx5 和其他模块的一部分安装。
注意可以在配置文件 /etc/infiniband/openib.conf 中找到启动时将自动加载的模块列表。
查询设备的信息。示例
ibv_devinfo MLNX_OFED_LINUX-
5.0
-2.1
.8.0
:显示现有的 MLNX_OFED 版本。
ofed_info -s hca_id: mlx5_0 transport: InfiniBand (
0
) fw_ver:16.28
.0578
node_guid: ec0d:9a03:0044
:3764
sys_image_guid: ec0d:9a03:0044
:3764
vendor_id:0x02c9
vendor_part_id:4121
hw_ver:0x0
board_id: MT_0000000009 phys_port_cnt:1
port:1
state: PORT_ACTIVE (4
) max_mtu:4096
(5
) active_mtu:1024
(3
) sm_lid:0
port_lid:0
port_lmc:0x00
link_layer: Ethernet
输出注释:
端口的状态为:以太网处于 PORT_ACTIVE 状态 | 端口状态也可以通过运行以下命令获得
|
link_layer 参数显示端口 1 是以太网 | link_layer 也可以通过运行以下命令获得
|
fw_ver 参数显示固件版本为 16.28.0578。 | 固件版本也可以通过运行以下命令获得
|
将 InfiniBand 端口与以太网端口关联
mlx5_ib 驱动程序持有对 net 设备 的引用,以获取有关端口状态的通知,以及使用 mlx5_core 驱动程序将 IP 地址解析为创建地址向量所需的 MAC。但是,RoCE 流量不经过 mlx5_core 驱动程序;它完全由硬件卸载。
# ibdev2netdev
mlx5_0 port 1
<===> eth2
#
为 netdev 接口配置 IP 地址
要为 netdev 接口配置 IP 地址
在链路两侧的 netdev 接口上配置 IP 地址。
# ifconfig eth2
20.4
.3.220
# ifconfig eth2 eth2 Link encap:Ethernet HWaddr00
:02
:C9:08
:E8:11
inet addr:20.4
.3.220
Bcast:20.255
.255.255
Mask:255.0
.0.0
UP BROADCAST MULTICAST MTU:1500
Metric:1
RX packets:0
errors:0
dropped:0
overruns:0
frame:0
TX packets:0
errors:0
dropped:0
overruns:0
carrier:0
collisions:0
txqueuelen:1000
RX bytes:0
(0.0
b) TX bytes:0
(0.0
b)确保 ping 正常工作。
ping
20.4
.3.219
PING20.4
.3.219
(20.4
.3.219
)56
(84
) bytes of data.64
bytes from20.4
.3.219
: icmp_seq=1
ttl=64
time=0.873
ms64
bytes from20.4
.3.219
: icmp_seq=2
ttl=64
time=0.198
ms64
bytes from20.4
.3.219
: icmp_seq=3
ttl=64
time=0.167
ms20.4
.3.219
ping statistics —3
packets transmitted,3
received,0
% packet loss, time 2000ms rtt min/avg/max/mdev =0.167
/0.412
/0.873
/0.326
ms
添加 VLAN
要添加 VLAN
确保已加载 8021.q 模块。
modprobe 8021q
添加 VLAN。
# vconfig add eth2
7
Added VLAN with VID ==7
to IF -:eth2:- #配置 IP 地址。
ifconfig eth2.
7
7.4
.3.220
定义以太网优先级(802.1q 标头中的 PCP)
在服务器上定义以太网优先级。
# ibv_rc_pingpong -g
1
-i2
-l4
local address: LID0x0000
, QPN0x1c004f
, PSN0x9daf6c
, GID fe80::202
:c900:708
:e799 remote address: LID0x0000
, QPN0x1c004f
, PSN0xb0a49b
, GID fe80::202
:c900:708
:e8118192000
bytes in0.01
seconds =4840.89
Mbit/sec1000
iters in0.01
seconds =13.54
usec/iter在客户端上定义以太网优先级。
# ibv_rc_pingpong -g
1
-i2
-l4
sw419 local address: LID0x0000
, QPN0x1c004f
, PSN0xb0a49b
, GID fe80::202
:c900:708
:e811 remote address: LID0x0000
, QPN0x1c004f
, PSN0x9daf6c
, GID fe80::202
:c900:708
:e7998192000
bytes in0.01
seconds =4855.96
Mbit/sec1000
iters in0.01
seconds =13.50
usec/iter
使用 rdma_cm 测试
在服务器上使用 rdma_cm 测试。
# ucmatose cmatose: starting server initiating data transfers completing sends receiving data transfers data transfers complete cmatose: disconnecting disconnected test complete
return
status0
#在客户端上使用 rdma_cm 测试。
# ucmatose -s
20.4
.3.219
cmatose: starting client cmatose: connecting receiving data transfers sending replies data transfers complete test completereturn
status0
#
此服务器-客户端运行不带 PCP 或 VLAN,因为使用的 IP 地址不属于 VLAN 接口。如果指定 VLAN IP 地址,则流量应通过 VLAN。
可以使用 rdma_set_option() API 设置 rdma_cm 套接字的 TOS 字段,就像为常规套接字设置 TOS 字段一样。如果未设置 TOS,则使用默认值 (0)。在 rdma_cm 内核驱动程序中,TOS 字段将转换为 SL 字段。转换公式如下
SL = TOS >> 5(例如,取 TOS 字段的 3 个最高有效位)
在硬件驱动程序中,SL 字段通过以下公式转换为 PCP
PCP = SL & 7(取 TOS 字段的 3 个最低有效位)
仅当流量通过标记的 VLAN 帧时,SL 才会影响 PCP。
DSCP
RDMA-CM configfs 中添加了一个新条目,允许用户为 RDMA-CM QP 选择默认 TOS。这对于希望在不更改代码的情况下控制 TOS 字段的用户很有用。其他使用 rdma_set_option API 显式设置 TOS 的应用程序将继续按预期工作,以覆盖 configfs 值。
有关 DSCP 标记的更多信息,请参阅 如何在 RDMA CM QP 上设置出口 ToS/DSCP 社区帖子。
RoCE LAG 是一项旨在模拟 IB 设备以太网绑定的功能,仅适用于双端口卡。
内核版本 4.9 及更高版本支持此功能。
当两个以太网接口配置为以下模式之一的绑定时,将进入 RoCE LAG 模式
active-backup(模式 1)
balance-xor(模式 2)
802.3ad (LACP)(模式 4)
任何违反上述规则之一的绑定配置更改(即,绑定模式不是 1、2 或 4,或者属于同一张卡的两张以太网接口不是唯一的从接口
的绑定接口),都将导致退出 RoCE LAG 模式并返回到正常的每个端口 IB 设备配置。
启用 RoCE LAG 后,将只有一个名为 mlx5_bond_0 的设备,而不是两个 IB 设备;mlx5_0 和 mlx5_1。
有关如何配置 RoCE LAG 的信息,请参阅 如何在 LAG 上配置 RoCE (ConnectX-4/ConnectX-5/ConnectX-6) 社区帖子。
默认情况下,所有 mlx5 设备都启用 RoCE。启用 RoCE 后,设备会将发送到 UDP 端口 4791 的所有流量视为 RoCE 流量。
如果您只对以太网(无 RDMA)感兴趣,并且希望启用转发到此端口的流量,则可以通过 sysfs 禁用 RoCE
echo <0
|1
> > /sys/devices/{pci-bus-address}/roce_enable
禁用 RoCE 后,将仅支持以太网流量。因此,将没有 GID 表,并且仅支持原始以太网 QP。
可以通过 sysfs 查询当前的 RoCE 状态
cat /sys/devices/{pci-bus-address}/roce_enable
默认情况下,在虚拟机管理程序上配置 VF 时,所有 VF 都将启用 RoCE。这意味着它们需要更多的操作系统内存(来自 VM)。如果您只对 VM 上的以太网(无 RDMA)感兴趣,并且希望节省 VM 内存,则可以从虚拟机管理程序禁用 VF 上的 RoCE。此外,通过禁用 RoCE,VM 可以具有将 RoCE UDP 端口 (4791) 用于标准 UDP 流量的功能。
有关如何在 VF 上启用/禁用 RoCE 的详细信息,请参阅 如何在 VM 上通过 VF 启用/禁用 RoCE 社区帖子。
此功能支持为所有 RC QP 设置全局 traffic_class 值,或基于多个匹配条件设置特定的 traffic class。
用法
要设置应用于所有 QP 的单个全局 traffic class,请将所需的全局 traffic_class 值写入 /sys/class/infiniband/<dev>/tc/<port>/traffic_class。
请注意以下事项
负值表示该功能已禁用。可以使用 ibv_modify_qp() 设置 traffic_class 值
有效值范围为 0 - 255
ToS 字段为 8 位,而 DSCP 字段为 6 位。要设置 DSCP 值 X,您需要将此值乘以 4(SHIFT 2)。例如,要设置 DSCP 值 24,请将 ToS 位设置为 96 (24x4=96)。
要基于源 IP 和/或目标 IP 设置多个 traffic class 值,请将所需的规则写入 /sys/class/infiniband/<dev>/tc/<port>/traffic_class。例如
echo
"tclass=16,src_ip=1.1.1.2,dst_ip=1.1.1.0/24"
> /sys/class
/infiniband/mlx5_0/tc/1
/traffic_class注意:向 tclass 值添加“tclass”前缀是可选的。
在上面的示例中,traffic class 16 将设置为任何源 IP 为 1.1.1.2 且目标 IP 为 1.1.1.0/24 的 QP。
请注意,在设置特定 traffic class 时,将应用以下规则优先级
如果设置了全局 traffic class 值,它将应用于所有 QP
如果未设置全局 traffic class 值,并且存在至少一个 QP 适用的匹配源 IP 和目标 IP 的规则,则将应用该规则
仅具有匹配源 IP 和/或目标 IP 的规则对其他具有匹配源 IP 和/或目标 IP 的规则没有定义的优先级
注释:
使用目标 IPv4 地址时,可以提供掩码
规则优先级不受规则插入顺序的影响
重叠规则完全由管理员决定。
“tclass=-1”将从数据库中删除该规则
此功能支持为所有 RC QP 设置全局 TTL 值。
将所需的 TTL 值写入 /sys/class/infiniband/<dev>/tc/<port>/ttl。有效值范围为 0 - 255