DOCA 文档 v2.10.0

基于融合以太网的 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 协议栈

image2019-2-12_10-26-53-version-1-modificationdate-1734564464527-api-v2.png

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 用户手册

要安装和加载驱动程序

  1. 安装 MLNX_OFED(有关更多详细信息,请参阅安装部分)。

    RoCE 在驱动程序安装时作为 mlx5 和其他模块的一部分安装。

    注意

    可以在配置文件 /etc/infiniband/openib.conf 中找到启动时将自动加载的模块列表。

  2. 查询设备的信息。示例

    复制
    已复制!
                

    ibv_devinfo MLNX_OFED_LINUX-5.0-2.1.8.0:

  3. 显示现有的 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 状态

端口状态也可以通过运行以下命令获得

# cat /sys/class/infiniband/mlx5_0/ports/1/state: ACTIVE

link_layer 参数显示端口 1 是以太网

link_layer 也可以通过运行以下命令获得

# cat /sys/class/infiniband/mlx5_0/ports/1/link_layer Ethernet

fw_ver 参数显示固件版本为 16.28.0578。

固件版本也可以通过运行以下命令获得

# cat /sys/class/infiniband/mlx5_0/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 地址

  1. 在链路两侧的 netdev 接口上配置 IP 地址。

    复制
    已复制!
                

    # ifconfig eth2 20.4.3.220 # ifconfig eth2 eth2 Link encap:Ethernet HWaddr 00: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)

  2. 确保 ping 正常工作。

    复制
    已复制!
                

    ping 20.4.3.219 PING 20.4.3.219 (20.4.3.219) 56(84) bytes of data. 64 bytes from 20.4.3.219: icmp_seq=1 ttl=64 time=0.873 ms 64 bytes from 20.4.3.219: icmp_seq=2 ttl=64 time=0.198 ms 64 bytes from 20.4.3.219: icmp_seq=3 ttl=64 time=0.167 ms 20.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

  1. 确保已加载 8021.q 模块。

    复制
    已复制!
                

    modprobe 8021q

  2. 添加 VLAN。

    复制
    已复制!
                

    # vconfig add eth2 7 Added VLAN with VID == 7 to IF -:eth2:- #

  3. 配置 IP 地址。

    复制
    已复制!
                

    ifconfig eth2.7 7.4.3.220

定义以太网优先级(802.1q 标头中的 PCP)

  1. 在服务器上定义以太网优先级。

    复制
    已复制!
                

    # ibv_rc_pingpong -g 1 -i 2 -l 4 local address: LID 0x0000, QPN 0x1c004f, PSN 0x9daf6c, GID fe80::202:c900:708:e799 remote address: LID 0x0000, QPN 0x1c004f, PSN 0xb0a49b, GID fe80::202:c900:708:e811 8192000 bytes in 0.01 seconds = 4840.89 Mbit/sec 1000 iters in 0.01 seconds = 13.54 usec/iter

  2. 在客户端上定义以太网优先级。

    复制
    已复制!
                

    # ibv_rc_pingpong -g 1 -i 2 -l 4 sw419 local address: LID 0x0000, QPN 0x1c004f, PSN 0xb0a49b, GID fe80::202:c900:708:e811 remote address: LID 0x0000, QPN 0x1c004f, PSN 0x9daf6c, GID fe80::202:c900:708:e799 8192000 bytes in 0.01 seconds = 4855.96 Mbit/sec 1000 iters in 0.01 seconds = 13.50 usec/iter

使用 rdma_cm 测试

  1. 在服务器上使用 rdma_cm 测试。

    复制
    已复制!
                

    # ucmatose cmatose: starting server initiating data transfers completing sends receiving data transfers data transfers complete cmatose: disconnecting disconnected test complete return status 0 #

  2. 在客户端上使用 rdma_cm 测试。

    复制
    已复制!
                

    # ucmatose -s 20.4.3.219 cmatose: starting client cmatose: connecting receiving data transfers sending replies data transfers complete test complete return status 0 #

此服务器-客户端运行不带 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

© 版权所有 2025 NVIDIA。 上次更新时间:2025 年 2 月 12 日。