第 4 章 在 Compute 节点上配置 CPU
作为云管理员,您可以通过创建自定义类别以目标专用工作负载(包括 NFV 和高性能计算(HPC))来配置实例的调度和放置,以获得最佳性能。
使用以下功能调整实例的最佳 CPU 性能:
- CPU 固定 :将虚拟 CPU 固定到物理 CPU。
- 仿真程序线程 :与物理 CPU 实例关联的仿真程序线程。
- CPU 功能标志 :配置应用于实例的标准 CPU 功能标记,以提高 Compute 节点的实时迁移兼容性。
4.1. 在 Compute 节点上配置 CPU 固定 复制链接链接已复制到粘贴板!
您可以通过在 Compute 节点上启用 CPU 固定,将每个实例 CPU 进程配置为在专用主机 CPU 上运行。当实例使用 CPU 固定时,每个实例 vCPU 进程都会被分配自己的主机 pCPU,没有其他实例 vCPU 进程可以使用。在启用了 CPU 固定的 Compute 节点上运行的实例具有 NUMA 拓扑。实例 NUMA 拓扑的每个 NUMA 节点都映射到主机 Compute 节点上的 NUMA 节点。
您可以配置计算调度程序,以在同一 Compute 节点上使用专用(固定)CPU 和实例来调度实例。要在具有 NUMA 拓扑的 Compute 节点上配置 CPU 固定,您必须完成以下操作:
- 为 CPU 固定指定 Compute 节点。
- 配置 Compute 节点,为固定实例 vCPU 进程、浮动实例 vCPU 进程和主机进程保留主机内核。
- 部署 overcloud。
- 创建类别用于启动需要 CPU 固定的实例。
- 创建类别用于启动使用共享或浮动 CPU 的实例。
配置 CPU 固定会在实例上创建一个隐式 NUMA 拓扑,即使未请求 NUMA 拓扑。不要在同一主机上运行 NUMA 和非 NUMA 虚拟机(VM)。如需更多信息,请参阅使用 NUMA 时限制。
4.1.1. 先决条件 复制链接链接已复制到粘贴板!
- 您知道 Compute 节点的 NUMA 拓扑。
-
您已在 Compute 节点上配置了
NovaReservedHugePages。如需更多信息,请参阅在 Compute 节点上配置巨页。
4.1.2. 为 CPU 固定设计 Compute 节点 复制链接链接已复制到粘贴板!
要为带有固定 CPU 的实例指定 Compute 节点,您必须创建一个新的角色文件来配置 CPU 固定角色,并使用 CPU 固定资源类配置裸机节点,以使用标记 CPU 固定的 Compute 节点。
以下流程适用于尚未调配的新 overcloud 节点。要将资源类分配给已调配的现有 overcloud 节点,您必须使用缩减流程取消置备节点,然后使用扩展步骤使用新资源类分配重新置备节点。有关更多信息,请参阅 扩展 overcloud 节点。
流程
-
以
stack用户的身份登录 undercloud。 Source
stackrc文件:source ~/stackrc
[stack@director ~]$ source ~/stackrcCopy to Clipboard Copied! Toggle word wrap Toggle overflow 生成一个名为
roles_data_cpu_pinning.yaml的新角色数据文件,其中包含Controller、Compute和ComputeCPUPinning角色,以及 overcloud 所需的任何其他角色:openstack overcloud roles \ generate -o /home/stack/templates/roles_data_cpu_pinning.yaml \ Compute:ComputeCPUPinning Compute Controller
(undercloud)$ openstack overcloud roles \ generate -o /home/stack/templates/roles_data_cpu_pinning.yaml \ Compute:ComputeCPUPinning Compute ControllerCopy to Clipboard Copied! Toggle word wrap Toggle overflow Open
roles_data_cpu_pinning.yaml并编辑或添加以下参数和部分:Expand section/Parameter 当前值 新值 role 注释
Role: ComputeRole: ComputeCPUPinning角色名称
Name: Compute名称 :ComputeCPUPinningdescription基本 Compute 节点角色CPU 固定 Compute 节点角色HostnameFormatDefault%stackname%-novacompute-%index%%stackname%-novacomputepinning-%index%deprecated_nic_config_namecompute.yamlcompute-cpu-pinning.yaml-
将 overcloud 的 CPU 固定 Compute 节点添加到节点定义模板
node.json或node.yaml中,以注册它们。有关更多信息,请参阅 安装和管理 Red Hat OpenStack Platform 指南中的 为 overcloud 注册节点。 检查节点硬件:
openstack overcloud node introspect \ --all-manageable --provide
(undercloud)$ openstack overcloud node introspect \ --all-manageable --provideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅 安装和管理 Red Hat OpenStack Platform 指南中的创建 裸机节点硬件清单。
使用自定义 CPU 固定资源类标记您要为 CPU 固定指定的每个裸机节点:
openstack baremetal node set \ --resource-class baremetal.CPU-PINNING <node>
(undercloud)$ openstack baremetal node set \ --resource-class baremetal.CPU-PINNING <node>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<node>替换为裸机节点的 ID。将
ComputeCPUPinning角色添加到节点定义文件overcloud-baremetal-deploy.yaml中,并定义您要分配给节点的任何预先节点放置、资源类、网络拓扑或其他属性:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关您可以在节点定义文件中配置节点属性的属性的更多信息,请参阅 裸机节点置备属性。有关节点定义文件的示例,请参阅 节点定义文件 示例。
运行 provisioning 命令为您的角色置备新节点:
openstack overcloud node provision \ --stack <stack> \ [--network-config \] --output /home/stack/templates/overcloud-baremetal-deployed.yaml \ /home/stack/templates/overcloud-baremetal-deploy.yaml
(undercloud)$ openstack overcloud node provision \ --stack <stack> \ [--network-config \] --output /home/stack/templates/overcloud-baremetal-deployed.yaml \ /home/stack/templates/overcloud-baremetal-deploy.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
将
<stack> 替换为置备裸机节点的堆栈名称。如果未指定,则默认为overcloud。 -
包含
--network-config可选参数,为cli-overcloud-node-network-config.yamlAnsible playbook 提供网络定义。如果您没有使用network_config属性定义网络定义,则使用默认网络定义。
-
将
在一个单独的终端中监控置备进度。当置备成功时,节点状态将从
available变为active:watch openstack baremetal node list
(undercloud)$ watch openstack baremetal node listCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您没有使用
--network-config选项运行 provisioning 命令,请在network-environment.yaml文件中配置 <Role>NetworkConfigTemplate参数以指向 NIC 模板文件:parameter_defaults: ComputeNetworkConfigTemplate: /home/stack/templates/nic-configs/compute.j2 ComputeCPUPinningNetworkConfigTemplate: /home/stack/templates/nic-configs/<cpu_pinning_net_top>.j2 ControllerNetworkConfigTemplate: /home/stack/templates/nic-configs/controller.j2
parameter_defaults: ComputeNetworkConfigTemplate: /home/stack/templates/nic-configs/compute.j2 ComputeCPUPinningNetworkConfigTemplate: /home/stack/templates/nic-configs/<cpu_pinning_net_top>.j2 ControllerNetworkConfigTemplate: /home/stack/templates/nic-configs/controller.j2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 <
cpu_pinning_net_top> 替换为包含ComputeCPUPinning角色的网络拓扑的文件名称,如compute.yaml以使用默认网络拓扑。
4.1.3. 为 CPU 固定配置 Compute 节点 复制链接链接已复制到粘贴板!
根据节点的 NUMA 拓扑,在 Compute 节点上配置 CPU 固定。为主机进程为所有 NUMA 节点保留一些 CPU 内核,以获得效率。分配剩余的 CPU 内核来管理您的实例。
此流程使用以下 NUMA 拓扑,其中 8 个 CPU 内核分布到两个 NUMA 节点中,以说明如何配置 CPU 固定:
| NUMA 节点 0 | NUMA 节点 1 | ||
| Core 0 | 核心 1 | Core 2 | Core 3 |
| Core 4 | Core 5 | Core 6 | Core 7 |
此流程为主机进程保留了内核 0 和 4,为需要 CPU 固定的实例保留了内核 1,3,5 和7,为于不需要 CPU 固定的浮动实例保留了内核 2 和6。
流程
-
创建一个环境文件,以配置 Compute 节点,为固定实例、浮动实例和主机进程保留内核,如
cpu_pinning.yaml。 要在支持 NUMA 的 Compute 节点上调度带有 NUMA 拓扑的实例,请将
NUMATopologyFilter添加到计算环境文件中的NovaSchedulerEnabledFilters参数中(如果尚不存在):Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需有关
NUMATopologyFilter的更多信息,请参阅 计算调度程序过滤器。要为专用实例保留物理 CPU 内核,请将以下配置添加到
cpu_pinning.yaml中:parameter_defaults: ComputeCPUPinningParameters: NovaComputeCpuDedicatedSet: 1,3,5,7parameter_defaults: ComputeCPUPinningParameters: NovaComputeCpuDedicatedSet: 1,3,5,7Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要为共享实例保留物理 CPU 内核,请将以下配置添加到
cpu_pinning.yaml中:parameter_defaults: ComputeCPUPinningParameters: ... NovaComputeCpuSharedSet: 2,6parameter_defaults: ComputeCPUPinningParameters: ... NovaComputeCpuSharedSet: 2,6Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您不使用文件支持的内存,请为主机进程指定要保留的 RAM 量:
parameter_defaults: ComputeCPUPinningParameters: ... NovaReservedHugePages: <ram>parameter_defaults: ComputeCPUPinningParameters: ... NovaReservedHugePages: <ram>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<ram> 替换为要保留的 RAM 量(以 MB 为单位)。要确保主机进程不在为实例保留的 CPU 内核中运行,请将参数
IsolCpusList设置为您为实例保留的 CPU 内核:parameter_defaults: ComputeCPUPinningParameters: ... IsolCpusList: 1-3,5-7parameter_defaults: ComputeCPUPinningParameters: ... IsolCpusList: 1-3,5-7Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以逗号分开的 CPU 索引的列表或范围指定
IsolCpusList参数的值。确保
TunedProfileName设置为cpu-partitioning:parameter_defaults: ComputeCPUPinningParameters: ... TunedProfileName: "cpu-partitioning"parameter_defaults: ComputeCPUPinningParameters: ... TunedProfileName: "cpu-partitioning"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用其他环境文件将新文件添加到堆栈中,并部署 overcloud:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.1.4. 为实例创建专用 CPU 类别 复制链接链接已复制到粘贴板!
要让您的云用户创建具有专用 CPU 的实例,您可以创建一个具有可启动实例的专用 CPU 策略的类别。
先决条件
- 主机上启用了并发多线程(SMT)。
- Compute 节点配置为允许 CPU 固定。如需更多信息,请参阅在 Compute 节点上配置 CPU 固定。
流程
获取
overcloudrc文件:source ~/overcloudrc
(undercloud)$ source ~/overcloudrcCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为需要 CPU 固定的实例创建类别:
openstack flavor create --ram <size_mb> \ --disk <size_gb> --vcpus <no_reserved_vcpus> pinned_cpus
(overcloud)$ openstack flavor create --ram <size_mb> \ --disk <size_gb> --vcpus <no_reserved_vcpus> pinned_cpusCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要请求固定 CPU,请将类别的
hw:cpu_policy属性设置为专用:openstack flavor set \ --property hw:cpu_policy=dedicated pinned_cpus
(overcloud)$ openstack flavor set \ --property hw:cpu_policy=dedicated pinned_cpusCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您不使用文件支持的内存,请将类别的
hw:mem_page_size属性设置为启用 NUMA 感知内存分配:openstack flavor set \ --property hw:mem_page_size=<page_size> pinned_cpus
(overcloud)$ openstack flavor set \ --property hw:mem_page_size=<page_size> pinned_cpusCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<page_size> 替换为以下有效值之一:-
大:选择主机上支持的最大页面大小,其在 x86_64 系统上可能为 2 MB 或 1 GB。 -
Small:(默认)选择主机上支持的最小页面大小。在 x86_64 系统上,这是 4 kB (常规页面)。 -
any: 使用镜像中设置的hw_mem_page_size选择页大小。如果镜像没有指定页面大小,请选择由 libvirt 驱动程序决定的最大可用页面大小。 -
<pageSize> :如果工作负载具有特定要求,则设置显式页面大小。将整数值用于页大小(以 KB 为单位)或任何标准后缀。例如: 4KB、2MB、2048、1GB。
-
注意要将
hw:mem_page_size设置为small或any,您必须已配置了内存页面数量,以便为不是实例的进程在每个 NUMA 节点上保留。如需更多信息,请参阅在 Compute 节点上配置巨页。要将每个 vCPU 放在线程同级上,将类别的
hw:cpu_thread_policy属性设置为require:openstack flavor set \ --property hw:cpu_thread_policy=require pinned_cpus
(overcloud)$ openstack flavor set \ --property hw:cpu_thread_policy=require pinned_cpusCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意-
如果主机没有 SMT 架构或足够具有可用线程的 CPU 内核,则调度会失败。要防止这种情况,将
hw:cpu_thread_policy设置为prefer而不是require。prefer策略是默认策略,可确保在可用时使用线程同级。 -
如果使用
hw:cpu_thread_policy=isolate,则必须禁用 SMT,或使用不支持 SMT 的平台。
-
如果主机没有 SMT 架构或足够具有可用线程的 CPU 内核,则调度会失败。要防止这种情况,将
验证
要验证该类别创建了专用 CPU 的实例,请使用您的新类别来启动实例:
openstack server create --flavor pinned_cpus \ --image <image> pinned_cpu_instance
(overcloud)$ openstack server create --flavor pinned_cpus \ --image <image> pinned_cpu_instanceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.1.6. 为实例创建混合 CPU 类别 复制链接链接已复制到粘贴板!
要让您的云用户创建混合有专用和共享 CPU 的实例,您可以创建一个具有启动实例混合 CPU 策略的类别。
流程
获取
overcloudrc文件:source ~/overcloudrc
(undercloud)$ source ~/overcloudrcCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为需要混合专用和共享 CPU 的实例创建类别:
openstack flavor create --ram <size_mb> \ --disk <size_gb> --vcpus <number_of_reserved_vcpus> \ --property hw:cpu_policy=mixed mixed_CPUs_flavor
(overcloud)$ openstack flavor create --ram <size_mb> \ --disk <size_gb> --vcpus <number_of_reserved_vcpus> \ --property hw:cpu_policy=mixed mixed_CPUs_flavorCopy to Clipboard Copied! Toggle word wrap Toggle overflow 指定哪些 CPU 必须专用或共享:
openstack flavor set \ --property hw:cpu_dedicated_mask=<CPU_number> \ mixed_CPUs_flavor
(overcloud)$ openstack flavor set \ --property hw:cpu_dedicated_mask=<CPU_number> \ mixed_CPUs_flavorCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<CPU_number> 替换为必须专用或共享的 CPU:-
要指定专用 CPU,请指定 CPU 号或 CPU 范围。例如,将 属性设置为
2-3,以指定 CPU 2 和 3 专用,并且所有剩余的 CPU 都共享。 -
要指定共享 CPU,请在 CPU 号或 CPU 范围前加上一个 caret (^)。例如,将 属性设置为
^0-1,以指定 CPU 0 和 1 被共享,并且所有剩余的 CPU 都专用。
-
要指定专用 CPU,请指定 CPU 号或 CPU 范围。例如,将 属性设置为
如果您不使用文件支持的内存,请将类别的
hw:mem_page_size属性设置为启用 NUMA 感知内存分配:openstack flavor set \ --property hw:mem_page_size=<page_size> pinned_cpus
(overcloud)$ openstack flavor set \ --property hw:mem_page_size=<page_size> pinned_cpusCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<page_size> 替换为以下有效值之一:-
大:选择主机上支持的最大页面大小,其在 x86_64 系统上可能为 2 MB 或 1 GB。 -
Small:(默认)选择主机上支持的最小页面大小。在 x86_64 系统上,这是 4 kB (常规页面)。 -
any: 使用镜像中设置的hw_mem_page_size选择页大小。如果镜像没有指定页面大小,请选择由 libvirt 驱动程序决定的最大可用页面大小。 -
<pageSize> :如果工作负载具有特定要求,则设置显式页面大小。将整数值用于页大小(以 KB 为单位)或任何标准后缀。例如: 4KB、2MB、2048、1GB。
-
注意要将
hw:mem_page_size设置为small或any,您必须已配置了内存页面数量,以便为不是实例的进程在每个 NUMA 节点上保留。如需更多信息,请参阅在 Compute 节点上配置巨页。
4.1.7. 在具有并发多线程(SMT)的 Compute 节点上配置 CPU 固定 复制链接链接已复制到粘贴板!
如果 Compute 节点支持并发多线程(SMT),在专用或共享集中组线程同级在一起。线程同级了一些常见的硬件,这意味着可以在一个线程上运行的进程,从而影响其他线程同级的性能。
例如,主机标识了双核 CPU 中的四个逻辑 CPU 内核,带有 SMT:0、1、2 和 3。在这四个中,有两对线程同级:
- 线程同级 1:逻辑 CPU 内核 0 和 2
- 线程同级 2:逻辑 CPU 内核 1 和 3
在这种情况下,不要将逻辑 CPU 内核 0 和 1 分配为专用,2 和 3 作为共享。相反,将 0 和 2 分配为专用,并将 1 和 3 分配为共享。
文件 /sys/devices/system/cpu/cpuN/topology/thread_siblings_list,其中 N 是逻辑 CPU 号,包含线程对。您可以使用以下命令识别哪些逻辑 CPU 内核是线程同级的:
grep -H . /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | sort -n -t ':' -k 2 -u
# grep -H . /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | sort -n -t ':' -k 2 -u
以下输出表示逻辑 CPU 内核 0 和逻辑 CPU 内核 2 是同一内核中的线程:
/sys/devices/system/cpu/cpu0/topology/thread_siblings_list:0,2 /sys/devices/system/cpu/cpu2/topology/thread_siblings_list:1,3
/sys/devices/system/cpu/cpu0/topology/thread_siblings_list:0,2
/sys/devices/system/cpu/cpu2/topology/thread_siblings_list:1,3