9.2. OVS-DPDK 参数


本节介绍 OVS-DPDK 如何使用 director network_environment.yaml heat 模板中的参数来配置 CPU 和内存以获得最佳性能。使用此信息来评估 Compute 节点上的硬件支持以及如何对硬件进行分区,以优化您的 OVS-DPDK 部署。

注意

在分配 CPU 内核时,始终将物理内核中的 CPU 同级线程或逻辑 CPU 组合在一起。

有关如何确定 Compute 节点上的 CPU 和 NUMA 节点的详情,请参阅发现 NUMA 节点拓扑。使用此信息映射 CPU 和其他参数,以支持主机、客户机实例和 OVS-DPDK 进程需求。

9.2.1. CPU 参数

OVS-DPDK 将以下参数用于 CPU 分区:

OvsPmdCoreList

提供用于 DPDK 轮询模式驱动程序(PMD)的 CPU 内核。选择与 DPDK 接口本地 NUMA 节点关联的 CPU 内核。将 OvsPmdCoreList 用于 OVS 中的 pmd-cpu-mask 值。对 OvsPmdCoreList 使用以下建议:

  • 将同级线程配对在一起。
  • 性能取决于为此 PMD Core 列表分配的物理内核数。在与 DPDK NIC 关联的 NUMA 节点上,分配所需的内核。
  • 对于带有 DPDK NIC 的 NUMA 节点,根据性能要求确定所需的物理内核数,并包括每个物理内核的所有同级线程或逻辑 CPU。
  • 对于没有 DPDK NIC 的 NUMA 节点,分配任何物理内核的同级线程或逻辑 CPU,但 NUMA 节点的第一个物理内核除外。
注意

您必须在两个 NUMA 节点上保留 DPDK PMD 线程,即使 NUMA 节点没有关联的 DPDK NIC。

NovaComputeCpuDedicatedSet

可以调度用于固定实例 CPU 的进程的逗号分隔列表或物理主机 CPU 范围。例如,NovaComputeCpuDedicatedSet: [4-12,^8,15] 保留来自 4-12 和 15 的核心,不包括 8。

  • OvsPmdCoreList 中排除所有内核。
  • 包括所有剩余的内核。
  • 将同级线程配对在一起。
NovaComputeCpuSharedSet
用来确定实例仿真程序线程的主机 CPU 号的逗号分隔列表或物理主机 CPU 范围。
IsolCpusList

与主机进程隔离的一组 CPU 内核。IsolCpusListcpu-partitioning-variable.conf 文件中的 isolated_cores 值,用于 tuned-profiles-cpu-partitioning 组件。对 IsolCpusList 使用以下建议:

  • 匹配 OvsPmdCoreListNovaComputeCpuDedicatedSet 中的内核列表。
  • 将同级线程配对在一起。
DerivePciWhitelistEnabled

要为虚拟机保留虚拟功能(VF),请使用 NovaPCIPassthrough 参数创建传递给 Nova 的 VF 列表。列表中排除的 VF 仍可用于主机。

对于列表中的每个 VF,使用解析为 address 值的正则表达式填充 address 参数。

以下是手动列表创建过程的示例。如果在名为 eno2 的设备中启用 NIC 分区,使用以下命令列出 VF 的 PCI 地址:

[tripleo-admin@compute-0 ~]$ ls -lh /sys/class/net/eno2/device/ | grep virtfn
lrwxrwxrwx. 1 root root    0 Apr 16 09:58 virtfn0 -> ../0000:18:06.0
lrwxrwxrwx. 1 root root    0 Apr 16 09:58 virtfn1 -> ../0000:18:06.1
lrwxrwxrwx. 1 root root    0 Apr 16 09:58 virtfn2 -> ../0000:18:06.2
lrwxrwxrwx. 1 root root    0 Apr 16 09:58 virtfn3 -> ../0000:18:06.3
lrwxrwxrwx. 1 root root    0 Apr 16 09:58 virtfn4 -> ../0000:18:06.4
lrwxrwxrwx. 1 root root    0 Apr 16 09:58 virtfn5 -> ../0000:18:06.5
lrwxrwxrwx. 1 root root    0 Apr 16 09:58 virtfn6 -> ../0000:18:06.6
lrwxrwxrwx. 1 root root    0 Apr 16 09:58 virtfn7 -> ../0000:18:06.7
Copy to Clipboard Toggle word wrap

在这种情况下,NIC Partitioning 的 eno2 使用 VF 0、4 和 6。手动配置 NovaPCIPassthrough 使其包含 VF 1-3、5 和 7,因此排除 VF 0、4 和 6,如下例所示:

NovaPCIPassthrough:
  - physical_network: "sriovnet2"
  address: {"domain": ".*", "bus": "18", "slot": "06", "function": "[1-3]"}
  - physical_network: "sriovnet2"
  address: {"domain": ".*", "bus": "18", "slot": "06", "function": "[5]"}
  - physical_network: "sriovnet2"
  address: {"domain": ".*", "bus": "18", "slot": "06", "function": "[7]"}
Copy to Clipboard Toggle word wrap

9.2.2. 内存参数

OVS-DPDK 使用以下内存参数:

OvsDpdkMemoryChannels

映射每个 NUMA 节点的 CPU 中的内存频道。OvsDpdkMemoryChannels 是 OVS 中的 other_config:dpdk-extra="-n <value>" 值。观察 OvsDpdkMemoryChannels 的以下建议:

  • 使用 dmidecode -t memory 或您的硬件手册来确定可用的内存通道数。
  • 使用 ls /sys/devices/system/node/node* -d 来确定 NUMA 节点的数量。
  • 将可用内存通道的数量除以 NUMA 节点数。
NovaReservedHostMemory

为主机上的任务保留内存(以 MB 为单位)。NovaReservedHostMemorynova.conf 中 Compute 节点的 reserved_host_memory_mb 值。观察以下 NovaReservedHostMemory 的建议:

  • 使用静态推荐值 4096 MB。
OvsDpdkSocketMemory

指定每个 NUMA 节点从巨页池预先分配的内存量(以 MB 为单位)。OvsDpdkSocketMemory 是 OVS 中的 other_config:dpdk-socket-mem 值。观察 OvsDpdkSocketMemory 的以下建议:

  • 以逗号分隔列表形式提供。
  • 对于没有 DPDK NIC 的 NUMA 节点,请使用静态推荐 1024 MB (1GB)
  • 从 NUMA 节点上的每个 NIC 的 MTU 值计算 OvsDpdkSocketMemory 值。
  • 以下 equation 大约是 OvsDpdkSocketMemory 的值:

    • MEMORY_REQD_PER_MTU = (ROUNDUP_PER_MTU + 800) * (4096 * 64) Bytes

      • 800 是开销值。
      • 4096 * 64 是 mempool 中的数据包数量。
  • 为 NUMA 节点上设置的每个 MTU 值添加 MEMORY_REQD_PER_MTU,并添加另一个 512 MB 作为缓冲区。将值设为 1024 的倍数。

Calculation 示例 - MTU 2000 和 MTU 9000

DPDK NIC dpdk0 和 dpdk1 位于同一 NUMA 节点 0 上,并且分别配置了 MTU 9000 和 2000。派生内存的计算示例如下:

  1. 将 MTU 值舍入到最接近的 1024 字节。

    The MTU value of 9000 becomes 9216 bytes.
    The MTU value of 2000 becomes 2048 bytes.
    Copy to Clipboard Toggle word wrap
  2. 根据这些舍入字节值,计算每个 MTU 值所需的内存。

    Memory required for 9000 MTU = (9216 + 800) * (4096*64) = 2625634304
    Memory required for 2000 MTU = (2048 + 800) * (4096*64) = 746586112
    Copy to Clipboard Toggle word wrap
  3. 计算所需的组合内存总量,以字节为单位。

    2625634304 + 746586112 + 536870912 = 3909091328 bytes.
    Copy to Clipboard Toggle word wrap

    此计算代表(MTU 为 9000)+(MTU 为 2000 的内存所需的内存)+(512 MB 缓冲区)。

  4. 将所需的总内存转换为 MB。

    3909091328 / (1024*1024) = 3728 MB.
    Copy to Clipboard Toggle word wrap
  5. 将该值向上舍入到最接近的 1024。

    3724 MB rounds up to 4096 MB.
    Copy to Clipboard Toggle word wrap
  6. 使用这个值设置 OvsDpdkSocketMemory

        OvsDpdkSocketMemory: "4096,1024"
    Copy to Clipboard Toggle word wrap

Calculation 示例 - MTU 2000

DPDK NIC dpdk0 和 dpdk1 位于同一 NUMA 节点 0 上,各自配置有 2000 的 MTU。派生内存的计算示例如下:

  1. 将 MTU 值舍入到最接近的 1024 字节。

    The MTU value of 2000 becomes 2048 bytes.
    Copy to Clipboard Toggle word wrap
  2. 根据这些舍入字节值,计算每个 MTU 值所需的内存。

    Memory required for 2000 MTU = (2048 + 800) * (4096*64) = 746586112
    Copy to Clipboard Toggle word wrap
  3. 计算所需的组合内存总量,以字节为单位。

    746586112 + 536870912 = 1283457024 bytes.
    Copy to Clipboard Toggle word wrap

    此计算代表(MTU 为 2000 的内存需要)+(512 MB 缓冲区)。

  4. 将所需的总内存转换为 MB。

    1283457024 / (1024*1024) = 1224 MB.
    Copy to Clipboard Toggle word wrap
  5. 将该值向上舍入到最接近的 1024 的倍数。

    1224 MB rounds up to 2048 MB.
    Copy to Clipboard Toggle word wrap
  6. 使用这个值设置 OvsDpdkSocketMemory

        OvsDpdkSocketMemory: "2048,1024"
    Copy to Clipboard Toggle word wrap

9.2.3. 网络参数

OvsDpdkDriverType
设置 DPDK 使用的驱动程序类型。使用 vfio-pci 的默认值。
NeutronDatapathType
OVS 网桥的 datapath 类型。DPDK 使用 netdev 的默认值。
NeutronVhostuserSocketDir
为 OVS 设置 vhost-user 套接字目录。将 /var/lib/vhost_sockets 用于 vhost 客户端模式。

9.2.4. 其他参数

NovaSchedulerEnabledFilters
提供一系列过滤器,供 Compute 节点用来为请求的客户机实例查找匹配的 Compute 节点。
VhostuserSocketGroup

设置 vhost-user 套接字目录组。默认值为 qemu。将 VhostuserSocketGroup 设置为 hugetlbfs,以便 ovs-vswitchdqemu 进程可以访问共享的巨页和 unix 套接字,以配置 virtio-net 设备。这个值特定于角色,应应用到利用 OVS-DPDK 的任何角色。

重要

要使用参数 VhostuserSocketGroup,还必须设置 NeutronVhostuserSocketDir。如需更多信息,请参阅 第 9.2.3 节 “网络参数”

KernelArgs

在引导时为 Compute 节点提供多个内核参数 /etc/default/grub。根据您的配置添加以下值:

  • hugepagesz :设置 CPU 上巨页的大小。这个值可能因 CPU 硬件而异。为 OVS-DPDK 部署设置为 1G (default_hugepagesz=1GB hugepagesz=1G)。使用此命令检查 pdpe1gb CPU 标记,以确认您的 CPU 支持 1G。

    lshw -class processor | grep pdpe1gb
    Copy to Clipboard Toggle word wrap
  • hugepages count :根据可用主机内存设置可用巨页数量。使用大多数可用内存,但 NovaReservedHostMemory 除外。您还必须在 Compute 节点的类别中配置巨页数值。
  • IOMMU: 对于 Intel CPU,添加 "intel_iommu=on iommu=pt"
  • isolcpus :设置用于调优的 CPU 内核。这个值与 IsolCpusList 匹配。

有关 CPU 隔离的更多信息,请参阅红帽知识库解决方案 OpenStack CPU 隔离指南,以了解 RHEL 8 和 RHEL 9

DdpPackage

配置动态设备个性化(DDP),以在部署时将配置集软件包应用到设备,以更改设备的数据包处理管道。将以下行添加到 network_environment.yaml 模板,使其包含 DDP 软件包:

parameter_defaults:
  ComputeOvsDpdkSriovParameters:
    DdpPackage: "ddp-comms"
Copy to Clipboard Toggle word wrap
OvsDpdkExtra

可让您使用 other_config:dpdk-extra 参数传递额外的配置参数。它用于使用带有 NVIDIA Mellanox 卡的 NIC 分区以避免连接问题的环境。对于这些用例,设置 OvsDpdkExtra to -a 0000:00:00.0,这会导致 PCI 地址允许列表不允许地址。

示例

parameter_defaults:
  ComputeOvsDpdkSriovParameters:
     KernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=48 intel_iommu=on iommu=pt isolcpus=1-11,13-23"
     IsolCpusList: "1-11,13-23"
     OvsDpdkSocketMemory: "4096"
     OvsDpdkMemoryChannels: "4"
     OvsDpdkExtra: "-a 0000:00:00.0"
     NovaReservedHostMemory: 4096
     OvsPmdCoreList: "1,13,2,14,3,15"
     OvsDpdkCoreList: "0,12"
     NovaComputeCpuDedicatedSet: [4-11,16-23]
     NovaComputeCpuSharedSet: [0,12]
Copy to Clipboard Toggle word wrap

9.2.5. VM 实例类别规格

在 NFV 环境中部署虚拟机实例之前,创建一个使用 CPU 固定、巨面和仿真器线程固定的类别。

hw:cpu_policy
当此参数设置为 专用 时,客户机将使用固定 CPU。从带有此参数集的类别创建的实例具有有效过量使用比例 1:1。默认值为 shared
hw:mem_page_size

将此参数设置为带有标准后缀的特定值的有效字符串(例如 4KB8MB1GB)。使用 1GB 与 hugepagesz 引导参数匹配。通过从引导参数中减去 OvsDpdkSocketMemory,计算虚拟机可用的巨页数量。以下值也有效:

  • small (默认)- 使用最小页面大小
  • large - 只使用大页面大小。(2MB 或 1GB 在 x86 构架上)
  • any - 计算驱动程序可以尝试使用大型页面,但如果无可用,则默认为 small。
hw:emulator_threads_policy
将此参数的值设置为 共享,以便仿真程序线程锁定在 heat 参数 NovaComputeCpuSharedSet 中标识的 CPU。如果仿真程序线程在具有轮询模式驱动程序(PMD)或实时处理的 vCPU 上运行,您可能会遇到负面影响,如数据包丢失。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat