DOCA 虚拟功能用户指南
本指南概述并配置了 NVIDIA® BlueField® 的虚拟功能,并演示了在 x86 主机上运行 DOCA 应用程序的用例。
单根 I/O 虚拟化 (SR-IOV) 是一种技术,允许物理 PCIe 设备通过 PCIe 总线多次呈现自身。此技术支持具有独立资源的设备的多个虚拟实例。 NVIDIA 适配器能够为每个端口单独公开虚拟实例或功能 (VF)。然后可以单独配置这些虚拟功能。
每个 VF 都可以看作是连接到物理接口或功能 (PF) 的附加设备。它与 PF 共享相同的资源,并且其端口数与 PF 的端口数相等。
SR-IOV 通常与启用 SR-IOV 的虚拟机监控程序结合使用,以向虚拟机提供对网络资源的直接硬件访问,从而提高其性能。
在主机上运行应用程序有几个好处。例如,可能有人希望利用强大的高资源主机,或者在将 DOCA 集成卸载到 BlueField DPU 之前,先在主机上启动 DOCA 集成。
本文档中的配置允许整个应用程序在主机的内存中运行,同时利用 BlueField 上的硬件加速器。
当在主机上启用 VF 时,VF 表示器在 Arm 端可见,可以桥接到相应的 PF 表示器(例如,上行链路表示器和主机表示器)。这允许应用程序仅扫描转发到用户配置的 VF 的流量,并表现得像一个简单的“线路搭接”。安装在主机上的 DOCA 允许访问 BlueField DPU 的硬件功能,而不会影响使用嵌入在 eSwitch 内部的硬件卸载/steering 元素的功能。
要在主机上运行所有参考应用程序,您必须安装主机 DOCA 软件包。有关主机安装的更多信息,请参阅 DOCA Linux 安装指南。
VF 必须配置为受信任,硬件跳转操作才能按预期工作。以下步骤配置 VF 的“受信任”模式
删除所有现有 VF
要删除 PF 上的所有 VF,请在主机上运行以下命令
host $ echo 0 > /sys/class/net/<physical_function>/device/sriov_numvfs
例如
host $ echo 0 > /sys/class/net/ens1f0/device/sriov_numvfs
删除所有现有 SF。
信息有关删除 SF 的说明,请参阅 BlueField 可扩展功能用户指南。
停止主机上的主驱动程序
host $ /etc/init.d/openibd stop
在创建 VF 之前,通过在 DPU 端运行以下命令将它们设置为设备上的“受信任”模式。
在端口 0 上设置 VF
host $ mlxreg -d /dev/mst/mt41686_pciconf0 --reg_id 0xc007 --reg_len 0x40 --indexes "0x0.0:32=0x80000000" --yes --set "0x4.0:32=0x1"
在端口 1 上设置 VF
host $ mlxreg -d /dev/mst/mt41686_pciconf0.
1
--reg_id0xc007
--reg_len0x40
--indexes"0x0.0:32=0x80000000"
--yes --set"0x4.0:32=0x1"
注意这些命令在 DPU 上执行后,为所有创建的 VF/SF 设置受信任模式。
注意每次重启应执行一次设置受信任模式。
通过运行以下命令重启主机上的主驱动程序
host $ /etc/init.d/openibd restart
确保 mst 驱动程序正在运行
host $ sudo mst status
如果未加载,请运行
host $ sudo mst start
启用 SR-IOV。运行
host $ sudo mlxconfig -y -d /dev/mst/mt41686_pciconf0 s SRIOV_EN=1
设置 VF 数量。运行
host $ sudo mlxconfig -y -d /dev/mst/mt41686_pciconf0 s NUM_OF_VFS=X
注意执行 BlueField 系统重启 以使
mlxconfig
设置生效。host $ echo X > /sys/
class
/net/<physical_function>/device/sriov_numvfs例如
host $ sudo mlxconfig -y -d /dev/mst/mt41686_pciconf0 s NUM_OF_VFS=2 host $ reboot host $ echo 2 > /sys/class/net/ens1f0/device/sriov_numvfs
启用 VF 后,表示器将出现在 DPU 上。该功能本身在 x86 端可见。
验证 VF 是否已创建。运行
host $ lspci | grep Virtual b1:00.3 Ethernet controller: Mellanox Technologies ConnectX Family mlx5Gen Virtual Function (rev 01) b1:00.4 Ethernet controller: Mellanox Technologies ConnectX Family mlx5Gen Virtual Function (rev 01) b1:01.3 Ethernet controller: Mellanox Technologies ConnectX Family mlx5Gen Virtual Function (rev 01)
注意在此示例中,创建了 2 个新的虚拟以太网设备。
如前所述,分配所需数量的 VF。
分配应用程序指定的任何其他资源(例如,巨页)。
以下是在主机上使用 VF 运行参考应用程序的 CLI 示例
doca_<app_name> -a "pci address VF0" -a "pci address VF1" -c 0xff -- [application flags]
以下是具有 VF 特定 PCIe 地址的示例
doca_<app_name> -a b1:00.3 -a b1:00.4 -c 0xff -- -l 60
默认情况下,DPDK 应用程序初始化设备的所有内核。这通常是不必要的,甚至可能导致无法预见的问题。建议限制内核数量,尤其是在使用基于 AMD 的系统时,使用 -c
标志将内核限制为 16 个。
以下是在主机上运行应用程序的拓扑示例。

在 BlueField 上配置 OVS,如下所示
Bridge vf_br:
Port vf_br
Interface vf_br
type: internal
Port pf0hpf
Interface pf0hpf
Port pf0vf1
Interface pf0vf1
Bridge ovsbr1
Port ovsbr1
Interface ovsbr1
type: internal
Port p0
Interface p0
Port pf0vf0
Interface pf0vf0
当在主机上启用新的 VF 时,VF 表示器将在 Arm 端创建。第一个 OVS 网桥将上行链路连接 (p0
) 连接到新的 VF 表示器 (pf0vf0
),第二个网桥将第二个 VF 表示器 (pf0vf1
) 连接到主机表示器 (pf0phf
)。在主机上,运行应用程序时必须初始化新创建的功能的 2 个 PCIe 地址。
当接收到流量时(例如,来自上行链路),会发生以下情况
通过
p0
接收流量。流量转发到
pf0vf0
。应用程序“监听”
pf0vf0
和pf0vf1
,因此可以从pf0vf0
获取流量,检查它,并转发到pf0vf1
。流量从
pf0vf1
转发到pf0hpf
。
仅支持基于 NVIDIA® ConnectX®-6 Dx 的适配器卡及更高版本。
以下步骤仅在适配器卡上运行 DOCA 应用程序时才需要。
设置所有 VF 的信任级别。运行
host $ mlxreg -d /dev/mst/mt4125_pciconf0 --reg_name VHCA_TRUST_LEVEL --yes --set
"all_vhca=0x1,trust_level=0x1"
--indexes"vhca_id=0x0,all_vhca=0x0"
创建 X 个 VF(X 是所需的 VF 数量),并运行以下命令以打开已创建 VF 的受信任模式
echo ON | tee /sys/class/net/enp1s0f0np0/device/sriov/X/trust
例如,如果要创建 2 个 VF,则应使用以下命令
echo ON | tee /sys/class/net/enp1s0f0np0/device/sriov/0/trust echo ON | tee /sys/class/net/enp1s0f0np0/device/sriov/1/trust
使用以下命令创建 VF 表示器,将 PCIe 地址替换为已创建 VF 的 PCIe 地址
echo 0000:17:00.2 > /sys/bus/pci/drivers/mlx5_core/unbind echo 0000:17:00.2 > /sys/bus/pci/drivers/mlx5_core/bind