搜索

8.4. OVS-DPDK 参数

download PDF

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

注意

有关如何使用 derived_parameters.yaml 工作流生成这些值的更多信息,请参阅 工作流和派生参数

注意

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

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

8.4.1. CPU 参数

OVS-DPDK 使用以下参数来进行 CPU 分区:

OvsPmdCoreList

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

  • 将 sibling 线程组合在一起。
  • 性能取决于为此 PMD 核心列表分配的物理内核数。在与 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 排除所有核心。
  • 包括所有剩余的内核。
  • 将 sibling 线程组合在一起。
NovaComputeCpuSharedSet
用于决定实例仿真程序线程的主机 CPU 数字的逗号分隔列表或物理主机 CPU 范围。
IsolCpusList

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

  • 匹配 OvsPmdCoreListNovaComputeCpuDedicatedSet 中的核心列表。
  • 将 sibling 线程组合在一起。
DerivePciWhitelistEnabled

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

对于列表中的每个 VF,使用解析到地址值的正则表达式填充 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

在这种情况下,eno2 用于 NIC 分区,使用 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]"}

8.4.2. 内存参数

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

OvsDpdkMemoryChannels

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

  • 使用 dmidecode -t 内存 或硬件手册决定可用的内存频道数。
  • 使用 ls /sys/devices/system/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 approximates 值 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,并分别配置了 MTUs 9000 和 2000。获取所需内存的计算示例如下:

  1. 将 MTU 值从最接近的 1024 字节。

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

    Memory required for 9000 MTU = (9216 + 800) * (4096*64) = 2625634304
    Memory required for 2000 MTU = (2048 + 800) * (4096*64) = 746586112
  3. 计算需要的总内存(以字节为单位)。

    2625634304 + 746586112 + 536870912 = 3909091328 bytes.

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

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

    3909091328 / (1024*1024) = 3728 MB.
  5. 将此值舍入到最接近的 1024。

    3724 MB rounds up to 4096 MB.
  6. 使用这个值设置 OvsDpdkSocketMemory

        OvsDpdkSocketMemory: "4096,1024"

Calculation - MTU 2000

DPDK NIC dpdk0 和 dpdk1 位于相同的 NUMA 节点 0 中,各自配置了 2000 的 MTU。获取所需内存的计算示例如下:

  1. 将 MTU 值从最接近的 1024 字节。

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

    Memory required for 2000 MTU = (2048 + 800) * (4096*64) = 746586112
  3. 计算需要的总内存(以字节为单位)。

    746586112 + 536870912 = 1283457024 bytes.

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

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

    1283457024 / (1024*1024) = 1224 MB.
  5. 将此值舍入到最接近 1024 的倍数。

    1224 MB rounds up to 2048 MB.
  6. 使用这个值设置 OvsDpdkSocketMemory

        OvsDpdkSocketMemory: "2048,1024"

8.4.3. 网络参数

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

8.4.4. 其他参数

NovaSchedulerEnabledFilters
提供有序的过滤器列表,该过滤器用于为请求的客户机实例查找匹配的 Compute 节点。
VhostuserSocketGroup

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

重要

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

KernelArgs

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

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

    lshw -class processor | grep pdpe1gb
  • 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"

8.4.5. VM 实例类别规格

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

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

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

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

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.