第 3 章 配置 Compute 节点以提高性能


作为云管理员,您可以通过创建自定义类别以目标特殊工作负载(包括 NFV 和高性能计算(HPC))来配置实例调度和放置,以获得最佳性能。

使用以下功能调整您的实例以获得最佳性能:

  • CPU 固定 :将虚拟 CPU 固定到物理 CPU。
  • 仿真程序线程 :将与实例关联的仿真程序线程转换到物理 CPU。
  • 巨页 :为普通内存(4k 页)和巨页(2 MB 或 1 GB 页)调整实例内存分配策略。
注意

如果没有 NUMA 拓扑,则配置这些功能会在实例上创建一个隐式 NUMA 拓扑。

3.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. 部署 overcloud。
  4. 为需要 CPU 固定的实例创建类别。
  5. 为启动使用共享或浮动 CPU 的实例创建类别。

3.1.1. 先决条件

  • 您知道 Compute 节点的 NUMA 拓扑。

3.1.2. 为 CPU 固定设计 Compute 节点

要为带有固定 CPU 的实例指定 Compute 节点,您必须创建一个新角色文件来配置 CPU 固定角色,并使用 CPU 固定资源类配置裸机节点,以标记 Compute 节点以进行 CPU 固定。

注意

以下流程适用于尚未调配的新 overcloud 节点。要将资源类分配给已置备的现有 overcloud 节点,您必须使用 scale down 过程取消置备节点,然后使用扩展过程使用新的资源类分配来重新置备节点。有关更多信息,请参阅 扩展 overcloud 节点

流程

  1. stack 用户的身份登录 undercloud。
  2. Source stackrc 文件:

    [stack@director ~]$ source ~/stackrc
  3. 生成一个名为 roles_data_cpu_pinning.yaml 的新角色数据文件,其中包含 ControllerComputeComputeCPUPinning 角色,以及 overcloud 所需的任何其他角色:

    (undercloud)$ openstack overcloud roles \
     generate -o /home/stack/templates/roles_data_cpu_pinning.yaml \
     Compute:ComputeCPUPinning Compute Controller
  4. 打开 roles_data_cpu_pinning.yaml,并编辑或添加以下参数和部分:

    section/Parameter当前值新值

    角色评论

    Role: Compute

    角色:ComputeCPUPinning

    角色名称

    名称 :Compute

    名称 :ComputeCPUPinning

    description

    基本 Compute 节点角色

    CPU 固定 Compute 节点角色

    HostnameFormatDefault

    %stackname%-novacompute-%index%

    %stackname%-novacomputepinning-%index%

    deprecated_nic_config_name

    compute.yaml

    compute-cpu-pinning.yaml

  5. 将 overcloud 的 CPU 固定 Compute 节点添加到节点定义模板 node.jsonnode.yaml 中,为 overcloud 注册 CPU 固定 Compute 节点。有关更多信息,请参阅 Director 安装和使用 指南中的 为 overcloud 注册节点
  6. 检查节点硬件:

    (undercloud)$ openstack overcloud node introspect \
     --all-manageable --provide

    如需更多信息,请参阅 Director 安装和使用指南中的 创建裸机节点硬件清单

  7. 使用自定义 CPU 固定资源类标记您要为 CPU 固定指定的每个裸机节点:

    (undercloud)$ openstack baremetal node set \
     --resource-class baremetal.CPU-PINNING <node>

    <node> 替换为裸机节点的 ID。

  8. ComputeCPUPinning 角色添加到节点定义文件 overcloud-baremetal-deploy.yaml 中,并定义您要分配给节点的任何预先节点放置、资源类、网络拓扑或其他属性:

    - name: Controller
      count: 3
    - name: Compute
      count: 3
    - name: ComputeCPUPinning
      count: 1
      defaults:
        resource_class: baremetal.CPU-PINNING
        network_config:
          template: /home/stack/templates/nic-config/myRoleTopology.j2 1
    1
    您可以重复使用现有的网络拓扑,或为角色创建新的自定义网络接口模板。如需更多信息,请参阅 Director 安装和使用 指南中的 自定义网络接口模板。如果您不使用 network_config 属性定义网络定义,则使用默认网络定义。

    有关您可以在节点定义文件中配置节点属性的属性的更多信息,请参阅 裸机节点置备属性。如需节点定义文件示例,请参阅 节点定义文件示例

  9. 运行置备命令为您的角色置备新节点:

    (undercloud)$ openstack overcloud node provision \
    --stack <stack> \
    [--network-config \]
    --output /home/stack/templates/overcloud-baremetal-deployed.yaml \
    /home/stack/templates/overcloud-baremetal-deploy.yaml
    • & lt;stack> 替换为置备裸机节点的堆栈的名称。如果未指定,则默认为 overcloud
    • 包含 --network-config 可选参数,为 cli-overcloud-node-network-config.yaml Ansible playbook 提供网络定义。如果您不使用 network_config 属性定义网络定义,则使用默认网络定义。
  10. 在单独的终端中监控调配进度。当置备成功后,节点状态会从 available 改为 active

    (undercloud)$ watch openstack baremetal node list
  11. 如果您没有使用 --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

    将 < cpu_pinning_net_top > 替换为包含 ComputeCPUPinning 角色的网络拓扑的文件名称,如 compute.yaml 以使用默认网络拓扑。

3.1.3. 为 CPU 固定配置 Compute 节点

根据节点的 NUMA 拓扑,在 Compute 节点上配置 CPU 固定。在所有 NUMA 节点中为主机进程保留一些 CPU 内核,以提高效率。分配剩余的 CPU 内核来管理您的实例。

此流程使用以下 NUMA 拓扑,其中 8 个 CPU 内核分布到两个 NUMA 节点中,以说明如何配置 CPU 固定:

表 3.1. NUMA 拓扑示例

NUMA 节点 0

NUMA 节点 1

Core 0

Core 1

Core 2

Core 3

Core 4

Core 5

Core 6

Core 7

此流程为主机进程保留了内核 0 和 4,为需要 CPU 固定的实例保留了内核 1,3,5 和7,为于不需要 CPU 固定的浮动实例保留了内核 2 和6。

流程

  1. 创建一个环境文件,将 Compute 节点配置为为固定实例、浮动实例和主机进程保留内核,如 cpu_pinning.yaml
  2. 要在支持 NUMA 的 Compute 节点上调度带有 NUMA 拓扑的实例,请将 NUMATopologyFilter 添加到 Compute 环境文件中的 NovaSchedulerEnabledFilters 参数中(如果尚不存在):

    parameter_defaults:
      NovaSchedulerEnabledFilters:
        - AvailabilityZoneFilter
        - ComputeFilter
        - ComputeCapabilitiesFilter
        - ImagePropertiesFilter
        - ServerGroupAntiAffinityFilter
        - ServerGroupAffinityFilter
        - PciPassthroughFilter
        - NUMATopologyFilter

    有关 NUMATopologyFilter 的更多信息,请参阅 计算调度程序过滤器

  3. 要为专用实例保留物理 CPU 内核,请将以下配置添加到 cpu_pinning.yaml 中:

    parameter_defaults:
      ComputeCPUPinningParameters:
        NovaComputeCpuDedicatedSet: 1,3,5,7
  4. 要为共享实例保留物理 CPU 内核,请将以下配置添加到 cpu_pinning.yaml 中:

    parameter_defaults:
      ComputeCPUPinningParameters:
        ...
        NovaComputeCpuSharedSet: 2,6
  5. 要指定要为主机进程保留的 RAM 数量,请在 cpu_pinning.yaml 中添加以下配置:

    parameter_defaults:
      ComputeCPUPinningParameters:
        ...
        NovaReservedHostMemory: <ram>

    <ram > 替换为要保留 RAM 量(以 MB 为单位)。

  6. 要确保主机进程不在为实例保留的 CPU 内核上运行,请将参数 IsolCpusList 设置为您为实例保留的 CPU 内核:

    parameter_defaults:
      ComputeCPUPinningParameters:
        ...
        IsolCpusList: 1-3,5-7

    使用列表或范围(用逗号分隔的 CPU 索引)指定 IsolCpusList 参数的值。

  7. 使用其他环境文件将新文件添加到堆栈中并部署 overcloud:

    (undercloud)$ openstack overcloud deploy --templates \
      -e [your environment files] \
      -r /home/stack/templates/roles_data_cpu_pinning.yaml \
      -e /home/stack/templates/network-environment.yaml \
      -e /home/stack/templates/cpu_pinning.yaml \
      -e /home/stack/templates/overcloud-baremetal-deployed.yaml \
      -e /home/stack/templates/node-info.yaml

3.1.4. 为实例创建专用 CPU 类别

要让您的云用户创建具有专用 CPU 的实例,您可以创建一个专用 CPU 策略来启动实例。

先决条件

流程

  1. 获取 overcloudrc 文件:

    (undercloud)$ source ~/overcloudrc
  2. 为需要 CPU 固定的实例创建类别:

    (overcloud)$ openstack flavor create --ram <size_mb> \
     --disk <size_gb> --vcpus <no_reserved_vcpus> pinned_cpus
  3. 要请求固定 CPU,请将类别的 hw:cpu_policy 属性设置为 dedicated

    (overcloud)$ openstack flavor set \
     --property hw:cpu_policy=dedicated pinned_cpus
  4. 要将每个 vCPU 放在线程同级上,将类别的 hw:cpu_thread_policy 属性设置为 require :

    (overcloud)$ openstack 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 的平台。

验证

  1. 要验证该类别创建了具有专用 CPU 的实例,请使用您的新类别来启动实例:

    (overcloud)$ openstack server create --flavor pinned_cpus \
     --image <image> pinned_cpu_instance
  2. 要验证新实例的放置是否正确,请输入以下命令并检查输出中的 OS-EXT-SRV-ATTR:hypervisor_hostname

    (overcloud)$ openstack server show pinned_cpu_instance

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

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

先决条件

流程

  1. 获取 overcloudrc 文件:

    (undercloud)$ source ~/overcloudrc
  2. 为不需要 CPU 固定的实例创建类别:

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

    (overcloud)$ openstack flavor set \
     --property hw:cpu_policy=shared floating_cpus

验证

  1. 要验证该类别是否创建了使用共享 CPU 的实例,请使用您的新类别来启动实例:

    (overcloud)$ openstack server create --flavor floating_cpus \
     --image <image> floating_cpu_instance
  2. 要验证新实例的放置是否正确,请输入以下命令并检查输出中的 OS-EXT-SRV-ATTR:hypervisor_hostname

    (overcloud)$ openstack server show floating_cpu_instance

3.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

3.1.7. 其他资源

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat, Inc.