第 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 固定,您必须完成以下内容:

  1. 为 CPU 固定指定 Compute 节点。
  2. 配置 Compute 节点,为固定实例 vCPU 进程、浮动实例 vCPU 进程和主机进程保留主机内核。
  3. 部署数据平面。
  4. 为需要 CPU 固定的实例创建类别。
  5. 为启动使用共享或浮动 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 固定:

Expand
表 4.1. NUMA 拓扑示例

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)。

警告

您只能配置整个节点集。不支持在节点集合中重新配置节点的子集。如果您需要在节点集合中重新配置节点子集,您必须缩减节点设置,并从之前删除的节点创建新节点集。

先决条件

  • 您已选择 OpenStackDataPlaneNodeSet CR,用于定义您要指定并配置 CPU 固定的节点。有关创建 OpenStackDataPlaneNodeSet CR 的更多信息,请参阅在 OpenShift 上部署 Red Hat OpenStack Services 中的 创建 数据平面

流程

  1. 创建或更新名为 nova-extra-config.yamlConfigMap CR,并在 [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,6 
    2
    
          cpu_dedicated_set = 1,3,5,7 
    3
    
          [DEFAULT]
          reserved_huge_pages = node:0,size:4,count:131072 
    4
    
          reserved_huge_pages = node:1,size:4,count:131072
    1
    新计算配置文件的名称。nova-operator 生成名为 01-nova.conf 的默认配置文件。不要使用默认名称,因为它会覆盖基础架构配置,如 transport_urlnova-compute 服务以字典顺序应用 /etc/nova/nova.conf.d/ 下的每个文件,因此后续文件中定义的配置将覆盖之前文件中定义的相同配置。
    2
    为共享实例保留物理 CPU 内核。
    3
    为专用实例保留物理 CPU 内核。
    4
    指定每个 NUMA 节点要保留的内存量。

    有关创建 ConfigMap 对象的更多信息,请参阅 在节点中创建和使用 配置映射

  2. 创建新的 OpenStackDataPlaneDeployment CR,以在 data plane 节点上配置服务并部署数据平面,并将它保存到工作站上名为 compute_cpu_pinning_deploy.yaml 的文件中:

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneDeployment
    metadata:
      name: openstack-edpm-cpu-pinning

    有关创建 OpenStackDataPlaneDeployment CR 的更多信息,请参阅在 OpenShift 上部署 Red Hat OpenStack Services 指南中的部署数据平面。

  3. compute_cpu_pinning_deploy.yaml 中,指定 nodeSets 以包含您要部署的所有 OpenStackDataPlaneNodeSet CR。确保包含您选择的 OpenStackDataPlaneNodeSet CR。该 OpenStackDataPlaneNodeSet CR 定义您要为 CPU 固定指定的节点。

    警告

    如果您的部署有多个节点集,对 nova-extra-config.yaml ConfigMap 的更改可能会直接影响多个节点集,具体取决于节点集和 DataPlaneServices 的配置方式。要检查节点集是否使用 nova-extra-config ConfigMap,因此会受到重新配置的影响,请完成以下步骤:

    1. 检查节点集的服务列表,并查找指向 nova 的 DataPlaneService 的名称。
    2. 确保 DataPlaneServiceedpmServiceType 字段的值设置为 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 部署中的 OpenStackDataPlaneNodeSet CR 的名称。
  4. 保存 compute_cpu_pinning_deploy.yaml 部署文件。
  5. 部署数据平面:

    $ oc create -f compute_cpu_pinning_deploy.yaml
  6. 验证 data plane 是否已部署:

    $ oc get openstackdataplanenodeset
    NAME           STATUS MESSAGE
    compute-cpu-pinning True   Deployed
  7. 访问 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 主机混合。具有 require cpu_thread_policy 的类别将放在 SMT 主机上,带 隔离的 类别将置于非SMT 上。
  • Compute 节点配置为允许 CPU 固定。如需更多信息,请参阅在 Compute 节点上配置 CPU 固定

流程

  1. 为需要 CPU 固定的实例创建类别:

    $ openstack flavor create --ram <size_mb> \
     --disk <size_gb> --vcpus <num_guest_vcpus> pinned_cpus
  2. 如果您不使用文件支持的内存,请将类别的 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 节点上保留的内存量。

  3. 要请求固定 CPU,请将类别的 hw:cpu_policy 属性设置为 dedicated

    $ openstack --os-compute-api=2.86 flavor set \
     --property hw:cpu_policy=dedicated pinned_cpus
  4. 可选: 要将每个 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 而不是 requireprefer 策略是默认策略,可确保在可用时使用线程同级程序。
    • 如果使用 hw:cpu_thread_policy=isolate,则必须禁用 SMT,或使用不支持 SMT 的平台。
  5. 要验证该类别创建了具有专用 CPU 的实例,请使用您的新类别来启动实例:

    $ openstack server create --flavor pinned_cpus \
     --image <image> pinned_cpu_instance

4.1.4. 为实例创建共享 CPU 类别

要让您的云用户创建使用共享或浮动 CPU 的实例,您可以使用共享 CPU 策略创建类别来启动实例。

先决条件

流程

  1. 为不需要 CPU 固定的实例创建类别:

    $ openstack flavor create --ram <size_mb> \
     --disk <size_gb> --vcpus <no_reserved_vcpus> floating_cpus
  2. 要请求浮动 CPU,请将类别的 hw:cpu_policy 属性设置为 shared

    $ openstack --os-compute-api=2.86 flavor set \
     --property hw:cpu_policy=shared floating_cpus

4.1.5. 为实例创建混合 CPU 类别

要让您的云用户创建混合有专用和共享 CPU 的实例,您可以使用混合 CPU 策略来创建启动实例的类别。

流程

  1. 为需要混合专用和共享 CPU 的实例创建类别:

    $ openstack flavor create --ram <size_mb> \
     --disk <size_gb> --vcpus <number_of_reserved_vcpus> \
     --property hw:cpu_policy=mixed mixed_CPUs_flavor
  2. 指定哪些 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 都专用。
  3. 如果您不使用文件支持的内存,请将类别的 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 节点上保留的内存量。

如果 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

4.1.7. 其他资源

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

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

让开源更具包容性

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

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部