DOCA 文档 v2.10.0

OVS-DOCA 硬件加速

OVS-DOCA 基于 NVIDIA 的网络 API 设计,以保留相同的 OpenFlow、CLI 和数据接口(例如,vdpa、VF 直通),以及数据路径卸载 API,也称为 OVS-DPDK 和 OVS-Kernel。虽然所有 OVS 版本都使用流卸载进行硬件加速,但由于其架构和 DOCA 库的使用,OVS-DOCA 模式在其中提供了最有效的性能和功能集,从而最大限度地利用了 NVIDIA 网卡和 DPU。

ovs-doca-arch-version-1-modificationdate-1736936747170-api-v2.png

以下小节提供了启动/部署 OVS DOCA 的必要步骤。

要配置 OVS DOCA HW 卸载

  1. 解绑 VF

    复制
    已复制!
                

    echo 0000:04:00.2 > /sys/bus/pci/drivers/mlx5_core/unbind echo 0000:04:00.3 > /sys/bus/pci/drivers/mlx5_core/unbind

    注意

    带有附加 VF 的虚拟机必须关闭电源才能解绑 VF。

  2. 将 PF 设备上的 e-switch 模式从 legacy 更改为 switchdev(确保所有 VF 都已解绑)

    复制
    已复制!
                

    echo switchdev > /sys/class/net/enp4s0f0/compat/devlink/mode

    注意

    此命令还在主机操作系统中创建 VF representor 网络设备。

    要恢复到 SR-IOV legacy 模式

    复制
    已复制!
                

    echo legacy > /sys/class/net/enp4s0f0/compat/devlink/mode

  3. 绑定 VF

    复制
    已复制!
                

    echo 0000:04:00.2 > /sys/bus/pci/drivers/mlx5_core/bind echo 0000:04:00.3 > /sys/bus/pci/drivers/mlx5_core/bind

  4. 配置巨页

    复制
    已复制!
                

    mkdir -p /hugepages mount -t hugetlbfs hugetlbfs /hugepages echo 4096 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages

  5. 运行 Open vSwitch 服务

    复制
    已复制!
                

    systemctl start openvswitch

  6. 启用 DOCA 模式和硬件卸载(默认禁用)

    复制
    已复制!
                

    ovs-vsctl --no-wait set Open_vSwitch . other_config:doca-init=true ovs-vsctl set Open_vSwitch . other_config:hw-offload=true

  7. 重启 Open vSwitch 服务。

    复制
    已复制!
                

    systemctl restart openvswitch

    信息

    此步骤是 HW 卸载更改生效所必需的。

  8. 创建 OVS-DOCA 网桥

    复制
    已复制!
                

    ovs-vsctl --no-wait add-br br0-ovs -- set bridge br0-ovs datapath_type=netdev

  9. 将 PF 添加到 OVS

    复制
    已复制!
                

    ovs-vsctl add-port br0-ovs enp4s0f0 -- set Interface enp4s0f0 type=dpdk

  10. 将 representor 添加到 OVS

    复制
    已复制!
                

    ovs-vsctl add-port br0-ovs enp4s0f0_0 -- set Interface enp4s0f0_0 type=dpdk

    信息

    通过提供 dpdk-devargs 来添加 DPDK 端口而不使用相关 netdev 的传统选项仍然存在

    1. 添加 PF 端口

      复制
      已复制!
                  

      ovs-vsctl add-port br0-ovs pf -- set Interface pf type=dpdk options:dpdk-devargs=0000:88:00.0

    2. 添加 VF representor 端口

      复制
      已复制!
                  

      ovs-vsctl add-port br0-ovs representor -- set Interface representor type=dpdk options:dpdk-devargs=0000:88:00.0,representor=[0]

    3. 添加 SF representor 端口

      复制
      已复制!
                  

      ovs-vsctl add-port br0-ovs representor -- set Interface representor type=dpdk options:dpdk-devargs=0000:88:00.0,representor=sf[0]

    4. 添加 BlueField 主机 PF representor 端口

      复制
      已复制!
                  

      ovs-vsctl add-port br0-ovs hpf -- set Interface hpf type=dpdk options:dpdk-devargs=0000:88:00.0,representor=[65535]

  11. 可选配置

    1. 要设置端口 MTU,请运行

      复制
      已复制!
                  

      ovs-vsctl set interface enp4s0f0 mtu_request=9000

      注意

      OVS 重启是更改生效所必需的。

    2. 要设置 VF/SF MAC,请运行

      复制
      已复制!
                  

      ovs-vsctl add-port br0-ovs enp4s0f0 -- set Interface enp4s0f0 type=dpdk options:dpdk-vf-mac=00:11:22:33:44:55

      注意

      解绑和重新绑定 VF/SF 是更改生效所必需的。

设置默认数据路径

通过配置默认数据路径类型可以简化 OVS 命令,这最大限度地减少了重复配置,并简化了硬件加速部署的 OVS 设置过程。

要设置默认数据路径类型,请使用以下命令

复制
已复制!
            

ovs-vsctl set Open_vSwitch . other_config:default-datapath-type=<type>

例如,要将默认数据路径类型设置为 netdev

复制
已复制!
            

ovs-vsctl set Open_vSwitch . other_config:default-datapath-type=netdev

此配置允许创建网桥和接口,而无需为每个命令显式指定数据路径类型。例如

复制
已复制!
            

ovs-vsctl --no-wait add-br br0-ovs ovs-vsctl add-port br0-ovs enp4s0f0

这等效于以下命令,其中显式设置了数据路径类型

复制
已复制!
            

ovs-vsctl --no-wait add-br br0-ovs -- set bridge br0-ovs datapath_type=netdev ovs-vsctl add-port br0-ovs enp4s0f0 -- set Interface enp4s0f0 type=dpdk

注意

如果指定了不受支持的数据路径类型,OVS 将自动回退到默认的“system”类型。


OVS-DOCA 与 OVS-DPDK 共享其大部分结构。为了从 DOCA 卸载设计中受益,用户空间数据路径和端口的某些行为被修改。

Eswitch 依赖性

switchdev 模式下配置,物理端口和所有支持的功能共享一个通用域来执行卸载的流,即 eswitch

同一 eswitch 上的所有端口都依赖于其物理功能。如果此主物理功能被停用(例如,从 OVS 中移除或其链路关闭),则依赖端口也将被禁用。

预分配的卸载表

为了提供最高的插入速度,DOCA 卸载预先分配卸载结构(条目和容器)。

因此,在启动 vSwitch 守护程序时,卸载会配置为合理的默认值。如果需要不同数量的卸载,则可以使用特定于 OVS-DOCA 的配置条目,并在下一节中进行描述。

不支持 CT-CT-NAT

OVS-kernel 和 OVS-DPDK 中可以配置的特殊 ct-ct-nat 模式不受 OVS-DOCA 支持。

以下配置对于 OVS-DOCA 模式特别有用或特定。

信息

完整的 OVS vSwitch 配置列表记录在 man ovs-vswitchd.conf.db 中。

other_config

下表提供了 other_config 配置,这些配置是 vSwitch 全局的(非详尽列表,更多信息请查看手册页)

配置

描述

other_config:doca-init

  • 可选字符串,可以是 true 或 false

  • 将此值设置为 true 以启用 DOCA Flow HW 卸载

  • 默认值为 false。更改此值需要重启守护程序。

  • 这仅与用户空间数据路径相关

other_config:hw-offload-ct-size

  • 可选字符串,包含一个整数,至少为 0

  • 仅适用于 netdev 数据路径上的 DOCA 卸载提供程序

  • 配置可用连接跟踪 (CT) 卸载条目的数量

  • 默认值为 250000。更改此值需要重启守护程序。

  • 将值设置为 0 会禁用 CT 卸载

  • 更改此配置会影响 OVS 内存使用量,因为 CT 表是在 OVS 启动时分配的

  • 支持的最大连接数为 2M

    警告

    将此参数设置为超过 2M 可能会导致失败。

    注意

    为了获得最佳性能,请勿超过 1M 的 CT 大小。

other_config:hw-offload-ct-ipv6-enabled

  • 可选字符串,可以是 true 或 false

  • 仅适用于 netdev 数据路径上的 DOCA 卸载提供程序

  • 将此值设置为 true 以启用 IPv6 CT 卸载

  • 默认值为 false。更改此值需要重启守护程序。

  • 更改此配置会影响 OVS 内存使用量,因为 CT 表是在 OVS 启动时分配的

other_config:doca-congestion-threshold

  • 可选字符串,包含一个整数,范围为 30 到 90

  • DOCA 卸载结构的占用率,以百分比表示,该占用率触发调整大小

  • 默认为 80,但仅当 other_config:doca-init 为 true 时才相关。更改此值需要重启守护程序。

other_config:ctl-pipe-size

  • 可选字符串,包含一个整数

  • DOCA 控制管道的初始大小

  • 默认为 0,这是 DOCA 的内部默认值

other_config:ctl-pipe-infra-size

  • 可选字符串,包含一个整数

  • 基础架构 DOCA 控制管道的初始大小:root、post-hash、post-ct、post-meter、split、miss。

  • 默认为 0,回退到 other_config:ctl-pipe-size

other_config:pmd-quiet-idle

  • 可选字符串,可以是 true 或 false

  • 允许 PMD 线程在空闲时进入静默模式。如果没有接收到或等待处理和发送的数据包,则进入连续的静默期。一旦接收到数据包,立即结束此期间。

  • 默认情况下禁用此选项

other_config:pmd-maxsleep

  • 可选字符串,包含一个整数,范围为 0 到 10,000

  • 指定 PMD 线程在每次迭代中的最大休眠时间(以微秒为单位),该线程已从其轮询的 Rx 队列中接收到零个或少量数据包。

  • 请求的实际休眠时间基于 PMD 轮询的 Rx 队列的负载,并且可能小于最大值

  • 默认值为 0 微秒,这意味着 PMD 无论其轮询的 Rx 队列的负载如何都不会休眠

  • 为避免请求非常小的休眠时间(例如,小于 10 微秒),该值将向上舍入到最接近的 10 微秒

  • 最大值为 10000 微秒。

other_config:dpdk-max-memzones

  • 可选字符串,包含一个整数

  • 指定可以在 DPDK 中创建的最大内存区域数

  • 默认值为空,保留 DPDK 的默认值。更改此值需要重启守护程序。

other_config:pmd-cpu-mask

借助 PMD 多线程支持,如果至少有一个来自该 NUMA 节点的 DPDK 接口添加到 OVS,则 OVS 默认情况下为每个 NUMA 节点创建一个 PMD 线程。但是,在存在多个端口/rxqs 产生流量的情况下,可以通过创建在单独内核上运行的多个 PMD 线程来提高性能。这些 PMD 线程可以通过各自负责不同的端口/rxqs 来共享工作负载。端口/rxqs 到 PMD 线程的分配是自动完成的。

掩码中的设置位表示创建了一个 PMD 线程并将其绑定到相应的 CPU 内核。例如,要在内核 1 和 2 上运行 PMD 线程,请运行

复制
已复制!
            

$ ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x6


netdev-dpdk

下表提供了 netdev-dpdk 配置,这些配置仅用户空间(DOCA 或 DPDK)netdev 支持(非详尽列表,更多信息请查看手册页)

配置

描述

options:iface-name

  • 指定端口的接口名称

  • 提供此选项通过查询 sysfs 以检查接口是否存在,然后再由 DPDK 尝试探测端口,从而加速端口重新配置的处理


用户空间而不是基于内核的 Open vSwitch 中的 vSwitch 需要一个额外的网桥。此网桥的目的是允许使用内核网络堆栈进行路由和 ARP 解析。

数据路径必须查找路由表和 ARP 表,以准备隧道标头并将数据传输到输出端口。

VXLAN 封装/解封装卸载配置通过以下方式完成

  • PF 在 0000:03:00.0 PCIe 和 MAC 98:03:9b:cc:21:e8

  • 本地 IP 56.56.67.1br-phy 接口配置为此 IP

  • 远程 IP 56.56.68.1

要配置 OVS DOCA VXLAN

  1. 创建 br-phy 网桥

    复制
    已复制!
                

    ovs-vsctl add-br br-phy -- set Bridge br-phy datapath_type=netdev -- br-set-external-id br-phy bridge-id br-phy -- set bridge br-phy fail-mode=standalone other_config:hwaddr=98:03:9b:cc:21:e8

  2. 将 PF 接口附加到 br-phy 网桥

    复制
    已复制!
                

    ovs-vsctl add-port br-phy enp4s0f0 -- set Interface enp4s0f0 type=dpdk

  3. 将 IP 配置到网桥

    复制
    已复制!
                

    ip addr add 56.56.67.1/24 dev br-phy

  4. 创建 br-ovs 网桥

    复制
    已复制!
                

    ovs-vsctl add-br br-ovs -- set Bridge br-ovs datapath_type=netdev -- br-set-external-id br-ovs bridge-id br-ovs -- set bridge br-ovs fail-mode=standalone

  5. 将 representor 附加到 br-ovs

    复制
    已复制!
                

    ovs-vsctl add-port br-ovs enp4s0f0_0 -- set Interface enp4s0f0_0 type=dpdk

  6. 为 VXLAN 隧道添加端口

    复制
    已复制!
                

    ovs-vsctl add-port br-ovs vxlan0 -- set interface vxlan0 type=vxlan options:local_ip=56.56.67.1 options:remote_ip=56.56.68.1 options:key=45 options:dst_port=4789

VXLAN GBP 扩展

VXLAN 基于组的策略 (GBP) 模型概述了一个以应用程序为中心的策略框架,该框架指定应用程序的连接要求,而与网络的物理布局无关。

为 VXLAN 端口设置 GBP 扩展允许按流匹配和设置 GBP ID。要在首次添加端口 vxlan0 时启用 GBP 扩展

复制
已复制!
            

ovs-vsctl add-port br-int vxlan0 -- set interface vxlan0 type=vxlan options:key=30 options:remote_ip=10.0.30.1 options:exts=gbp

也可以为现有的 VXLAN 端口启用 GBP 扩展

复制
已复制!
            

ovs-vsctl set interface vxlan1 options:exts=gbp

此方法有一个限制,即它在 OVS vswitchd 服务重启后才生效。在有多个 VXLAN 端口的情况下,它们的所有端口选项都必须共享相同的 GBP 扩展配置。不支持某些 VXLAN 端口启用 GBP 扩展而其他端口禁用的混合配置。

启用 GBP 扩展后,可以卸载以下匹配 GBP ID 32 或在操作中设置 GBP ID 64 的 OpenFlow 规则

复制
已复制!
            

ovs-ofctl add-flow br-int table=0,priority=100,in_port=vxlan0,tun_gbp_id=32 actions=output:pf0vf0 ovs-ofctl add-flow br-int table=0,priority=100,in_port=pf0vf0 actions=load:64->NXM_NX_TUN_GBP_ID[],output:vxlan0


VF-隧道配置

为了有效地卸载底层流量,直接在网桥端口上配置底层 IP 是不够的。相反,应分配专用的 VF 或 SF,并将其 representor 添加到 br-phy 网桥。此设置允许正确卸载底层流量。

要将 representor 添加到网桥,请使用以下命令

复制
已复制!
            

ovs-vsctl add-port br-phy <REP> -- set interface <REP> type=dpdk

直接在 VF 或 SF 设备上配置底层 IP 地址。

限制

  • <REP> 指的是 representor 的 Linux 接口名称

  • VF 或 SF 必须在将 representor 附加到 OVS 之前绑定到其驱动程序

  • VF 或 SF 必须与 OVS 位于同一命名空间中

  • 底层 IP 地址应在 representor 附加到 OVS 后配置。可以在配置底层 IP 的情况下重启 OVS。

连接跟踪通过记录当前打开的连接来实现有状态的数据包处理。

利用连接跟踪的 OVS 流可以通过卸载已建立的连接,使用高级网卡进行加速。

要查看卸载统计信息,请运行

复制
已复制!
            

ovs-appctl dpctl/offload-stats-show

要配置 OVS-DOCA SR-IOV VF LAG

  1. 在网卡上启用 SR-IOV

    复制
    已复制!
                

    // It is recommended to query the parameters first to determine if a change is needed, to save potentially unnecessary reboot. mst start mlxconfig -d <mst device> -y set PF_NUM_OF_VF_VALID=0 SRIOV_EN=1 NUM_OF_VFS=8

    注意

    如果配置确实发生了更改,请执行 BlueField 系统重启,以使 mlxconfig 设置生效。

  2. 为了能够在 VF/SF 存在的情况下移动到 VF LAG 模式,请在 BlueField Arm OS 或主机上为 ConnectX 设置 nvconig 参数 LAG_RESOURCE_ALLOCATION=1

    复制
    已复制!
                

    mst start mlxconfig -d /dev/mst/mt*conf0 -y s LAG_RESOURCE_ALLOCATION=1

  3. 为每个端口分配所需的 VF 数量

    复制
    已复制!
                

    echo $n > /sys/class/net/<net name>/device/sriov_numvfs

  4. 解绑所有 VF

    复制
    已复制!
                

    echo <VF PCI> >/sys/bus/pci/drivers/mlx5_core/unbind

  5. 将两个网卡的模式都更改为 SwitchDev

    复制
    已复制!
                

    devlink dev eswitch set pci/<PCI> mode switchdev

  6. 使用内核模块创建 Linux bonding

    复制
    已复制!
                

    modprobe bonding mode=<desired mode>

    注意

    此处可以添加其他 bonding 参数。支持的 bond 模式为 Active-Backup、XOR 和 LACP。

  7. 关闭所有 PF 和 VF

    复制
    已复制!
                

    ip link set <PF/VF> down

  8. 将两个 PF 都附加到 bond

    复制
    已复制!
                

    ip link set <PF> master bond0

  9. 启动 PF 和 bond 链路

    复制
    已复制!
                

    ip link set <PF0> up ip link set <PF1> up ip link set bond0 up

  10. 将 bond 接口作为 type=dpdk 添加到网桥

    复制
    已复制!
                

    ovs-vsctl add-port br-phy bond0 -- set Interface bond0 type=dpdk options:dpdk-lsc-interrupt=true

    信息

    在 OVS-DPDK 中使用 VF-LAG 的传统选项是将 bond master (PF) 接口添加到网桥

    复制
    已复制!
                

    ovs-vsctl add-port br-phy p0 -- set Interface p0 type=dpdk options:dpdk-devargs=<PF0-PCI>,dv_flow_en=2,dv_xmeta_en=4 options:dpdk-lsc-interrupt=true

  11. 将 PF0 或 PF1 的 VF representor 添加到网桥

    复制
    已复制!
                

    ovs-vsctl add-port br-phy enp4s0f0_0 -- set Interface enp4s0f0_0 type=dpdk

    复制
    已复制!
                

    ovs-vsctl add-port br-phy enp4s0f1_0 -- set Interface enp4s0f1_0 type=dpdk

    信息

    添加 DPDK 端口的传统选项

    复制
    已复制!
                

    ovs-vsctl add-port br-phy rep$N -- set Interface rep$N type=dpdk options:dpdk-devargs=<PF0-PCI>,representor=pf0vf$N,dv_flow_en=2,dv_xmeta_en=4

    复制
    已复制!
                

    ovs-vsctl add-port br-phy rep$N -- set Interface rep$N type=dpdk options:dpdk-devargs=<PF0-PCI>,representor=pf1vf$N,dv_flow_en=2,dv_xmeta_en=4

在多端口 eswitch 模式下,所有上行链路和所有物理端口的 VF/SF representor 都由同一硬件交换机管理。这允许从物理端口实体转发到物理端口二实体。

  1. 要配置多端口 eswitch 模式,必须在 BlueField Arm OS 中设置 nvconig 参数 LAG_RESOURCE_ALLOCATION=1,按照以下说明进行操作

    复制
    已复制!
                

    mst start mlxconfig -d /dev/mst/mt*conf0 -y s LAG_RESOURCE_ALLOCATION=1

  2. 执行 BlueField 系统重启,以使 mlxconfig 设置生效。

  3. 在驱动程序加载后,以及移动到 switchdev 模式后,为每个 PF 配置多端口 eswitch,其中 p0 和 p1 代表 PF 的 netdevice

    复制
    已复制!
                

    devlink dev param set pci/0000:03:00.0 name esw_multiport value 1 cmode runtime devlink dev param set pci/0000:03:00.1 name esw_multiport value 1 cmode runtime

    信息

    在两个 PF 上都进入 switchdev 模式后,该模式变为可操作模式。

  4. 可以通过在 /etc/mellanox/mlnx-bf.conf 中添加以下行,默认激活此模式

    复制
    已复制!
                

    ENABLE_ESWITCH_MULTIPORT="yes"

在此模式下,第二个端口不是 eswitch 管理器,应使用此命令添加到 OVS

复制
已复制!
            

ovs-vsctl add-port br-phy enp4s0f1 -- set interface enp4s0f1 type=dpdk

可以使用此命令添加第二个端口的 VF

复制
已复制!
            

ovs-vsctl add-port br-phy enp4s0f1_0 -- set interface enp4s0f1_0 type=dpdk

信息

添加 DPDK 端口的传统选项

复制
已复制!
            

ovs-vsctl add-port br-phy p1 -- set interface p1 type=dpdk options:dpdk-devargs="0000:08:00.0,dv_xmeta_en=4,dv_flow_en=2,representor=pf1

可以使用此命令添加第二个端口的 VF

复制
已复制!
            

ovs-vsctl add-port br-phy p1vf0 -- set interface p1 type=dpdk options:dpdk-devargs="0000:08:00.0,dv_xmeta_en=4,dv_flow_en=2,representor=pf1vf0

Geneve 隧道卸载支持包括匹配扩展标头。

注意

OVS-DOCA Geneve 选项限制

  • 仅支持 1 个 Geneve 选项

  • 最大选项长度为 7

  • 要更改当前正在匹配和封装的 Geneve 选项,用户必须删除所有端口或重启 OVS 并配置新选项

  • 匹配 Geneve 选项可以使用 FLEX_PARSER profile 0(默认 profile)。也支持使用 FLEX_PARSER profile 8。要配置它,请运行

    复制
    已复制!
                

    mst start mlxconfig -d <mst device> s FLEX_PARSER_PROFILE_ENABLE=8

    注意

    执行 BlueField 系统重启,以使 mlxconfig 设置生效。

要配置 OVS-DOCA Geneve 封装/解封装

  1. 创建 br-phy 网桥

    复制
    已复制!
                

    ovs-vsctl --may-exist add-br br-phy -- set Bridge br-phy datapath_type=netdev -- br-set-external-id br-phy bridge-id br-phy -- set bridge br-phy fail-mode=standalone

  2. 将 PF 接口附加到 br-phy 网桥

    复制
    已复制!
                

    ovs-vsctl add-port br-phy enp4s0f0 -- set Interface enp4s0f0 type=dpdk

  3. 将 IP 配置到网桥

    复制
    已复制!
                

    ifconfig br-phy <$local_ip_1> up

  4. 创建 br-int 网桥

    复制
    已复制!
                

    ovs-vsctl add-port br-int enp4s0f0_0 -- set Interface enp4s0f0_0 type=dpdk

  5. 将 representor 附加到 br-int

    复制
    已复制!
                

    ovs-vsctl add-port br-int rep$x -- set Interface rep$x type=dpdk

  6. 为 Geneve 隧道添加端口

    复制
    已复制!
                

    ovs-vsctl add-port br-int geneve0 -- set interface geneve0 type=geneve options:key=<VNI> options:remote_ip=<$remote_ip_1> options:local_ip=<$local_ip_1>

要配置 OVS-DOCA GRE 封装/解封装

  1. 创建 br-phy 网桥

    复制
    已复制!
                

    ovs-vsctl --may-exist add-br br-phy -- set Bridge br-phy datapath_type=netdev -- br-set-external-id br-phy bridge-id br-phy -- set bridge br-phy fail-mode=standalone

  2. 将 PF 接口附加到 br-phy 网桥

    复制
    已复制!
                

    ovs-vsctl add-port br-phy enp4s0f0 -- set Interface enp4s0f0 type=dpdk

  3. 将 IP 配置到网桥

    复制
    已复制!
                

    ifconfig br-phy <$local_ip_1> up

  4. 创建 br-int 网桥

    复制
    已复制!
                

    ovs-vsctl --may-exist add-br br-int -- set Bridge br-int datapath_type=netdev -- br-set-external-id br-int bridge-id br-int -- set bridge br-int fail-mode=standalone

  5. 将 representor 附加到 br-int

    复制
    已复制!
                

    ovs-vsctl add-port br-int enp4s0f0_0 -- set Interface enp4s0f0_0 type=dpdk

为 Geneve 隧道添加端口

复制
已复制!
            

ovs-vsctl add-port br-int gre0 -- set interface gre0 type=gre options:key=<VNI> options:remote_ip=<$remote_ip_1> options:local_ip=<$local_ip_1>

慢速路径速率限制允许控制绕过硬件卸载规则并随后由软件处理的流量速率。

要配置慢速路径速率限制

  1. 创建 br-phy 网桥

    复制
    已复制!
                

    ovs-vsctl --may-exist add-br br-phy -- set Bridge br-phy datapath_type=netdev -- br-set-external-id br-phy bridge-id br-phy -- set bridge br-phy fail-mode=standalone

  2. 将 PF 接口附加到 br-phy 网桥

    复制
    已复制!
                

    ovs-vsctl add-port br-phy pf0 -- set Interface pf0 type=dpdk

  3. pf0vf0 的速率限制为 10Kpps,突发大小为 6K

    复制
    已复制!
                

    ovs-vsctl set interface pf0 options:sw-meter=pps:10k:6k

  4. 重启 OVS

    复制
    已复制!
                

    systemctl restart openvswitch-switch.service

还支持 dry-run 选项,以允许在生产环境中测试不同的软件 meter 配置。这允许收集统计信息,而不会影响实际的流量流。然后可以分析这些统计信息,以确定适当的速率限制阈值。启用 dry-run 选项后,不会丢弃或速率限制流量,从而允许正常操作继续而不会中断。但是,系统会模拟速率限制过程并递增计数器,就像数据包被丢弃一样。

要启用慢速路径速率限制 dry-run

  1. 创建 br-phy 网桥

    复制
    已复制!
                

    ovs-vsctl --may-exist add-br br-phy -- set Bridge br-phy datapath_type=netdev -- br-set-external-id br-phy bridge-id br-phy -- set bridge br-phy fail-mode=standalone

  2. 将 PF 接口附加到 br-phy 网桥

    复制
    已复制!
                

    ovs-vsctl add-port br-phy pf0 -- set Interface pf0 type=dpdk

  3. pf0vf0 的速率限制为 10Kpps,突发大小为 6K

    复制
    已复制!
                

    ovs-vsctl set interface pf0 options:sw-meter=pps:10k:6k

  4. 设置 sw-meter-dry-run 选项

    复制
    已复制!
                

    ovs-vsctl set interface pf0vf0 options:sw-meter-dry-run=true

  5. 重启 OVS

    复制
    已复制!
                

    systemctl restart openvswitch-switch.service

发夹模式允许将数据包从线路转发到线路。

要配置发夹模式

  1. 创建 br-phy 网桥

    复制
    已复制!
                

    ovs-vsctl --may-exist add-br br-phy -- set Bridge br-phy datapath_type=netdev -- br-set-external-id br-phy bridge-id br-phy -- set bridge br-phy fail-mode=standalone

  2. 将 PF 接口附加到 br-phy 网桥

    复制
    已复制!
                

    ovs-vsctl add-port br-phy pf0 -- set Interface pf0 type=dpdk

  3. 添加发夹 OpenFlow 规则

    复制
    已复制!
                

    ovs-ofctl add-flow br-phy"in_port=pf0,ip,actions=in_port"

OVS-DOCA 支持 OpenFlow meter 操作,如本文档的“OpenFlow Meters”部分所述。此外,OVS-DOCA 支持在单个数据路径规则中链接多个 meter 操作。

以下是此类 OpenFlow 规则的示例配置

复制
已复制!
            

ovs-ofctl add-flow br-phy -O OpenFlow13 "table=0,priority=1,in_port=pf0vf0_r,ip actions=meter=1,resubmit(,1)" ovs-ofctl add-flow br-phy -O OpenFlow13 "table=1,priority=1,in_port=pf0vf0_r,ip actions=meter=2,normal"

Meter 操作按顺序应用,首先使用 meter ID 1,然后使用 meter ID 2。

此类配置的用例示例

  • 使用不同的 meter 类型(每秒字节数和每秒数据包数)限制同一逻辑流的速率

  • 计量一组流。由于 meter ID 可以被多个流使用,因此可以与其他逻辑流重用此示例中的 meter ID 2;从而确保它们的累积带宽受到 meter 的限制。

OVS 支持组配置。“select”类型执行组中的一个 bucket,根据其权重在 bucket 之间进行平衡。为了选择一个 bucket,对于每个活动的 bucket,OVS 使用 bucket ID 对流数据进行哈希处理,并将哈希值乘以 bucket 权重以获得“分数”。选择得分最高的 bucket。

信息

有关更多详细信息,请参阅 ovs-ofctl 手册

例如

  • ovs-ofctl add-group br-int 'group_id=1,type=select,bucket=<port1>'

  • ovs-ofctl add-flow br-int in_port=<port0>,actions=group=1

限制

  • 卸载仅在 IP 流量(IPv4 或 IPv6)上受支持

sFlow 标准概述了一种在交换或路由网络中捕获流量数据的方法。它采用采样技术从设备收集统计信息,使其适用于高速网络。

使用预定的采样率,每 N 个数据包捕获一个数据包。虽然这种采样方法不会产生完全准确的结果,但它确实提供了可接受的准确性。

要激活对遍历名为 br-int 的 OVS 网桥的所有流量的 0.2% 进行采样,请运行

复制
已复制!
            

ovs-vsctl -- --id=@sflow create sflow agent=lo target=127.0.0.1:6343 header=96 sampling=512 -- set bridge br-int sflow=@sflow

通过在网桥上进行此 sFlow 配置,捕获的数据包将镜像到 sFlow 收集器应用程序,该应用程序在本地主机的默认 sFlow 端口 6343 上进行侦听。

信息

sFlow 收集器应用程序不在此指南的范围内。

可以将采样率设置为 1,同时在网桥上配置 sFlow,这实际上会将所有流量镜像到 sFlow 收集器。

除了原始数据包目标之外,镜像还可用于将数据包从一个端口复制到另一个端口。这可以使用 OpenFlow 输出操作或 ovs-vsctl create mirror 命令来完成。

例如,要在 OVS 网桥 br-int 上配置将端口 pf0vf1_r 的所有流量镜像到端口 pf0vf2_r,请运行

复制
已复制!
            

ovs-vsctl -- --id=@p1 get port pf0vf1_r -- --id=@p2 get port pf0vf2_r -- --id=@m create mirror name=m1 select_dst_port=@p1 select_src_port=@p1 output-port=@p2 -- set bridge br-int mirrors=@m

这将生成具有多个输出端口的数据路径规则。每个输出端口排列都需要不同的镜像配置。默认情况下,仅支持 128 种不同的此类配置。要更改此数字,请使用 doca-mirror-max other_config。例如,通过运行以下命令将 other_config:doca-mirror-max 设置为 2048

复制
已复制!
            

ovs-vsctl set Open_vSwitch . other_config:doca-mirror-max=2048

  • 当使用两个 PF,每个 PF 具有 127 个 VF,并将它们的 representor 添加到 OVS 网桥时,用户必须配置 dpdk-memzones

    复制
    已复制!
                

    ovs-vsctl set o . other_config:dpdk-max-memzones=6500 restart ovs

  • 在包含物理网桥和内部网桥的 OVS 拓扑中,当采用 VXLAN 隧道时,仅在内部网桥上支持 sFlow 卸载。在这种情况下,在物理网桥上使用 sFlow 会导致仅部分卸载流。

可以使用 dbg 日志级别在 vSwitch 日志文件中启用其他调试信息

复制
已复制!
            

( topics='netdev|ofproto|ofp|odp|doca' IFS=$'\n'; for topic in $(ovs-appctl vlog/list | grep -E "$topics" | cut -d' ' -f1) do printf "$topic:file:dbg " done ) | xargs ovs-appctl vlog/set

列出的主题与 DOCA 卸载操作相关。

已添加特定于 DOCA 卸载提供程序的覆盖率计数器。应使用以下命令来检查它们

复制
已复制!
            

ovs-appctl coverage/show # Print the current non-zero coverage counters

下表提供了这些 DOCA 特定计数器背后的含义

计数器

描述

doca_async_queue_full

当守护程序尝试插入新的卸载时,异步卸载插入队列已满。

队列将被刷新,并再次尝试插入。

这不是致命错误,但表示硬件速度减慢。

doca_async_queue_blocked

即使在多次尝试刷新当前排队的请求后,异步卸载插入队列仍然已满。

虽然不是致命错误,但在正常的卸载操作期间永远不应发生,应将其视为错误。

doca_async_add_failed

异步插入失败,特别是由于其异步性质。这不应发生,应将其视为错误。

doca_pipe_resize

DOCA 管道已调整大小的次数。这是正常且预期的,因为 DOCA 管道接收更多条目。

doca_pipe_resize_over_10_ms

DOCA 管道调整大小花费了超过 10 毫秒才能完成。这可能会偶尔发生。

如果测量到插入速率突然下降,则此计数器可以帮助识别根本原因。

要从提供的源和预安装的具有相同版本软件包的 DOCA 构建 OVS-DOCA,请运行

复制
已复制!
            

$ ./boot.sh $ ./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc --with-dpdk=static --with-doca=static $ make -j 10 $ make install

帮助程序构建脚本与 OVS-DOCA 源代码捆绑在一起,可以按如下方式使用

复制
已复制!
            

$ ./build.sh --install-deps $ ./build.sh --install-ovs

Megaflows 将多个微流聚合到单个流条目中,减少了流表的负载,并提高了数据包处理效率。在 OVS 中扩展 megaflows 对于优化网络性能和确保高效处理高流量至关重要。默认情况下,OVS-DOCA 可以处理多达 20 万个 megaflows。

为了有效地管理和扩展 megaflows,可以调整 OVS 的 other_config 部分中的几个关键配置

  • flow-limit 参数设置可以存储在流表中的最大流数,有助于控制内存使用并防止溢出。

  • max-revalidator 参数定义了重新验证器线程在启动流重新验证之前将等待的最长时间(以毫秒为单位)。至关重要的是要理解,这表示上限,OVS 使用的实际超时是 max-idlemax-revalidator 值中的较小者。如果没有彻底了解其影响,通常不建议修改此参数。对于 CPU 功能较弱的系统,建议设置较高的 max-revalidator 值,以补偿计算能力下降并确保重新验证完成。

微调这些设置可以提高 OVS 部署的可扩展性和性能,使其能够有效地管理更多数量的 megaflows。

  • 要设置 flow-limit(默认为 20 万)

    复制
    已复制!
                

    $ ovs-vsctl set o . other_config:flow-limit=<desired_value>

  • 要设置 max-revalidator(默认为 250 毫秒)。

    复制
    已复制!
                

    $ ovs-vsctl set o . other_config:max-revalidator=<desired_value>

© 版权所有 2025,NVIDIA。 上次更新于 2025 年 2 月 12 日。