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

作为云管理员,您可以通过创建自定义类别来针对于专用工作负载(包括 NFV 和高性能计算)配置实例的调度和放置,以实现最佳性能。

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

  • 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 节点。

您可以将计算调度程序配置为使用专用(固定)CPU 和有共享(floating) CPU 的实例调度到同一 Compute 节点上。要在具有 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 固定角色,并配置一个新的 overcloud 类别和 CPU 固定资源类,以用于标记 Compute 节点以进行 CPU 固定。

流程

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

    [stack@director ~]$ source ~/stackrc
  3. 生成一个名为 roles_data_cpu_pinning.yaml 的新角色数据文件,其中包含 Controller, Compute, 和 ComputeCPUPinning 角色:

    (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

    Role: 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 添加到节点定义模板、node.jsonnode.yaml,注册 overcloud 的 CPU 固定 Compute 节点。有关更多信息,请参阅 Director 安装和使用 指南中的 为 overcloud 注册节点
  6. 检查节点硬件:

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

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

  7. 为 CPU 固定 Compute 节点创建 compute-cpu-pinning overcloud 类别:

    (undercloud)$ openstack flavor create --id auto \
     --ram <ram_size_mb> --disk <disk_size_gb> \
     --vcpus <no_vcpus> compute-cpu-pinning
    • <ram_size_mb> 替换为裸机节点的 RAM,以 MB 为单位。
    • <disk_size_gb> 替换为裸机节点中的磁盘大小(以 GB 为单位)。
    • <no_vcpus> 替换为裸机节点中的 CPU 数量。

      注意

      这些属性不可用于调度实例。但是,计算调度程序使用磁盘大小来确定根分区大小。

  8. 检索节点列表来识别它们的 UUID:

    (undercloud)$ openstack baremetal node list
  9. 使用自定义 CPU 固定资源类标记您要为 CPU 固定指定的每个裸机节点:

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

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

  10. compute-cpu-pinning 类别与自定义 CPU 固定资源类关联:

    (undercloud)$ openstack flavor set \
     --property resources:CUSTOM_BAREMETAL_CPU_PINNING=1 \
     compute-cpu-pinning

    要确定与 Bare Metal 服务节点的资源类型对应的自定义资源类的名称,请将资源类转换为大写,将每个 punctuation 标记替换为下划线,并使用 CUSTOM_ 前缀。

    注意

    类别只能请求一个裸机资源类实例。

  11. 设置以下类别属性,以防止计算调度程序使用裸机类别属性来调度实例:

    (undercloud)$ openstack flavor set \
     --property resources:VCPU=0 \
     --property resources:MEMORY_MB=0 \
     --property resources:DISK_GB=0 compute-cpu-pinning
  12. 可选:如果 ComputeCPUPinning 角色的网络拓扑与 Compute 角色的网络拓扑不同,则创建自定义网络接口模板。有关更多信息,请参阅高级 Overcloud 自定义指南中的自定义网络接口模板

    如果 ComputeCPUPinning 角色的网络拓扑与 Compute 角色相同,您可以使用 compute.yaml 中定义的默认网络拓扑。

  13. network-environment.yaml 文件中注册 ComputeCPUPinning 角色的 Net::SoftwareConfig

    resource_registry:
      OS::TripleO::Compute::Net::SoftwareConfig: /home/stack/templates/nic-configs/compute.yaml
      OS::TripleO::ComputeCPUPinning::Net::SoftwareConfig: /home/stack/templates/nic-configs/<cpu_pinning_net_top>.yaml
      OS::TripleO::Controller::Net::SoftwareConfig: /home/stack/templates/nic-configs/controller.yaml

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

  14. node-info.yaml 文件中添加以下参数,以指定 CPU 固定 Compute 节点的数量,以及用于指定 Compute 节点的 CPU 固定类别:

    parameter_defaults:
      OvercloudComputeCPUPinningFlavor: compute-cpu-pinning
      ComputeCPUPinningCount: 3
  15. 要验证角色是否已创建,请输入以下命令:

    (undercloud)$ openstack baremetal node list --long -c "UUID" \
     -c "Instance UUID" -c "Resource Class" -c "Provisioning State" \
     -c "Power State" -c "Last Error" -c "Fault" -c "Name" -f json

    输出示例:

    [
      {
        "Fault": null,
        "Instance UUID": "e8e60d37-d7c7-4210-acf7-f04b245582ea",
        "Last Error": null,
        "Name": "compute-0",
        "Power State": "power on",
        "Provisioning State": "active",
        "Resource Class": "baremetal.CPU-PINNING",
        "UUID": "b5a9ac58-63a7-49ba-b4ad-33d84000ccb4"
      },
      {
        "Fault": null,
        "Instance UUID": "3ec34c0b-c4f5-4535-9bd3-8a1649d2e1bd",
        "Last Error": null,
        "Name": "compute-1",
        "Power State": "power on",
        "Provisioning State": "active",
        "Resource Class": "compute",
        "UUID": "432e7f86-8da2-44a6-9b14-dfacdf611366"
      },
      {
        "Fault": null,
        "Instance UUID": "4992c2da-adde-41b3-bef1-3a5b8e356fc0",
        "Last Error": null,
        "Name": "controller-0",
        "Power State": "power on",
        "Provisioning State": "active",
        "Resource Class": "controller",
        "UUID": "474c2fc8-b884-4377-b6d7-781082a3a9c0"
      }
    ]

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

核心 1

核心 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 环境文件中的 NovaSchedulerDefaultFilters 参数中(如果不存在):

    parameter_defaults:
      NovaSchedulerDefaultFilters: ['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 > 替换为以 MB 为单位保留的 RAM 数量。

  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/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 属性设置为 专用

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

    (overcloud)$ openstack flavor set \
     --property hw:cpu_thread_policy=require pinned_cpus
    注意
    • 如果主机没有 SMT 架构或足够 CPU 内核,且有可用线程同级的 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. 在具有并发多线程(SMT)的 Compute 节点上配置 CPU 固定

如果 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. 其他资源