第 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 节点上具有共享(floating) CPU 和具有共享(floating) CPU 的实例。要在具有 NUMA 拓扑的 Compute 节点上配置 CPU 固定,您必须完成以下内容:
- 为 CPU 固定指定 Compute 节点。
- 配置 Compute 节点,为固定实例 vCPU 进程、浮动实例 vCPU 进程和主机进程保留主机内核。
- 部署数据平面。
- 为需要 CPU 固定的实例创建类别。
- 为启动使用共享或浮动 CPU 的实例创建类别。
即使没有请求 NUMA 拓扑,配置 CPU 固定也会在实例上创建一个隐式 NUMA 拓扑。不要在同一主机上运行 NUMA 和非 NUMA 虚拟机(VM)。
4.1.1. 先决条件 复制链接链接已复制到粘贴板!
- 您知道 Compute 节点的 NUMA 拓扑。
-
oc命令行工具已安装在您的工作站上。 -
以具有
cluster-admin权限的用户身份登录 Red Hat OpenStack Services on OpenShift (RHOSO)。
4.1.2. 为 CPU 固定设计和配置 Compute 节点 复制链接链接已复制到粘贴板!
要为带有固定 CPU 的实例指定 Compute 节点,您必须创建和配置一个新的 OpenStackDataPlaneNodeSet 自定义资源(CR)来配置为 CPU 固定指定的节点。根据节点的 NUMA 拓扑,在 Compute 节点上配置 CPU 固定。在所有 NUMA 节点中为主机进程保留一些 CPU 内核,以提高效率。分配剩余的 CPU 内核来管理您的实例。此流程使用以下 NUMA 拓扑,其中 8 个 CPU 内核分布到两个 NUMA 节点中,以说明如何配置 CPU 固定:
| NUMA 节点 0 | NUMA 节点 1 | ||
| Core 0 | Core 1 | Core 4 | Core 5 |
| Core 2 | Core 3 | Core 6 | Core 7 |
此流程为主机进程保留了内核 0 和 4,为需要 CPU 固定的实例保留了内核 1,3,5 和7,为于不需要 CPU 固定的浮动实例保留了内核 2 和6。
以下流程适用于尚未置备的新 OpenStackDataPlaneNodeSet CR。要重新配置已置备的现有 OpenStackDataPlaneNodeSet,您必须首先从 OpenStackDataPlaneNodeSet 中所有节点排空客户机节点。
即使没有请求 NUMA 拓扑,配置 CPU 固定也会在实例上创建一个隐式 NUMA 拓扑。不要在同一主机上运行 NUMA 和非 NUMA 虚拟机(VM)。
您只能配置整个节点集。不支持在节点集合中重新配置节点的子集。如果您需要在节点集合中重新配置节点子集,您必须缩减节点设置,并从之前删除的节点创建新节点集。
先决条件
-
您已选择
OpenStackDataPlaneNodeSetCR,用于定义您要指定并配置 CPU 固定的节点。有关创建OpenStackDataPlaneNodeSetCR 的更多信息,请参阅在 OpenShift 上部署 Red Hat OpenStack Services 中的 创建 数据平面。
流程
创建或更新名为
nova-extra-config.yaml的ConfigMapCR,并在 [compute] 和 [default] 下设置参数的值:apiVersion: v1 kind: ConfigMap metadata: name: nova-extra-config namespace: openstack data: 25-nova-cpu-pinning.conf: |1 [compute] cpu_shared_set = 2,62 cpu_dedicated_set = 1,3,5,73 [DEFAULT] reserved_huge_pages = node:0,size:4,count:1310724 reserved_huge_pages = node:1,size:4,count:131072有关创建
ConfigMap对象的更多信息,请参阅 在节点中创建和使用 配置映射 。创建新的
OpenStackDataPlaneDeploymentCR,以在 data plane 节点上配置服务并部署数据平面,并将它保存到工作站上名为compute_cpu_pinning_deploy.yaml的文件中:apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneDeployment metadata: name: openstack-edpm-cpu-pinning有关创建
OpenStackDataPlaneDeploymentCR 的更多信息,请参阅在 OpenShift 上部署 Red Hat OpenStack Services 指南中的部署数据平面。在
compute_cpu_pinning_deploy.yaml中,指定nodeSets以包含您要部署的所有OpenStackDataPlaneNodeSetCR。确保包含您选择的OpenStackDataPlaneNodeSetCR。该OpenStackDataPlaneNodeSetCR 定义您要为 CPU 固定指定的节点。警告如果您的部署有多个节点集,对
nova-extra-config.yamlConfigMap的更改可能会直接影响多个节点集,具体取决于节点集和DataPlaneServices的配置方式。要检查节点集是否使用nova-extra-configConfigMap,因此会受到重新配置的影响,请完成以下步骤:-
检查节点集的服务列表,并查找指向 nova 的
DataPlaneService的名称。 确保
DataPlaneService的edpmServiceType字段的值设置为nova。如果
DataPlaneService的 dataSources 列表包含名为nova-extra-config的 configMapRef,则此节点会使用此ConfigMap,因此会受到此ConfigMap中的配置更改的影响。如果某些受影响的节点集合不应重新配置,您必须创建一个指向这些节点集的单独ConfigMap的新 DataPlaneService。
apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneDeployment metadata: name: openstack-edpm-cpu-pinning spec: nodeSets: - openstack-edpm - compute-cpu-pinning - ... - <nodeSet_name>-
将
<nodeSet_name> 替换为您要包含在 data plane 部署中的OpenStackDataPlaneNodeSetCR 的名称。
-
检查节点集的服务列表,并查找指向 nova 的
-
保存
compute_cpu_pinning_deploy.yaml部署文件。 部署数据平面:
$ oc create -f compute_cpu_pinning_deploy.yaml验证 data plane 是否已部署:
$ oc get openstackdataplanenodeset NAME STATUS MESSAGE compute-cpu-pinning True Deployed访问
openstackclient的远程 shell,并验证部署的 Compute 节点是否在 control plane 上可见:$ oc rsh -n openstack openstackclient $ openstack hypervisor list
4.1.3. 为实例创建专用 CPU 类别 复制链接链接已复制到粘贴板!
要让您的云用户创建具有专用 CPU 的实例,您可以创建一个专用 CPU 策略来启动实例。
先决条件
-
如果要使用
所需的cpu_thread_policy,则需要在主机上配置并发多线程(SMT)。您可以将 SMT 和非SMT Compute 主机混合。具有requirecpu_thread_policy的类别将放在 SMT 主机上,带隔离的类别将置于非SMT 上。 - Compute 节点配置为允许 CPU 固定。如需更多信息,请参阅在 Compute 节点上配置 CPU 固定。
流程
为需要 CPU 固定的实例创建类别:
$ openstack flavor create --ram <size_mb> \ --disk <size_gb> --vcpus <num_guest_vcpus> pinned_cpus如果您不使用文件支持的内存,请将类别的
hw:mem_page_size属性设置为启用 NUMA 感知内存分配:$ openstack --os-compute-api=2.86 flavor set \ --property hw:mem_page_size=<page_size> pinned_cpus将
<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或任何,您必须为不是实例的进程配置每个 NUMA 节点上保留的内存量。要请求固定 CPU,请将类别的
hw:cpu_policy属性设置为dedicated:$ openstack --os-compute-api=2.86 flavor set \ --property hw:cpu_policy=dedicated pinned_cpus可选: 要将每个 vCPU 放置到线程同级上,将类别的
hw:cpu_thread_policy属性设置为 :$ openstack --os-compute-api=2.86 flavor set \ --property hw:cpu_thread_policy=require pinned_cpus注意-
如果主机没有 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
4.1.5. 为实例创建混合 CPU 类别 复制链接链接已复制到粘贴板!
要让您的云用户创建混合有专用和共享 CPU 的实例,您可以使用混合 CPU 策略来创建启动实例的类别。
流程
为需要混合专用和共享 CPU 的实例创建类别:
$ openstack flavor create --ram <size_mb> \ --disk <size_gb> --vcpus <number_of_reserved_vcpus> \ --property hw:cpu_policy=mixed mixed_CPUs_flavor指定哪些 CPU 必须专用或共享:
$ openstack --os-compute-api=2.86 flavor set \ --property hw:cpu_dedicated_mask=<CPU_MASK> \ mixed_CPUs_flavor将
<CPU_MASK> 替换为需要专用或共享的 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 --os-compute-api=2.86 flavor set \ --property hw:mem_page_size=<page_size> mixed_CPUs_flavor将
<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或任何,您必须为不是实例的进程配置每个 NUMA 节点上保留的内存量。
-
4.1.6. 在具有并发多线程的 Compute 节点上配置 CPU 固定(SMT) 复制链接链接已复制到粘贴板!
如果 Compute 节点支持并发多线程(SMT),则组线程在专用或共享集中同时同级。线程同级一些通用硬件,这意味着在一个线程上运行的进程可能会影响其他线程的性能。
例如,主机在带有 SMT: 0、1、2 和 3 的双核 CPU 中识别四个逻辑 CPU 内核。在这四个线程中,有两对线程同级对:
- 线程同级 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
以下输出表明逻辑 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