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 地址:[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 为单位)。
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.
根据这些舍入字节值计算每个 MTU 值所需的内存。
Memory required for 9000 MTU = (9216 + 800) * (4096*64) = 2625634304 Memory required for 2000 MTU = (2048 + 800) * (4096*64) = 746586112
计算需要的总内存(以字节为单位)。
2625634304 + 746586112 + 536870912 = 3909091328 bytes.
此计算代表(MTU 为 9000 所需的内存)+( 2000 的 MTU 需要内存)+(512 MB 缓冲)。
将所需的总内存转换为 MB。
3909091328 / (1024*1024) = 3728 MB.
将此值舍入到最接近的 1024。
3724 MB rounds up to 4096 MB.
使用这个值设置
OvsDpdkSocketMemory
。OvsDpdkSocketMemory: "4096,1024"
Calculation - MTU 2000
DPDK NIC dpdk0 和 dpdk1 位于相同的 NUMA 节点 0 中,各自配置了 2000 的 MTU。获取所需内存的计算示例如下:
将 MTU 值从最接近的 1024 字节。
The MTU value of 2000 becomes 2048 bytes.
根据这些舍入字节值计算每个 MTU 值所需的内存。
Memory required for 2000 MTU = (2048 + 800) * (4096*64) = 746586112
计算需要的总内存(以字节为单位)。
746586112 + 536870912 = 1283457024 bytes.
此计算代表(MTU 为 2000 所需的内存)+(512 MB 缓冲)。
将所需的总内存转换为 MB。
1283457024 / (1024*1024) = 1224 MB.
将此值舍入到最接近 1024 的倍数。
1224 MB rounds up to 2048 MB.
使用这个值设置
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-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
-
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
将此参数设置为带有标准后缀(例如:
4KB
、8MB
或1GB
)的特定值的有效字符串。使用 1GB 匹配hugepagesz
引导参数。通过从引导参数减去OvsDpdkSocketMemory
来计算虚拟机的巨页数量。以下值也有效:- small (默认)- 使用最小页面大小
- 大 - 只使用大页大小。(x86 构架中的 2MB 或 1GB)
- any - 计算驱动程序可以使用大页面,但如果没有可用的,则默认为 small。
- hw:emulator_threads_policy
-
将此参数的值设置为
shared
,以便仿真程序线程锁定在 heat 参数NovaComputeCpuSharedSet
中发现的 CPU。如果仿真程序线程在带有轮询模式驱动程序(PMD)或实时处理的 vCPU 上运行,则可能会遇到负面影响,如数据包丢失。