8.4. OVS-DPDK 参数
本节介绍 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 内核。
IsolCpusList
是tuned-profiles-cpu-partitioning
组件的cpu-partitioning-variable.conf
文件中的isolated_cores
值。对IsolCpusList
使用以下建议:-
匹配
OvsPmdCoreList
和NovaComputeCpuDedicatedSet
中的核心列表。 - 将 sibling 线程组合在一起。
-
匹配
- DerivePciWhitelistEnabled
要为虚拟机保留虚拟功能(VF),请使用
NovaPCIPassthrough
参数创建通过 Nova 传递给 Nova 的 VF 列表。排除了从列表中排除的主机可用的 VF。对于列表中的每个 VF,使用解析到地址值的正则表达式填充 address 参数。
以下是手动列表创建过程的示例。如果在名为
eno2
的设备中启用 NIC 分区,使用以下命令列出 VF 的 PCI 地址:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在这种情况下,
eno2
用于 NIC 分区,使用 VF 0、4 和 6。手动配置NovaPCIPassthrough
使其包含 VF 1-3、5 和 7,从而无法排除 VF 0、4 和 6,如下例所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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 为单位)。
NovaReservedHostMemory
是nova.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。获取所需内存的计算示例如下:
将 MTU 值从最接近的 1024 字节。
The MTU value of 9000 becomes 9216 bytes. The MTU value of 2000 becomes 2048 bytes.
The MTU value of 9000 becomes 9216 bytes. The MTU value of 2000 becomes 2048 bytes.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据这些舍入字节值计算每个 MTU 值所需的内存。
Memory required for 9000 MTU = (9216 + 800) * (4096*64) = 2625634304 Memory required for 2000 MTU = (2048 + 800) * (4096*64) = 746586112
Memory required for 9000 MTU = (9216 + 800) * (4096*64) = 2625634304 Memory required for 2000 MTU = (2048 + 800) * (4096*64) = 746586112
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 计算需要的总内存(以字节为单位)。
2625634304 + 746586112 + 536870912 = 3909091328 bytes.
2625634304 + 746586112 + 536870912 = 3909091328 bytes.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此计算代表(MTU 为 9000 所需的内存)+( 2000 的 MTU 需要内存)+(512 MB 缓冲)。
将所需的总内存转换为 MB。
3909091328 / (1024*1024) = 3728 MB.
3909091328 / (1024*1024) = 3728 MB.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将此值舍入到最接近的 1024。
3724 MB rounds up to 4096 MB.
3724 MB rounds up to 4096 MB.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用这个值设置
OvsDpdkSocketMemory
。OvsDpdkSocketMemory: "4096,1024"
OvsDpdkSocketMemory: "4096,1024"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Calculation - MTU 2000
DPDK NIC dpdk0 和 dpdk1 位于相同的 NUMA 节点 0 中,各自配置了 2000 的 MTU。获取所需内存的计算示例如下:
将 MTU 值从最接近的 1024 字节。
The MTU value of 2000 becomes 2048 bytes.
The MTU value of 2000 becomes 2048 bytes.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据这些舍入字节值计算每个 MTU 值所需的内存。
Memory required for 2000 MTU = (2048 + 800) * (4096*64) = 746586112
Memory required for 2000 MTU = (2048 + 800) * (4096*64) = 746586112
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 计算需要的总内存(以字节为单位)。
746586112 + 536870912 = 1283457024 bytes.
746586112 + 536870912 = 1283457024 bytes.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此计算代表(MTU 为 2000 所需的内存)+(512 MB 缓冲)。
将所需的总内存转换为 MB。
1283457024 / (1024*1024) = 1224 MB.
1283457024 / (1024*1024) = 1224 MB.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将此值舍入到最接近 1024 的倍数。
1224 MB rounds up to 2048 MB.
1224 MB rounds up to 2048 MB.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用这个值设置
OvsDpdkSocketMemory
。OvsDpdkSocketMemory: "2048,1024"
OvsDpdkSocketMemory: "2048,1024"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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-vswitchd
和qemu
进程可以访问共享巨页和 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
lshw -class processor | grep pdpe1gb
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
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"
parameter_defaults: ComputeOvsDpdkSriovParameters: DdpPackage: "ddp-comms"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.4.5. VM 实例类别规格 复制链接链接已复制到粘贴板!
在 NFV 环境中部署虚拟机实例之前,创建一个使用 CPU 固定、巨面和仿真器线程固定的类别。
- hw:cpu_policy
-
当此参数设置为
专用
时,客户机使用固定 CPU。从设定此参数的类别中创建的实例具有 1:1 的有效过量使用比例。默认值为shared
。 - hw:mem_page_size
将此参数设置为带有标准后缀(例如:
4KB
、8MB
或1GB
)的特定值的有效字符串。使用 1GB 匹配hugepagesz
引导参数。通过从引导参数减去OvsDpdkSocketMemory
来计算虚拟机的巨页数量。以下值也有效:- small (默认)- 使用最小页面大小
- 大 - 只使用大页大小。(x86 构架中的 2MB 或 1GB)
- any - 计算驱动程序可以使用大页面,但如果没有可用的,则默认为 small。
- hw:emulator_threads_policy
-
将此参数的值设置为
shared
,以便仿真程序线程锁定在 heat 参数NovaComputeCpuSharedSet
中发现的 CPU。如果仿真程序线程在带有轮询模式驱动程序(PMD)或实时处理的 vCPU 上运行,则可能会遇到负面影响,如数据包丢失。