DOCA 文档 v2.10.0

流控转向

流控转向是一种新的模型,它根据流规范将网络流导向特定的 QP。这些流可以是单播或多播网络流。为了保持灵活性,使用了域和优先级。流控转向使用流属性的方法,流属性是 L2-L4 流规范、目标 QP 和优先级的组合。可以使用 ethtool 或 InfiniBand verbs 插入流控转向规则。verbs 抽象使用与流属性 (ibv_flow_attr) 不同的术语,流属性由规范 (struct ibv_flow_spec_*) 的组合定义。

所有流控转向功能在支持的适配器卡中均已启用。

流控转向定义了域和优先级的概念。每个域代表一个可以附加流的用户代理。域被赋予优先级。当较高优先级域的流规范与较低优先级域的流规范重叠时,较高优先级域将始终取代较低优先级域。设置较低的优先级值将导致更高的优先级。

除了域之外,每个域内都有优先级。每个域最多可以根据其需要拥有 2^12 个优先级。

以下是按优先级降序排列的域

  • 用户 Verbs 允许用户应用程序 QP 在使用 ibv_create_flowibv_destroy_flow verbs 时附加到指定的流

  • ibv_create_flow

    复制
    已复制!
                

    struct ibv_flow *ibv_create_flow(struct ibv_qp *qp, struct ibv_flow_attr *flow)

    输入参数:

    • struct ibv_qp - 附加的 QP。

    • struct ibv_flow_attr - 将 QP 附加到指定的流。该流包含强制性控制参数和可选的 L2、L3 和 L4 标头。可选标头通过设置大小和 num_of_specs 字段来检测

      struct ibv_flow_attr 之后可以是可选的流标头结构

      复制
      已复制!
                  

      struct ibv_flow_spec_eth struct ibv_flow_spec_ipv4 struct ibv_flow_spec_tcp_udp struct ibv_flow_spec_ipv6

      有关更多信息,请参阅 ibv_create_flow 手册页。

  • ibv_destroy_flow

    复制
    已复制!
                

    int ibv_destroy_flow(struct ibv_flow *flow_id)

    输入参数

    ibv_destroy_flow 需要 struct ibv_low,它是 ibv_create_flow 在成功情况下的返回值。

    输出参数:

    成功时返回 0,失败时返回 errno 的值。

    有关更多信息,请参阅 ibv_destroy_flow 手册页。

Ethtool 域用于将 RX 环(特别是其 QP)附加到指定的流。有关指定流的所有方法,请参阅最新的 ethtool 手册页。

示例:

  • ethtool –U eth5 flow-type ether dst 00:11:22:33:44:55 loc 5 action 2

    包含上述目标 MAC 地址的所有数据包都将被导向 rx-ring 2(其底层 QP),优先级为 5(在 ethtool 域内)

  • ethtool –U eth5 flow-type tcp4 src-ip 1.2.3.4 dst-port 8888 loc 5 action 2

    包含上述目标 IP 地址和源端口的所有数据包都将被导向 rx-ring 2。当未给出目标 MAC 时,将自动填充用户的目标 MAC。

  • ethtool -U eth5 flow-type ether dst 00:11:22:33:44:55 vlan 45 m 0xf000 loc 5 action 2

    包含上述目标 MAC 地址和特定 VLAN 的所有数据包都将被导向环 2。请注意 VLAN 的掩码 0xf000。添加此类规则需要此掩码。

  • ethtool –u eth5

    显示所有 ethtool 的转向规则

当配置两个具有相同优先级的规则时,第二个规则将覆盖第一个规则,因此此 ethtool 接口实际上是一个表。在内核中插入流控转向规则需要用户空间和内核(v2.6.28)中的 ethtool 的支持。

接收流控转向 (RFS) 和加速接收流控转向 (aRFS) 是内核功能,目前在大多数发行版中都可用。对于 RFS,数据包根据消耗数据包的应用程序的位置进行转发。aRFS 通过增加对硬件的支持来提高 RFS 的速度。通过使用 aRFS(与 RFS 不同),数据包被定向到本地于运行应用程序的线程的 CPU。

aRFS 是一种内核逻辑,负责通过将流附加到流所有者应用程序使用的 CPU 来实现 CPU 之间的负载均衡。此域允许 aRFS 机制使用流控转向基础设施来支持 aRFS 逻辑,方法是实现 ndo_rx_flow_steer,ndo_rx_flow_steer 反过来又使用 aRFS 域调用底层的流控转向机制。

配置 RFS

Procedure_Heading_Icon-version-1-modificationdate-1734566430070-api-v2.PNG

配置 RFS 流表条目(全局和每个核心)。

注意:该功能保持禁用状态,直到显式配置(默认情况下为 0)。

  • 全局流表中的条目数设置如下

    注意

    /proc/sys/net/core/rps_sock_flow_entries

  • 每个队列流表中的条目数设置如下

    注意

    /sys/class/net/<dev>/queues/rx-<n>/rps_flow_cnt

示例:

复制
已复制!
            

# echo 32768 > /proc/sys/net/core/rps_sock_flow_entries # NUM_CHANNELS=`ethtool -l ens6 | grep "Combined:" | tail -1 | awk '{print $2}'` # for f in `seq 0 $((NUM_CHANNELS-1))`; do echo 32768 > /sys/class/net/ens6/queues/rx-$f/rps_flow_cnt; done

配置 aRFS

Procedure_Heading_Icon-version-1-modificationdate-1734566430070-api-v2.PNG

aRFS 功能需要显式配置才能启用。启用 aRFS 需要通过 ethtool 启用“ntuple”标志。

例如,要为 eth0 启用 ntuple,请运行

复制
已复制!
            

ethtool -K eth0 ntuple on

aRFS 需要内核在编译时启用 CONFIG_RFS_ACCEL 选项。此选项在 2.6.39 及更高版本的内核中可用。此外,aRFS 需要设备管理的流控转向支持。

注意

如果启用了 LRO,RFS 将无法工作。可以通过 ethtool 禁用 LRO。

mlx_fs_dump 是一个 python 工具,它以可读的方式打印转向规则。主机上需要安装 Python v2.7 或更高版本,以及 pip、anytree 和 termcolor 库。

运行示例:

复制
已复制!
            

./ofed_scripts/utils/mlx_fs_dump -d /dev/mst/mt4115_pciconf0 FT: 9 (level: 0x18, type: NIC_RX) +-- FG: 0x15 (MISC) |-- FTE: 0x0 (FWD) to (TIR:0x7e) out.ethtype:IPv4 out.ip_prot:UDP out.udp_dport:0x140 +-- FTE: 0x1 (FWD) to (TIR:0x7e) out.ethtype:IPv4 out.ip_prot:UDP out.udp_dport:0x13f ...

有关 mlx_fs_dump 工具的更多信息,请参阅 mlx_fs_dump 社区帖子。

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