3.3. 在 Compute 节点上配置巨页

作为云管理员,您可以配置 Compute 节点,使实例能够请求巨页。

流程

  1. 打开您的计算环境文件。
  2. 配置巨页内存量,以在每个 NUMA 节点上为不是实例的进程保留:

    parameter_defaults:
      ComputeParameters:
        NovaReservedHugePages: ["node:0,size:1GB,count:1","node:1,size:1GB,count:1"]
    • 将每个节点的 大小 值替换为分配的巨页的大小。设置为以下有效值之一:

      • 2048 (用于 2MB)
      • 1GB
    • 将每个节点的 计数 值替换为每个 NUMA 节点 OVS 使用的巨页数。例如,对于 Open vSwitch 使用的插槽内存 4096,将其设置为 2。
  3. 在 Compute 节点上配置巨页:

    parameter_defaults:
      ComputeParameters:
        ...
        KernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=32"
    注意

    如果配置多个巨页大小,还必须在第一次引导过程中挂载巨页文件夹。如需更多信息,请参阅 第一次引导过程中挂载多个巨页文件夹

  4. 可选: 要允许实例分配 1GB 巨页,请配置 CPU 功能标记 NovaLibvirtCPUModelExtraFlags,使其包含 pdpe1gb

    parameter_defaults:
      ComputeParameters:
        NovaLibvirtCPUMode: 'custom'
        NovaLibvirtCPUModels: 'Haswell-noTSX'
        NovaLibvirtCPUModelExtraFlags: 'vmx, pdpe1gb'
    注意
    • CPU 功能标志不需要配置为仅允许实例请求 2 MB 巨页。
    • 只有主机支持 1G 巨页分配时,您只能为实例分配 1G 巨页。
    • 当将 NovaLibvirtCPUModelExtraFlags 设置为 host-modelcustom 时,您只需要将 NovaLibvirtCPUModelExtraFlags 设置为 pdpe1gb
    • 如果主机支持 pdpe1gb,并且 host-passthrough 用作 NovaLibvirtCPUMode,那么您不需要将 pdpe1gb 设置为 NovaLibvirtCPUModelExtraFlagspdpe1gb 标志仅包含在 Exit_G4 和 the_G5 CPU 模型中,它不包含在 QEMU 支持的任何 Intel CPU 模型中。
    • 要缓解 CPU 硬件问题,如 Microarchitectural Data Sampling (MDS),您可能需要配置其他 CPU 标志。如需更多信息,请参阅 MDS 的 RHOS Mitigation for MDS ("Microarchitectural Data Sampling") Security Flaws
  5. 为了避免应用 Meltdown 保护后性能丢失,请将 CPU 功能标记 NovaLibvirtCPUModelExtraFlags 配置为包含 +pcid

    parameter_defaults:
      ComputeParameters:
        NovaLibvirtCPUMode: 'custom'
        NovaLibvirtCPUModels: 'Haswell-noTSX'
        NovaLibvirtCPUModelExtraFlags: 'vmx, pdpe1gb, +pcid'
  6. NUMATopologyFilter 添加到 NovaSchedulerDefaultFilters 参数中(如果不存在)。
  7. 使用其他环境文件将计算环境文件添加到堆栈中,并部署 overcloud:

    (undercloud)$ openstack overcloud deploy --templates \
      -e [your environment files]  \
      -e /home/stack/templates/<compute_environment_file>.yaml

3.3.1. 为实例创建巨页类型

要让您的云用户创建使用巨页的实例,您可以创建一个带有 hw:mem_page_size 额外 spec 键的类别来启动实例。

先决条件

流程

  1. 为需要巨页的实例创建类别:

    $ openstack flavor create --ram <size_mb> --disk <size_gb> \
     --vcpus <no_reserved_vcpus> huge_pages
  2. 要请求巨页,请将类别的 hw:mem_page_size 属性设置为所需的大小:

    $ openstack flavor set huge_pages --property hw:mem_page_size=1GB

    hw:mem_page_size 设置为以下有效值之一:

    • large - 选择主机上支持的最大页面大小,在 x86_64 系统中可能为 2 MB 或 1 GB。
    • small - (默认)选择主机上支持的最小页面大小。在 x86_64 系统中,这是 4 kB (普通页)。
    • any - 选择最大可用的巨页大小,具体由 libvirt 驱动程序决定。
    • <pageSize>:如果工作负载具有特定要求,则设置显式页面大小。对页大小(以 KB 为单位)或任何标准后缀使用整数值。例如: 4KB、2MB、2048、1GB。
  3. 要验证类别是否创建带有巨页的实例,请使用您的新类别来启动实例:

    $ openstack server create --flavor huge_pages \
     --image <image> huge_pages_instance

    计算调度程序标识有足够可用巨页的主机,以便支持实例的内存。如果调度程序无法找到主机和具有足够页面的 NUMA 节点,则请求将失败,并显示 NoValidHost 错误。

3.3.2. 在第一次引导过程中挂载多个巨页文件夹

作为第一个引导过程的一部分,您可以配置计算服务(nova)来处理多个页面大小。第一次引导过程在您第一次引导节点时将 heat 模板配置添加到所有节点中。后续包含这些模板(如更新 overcloud 堆栈)不会运行这些脚本。

流程

  1. 创建一个第一个引导模板文件 hugepages.yaml,它将运行脚本来为巨页文件夹创建挂载。您可以使用 OS::TripleO::MultipartMime 资源类型来发送配置脚本:

    heat_template_version: <version>
    
    description: >
      Huge pages configuration
    
    resources:
      userdata:
        type: OS::Heat::MultipartMime
        properties:
          parts:
          - config: {get_resource: hugepages_config}
    
      hugepages_config:
        type: OS::Heat::SoftwareConfig
        properties:
          config: |
            #!/bin/bash
            hostname | grep -qiE 'co?mp' || exit 0
            systemctl mask dev-hugepages.mount || true
            for pagesize in 2M 1G;do
              if ! [ -d "/dev/hugepages${pagesize}" ]; then
                mkdir -p "/dev/hugepages${pagesize}"
                cat << EOF > /etc/systemd/system/dev-hugepages${pagesize}.mount
            [Unit]
            Description=${pagesize} Huge Pages File System
            Documentation=https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt
            Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
            DefaultDependencies=no
            Before=sysinit.target
            ConditionPathExists=/sys/kernel/mm/hugepages
            ConditionCapability=CAP_SYS_ADMIN
            ConditionVirtualization=!private-users
    
            [Mount]
            What=hugetlbfs
            Where=/dev/hugepages${pagesize}
            Type=hugetlbfs
            Options=pagesize=${pagesize}
    
            [Install]
            WantedBy = sysinit.target
            EOF
              fi
            done
            systemctl daemon-reload
            for pagesize in 2M 1G;do
              systemctl enable --now dev-hugepages${pagesize}.mount
            done
    
    outputs:
      OS::stack_id:
        value: {get_resource: userdata}

    模板中的配置脚本执行以下任务:

    1. 通过指定与 'co?mp' 匹配的主机名,过滤主机来为巨页文件夹创建挂载。您可以根据需要更新特定计算的过滤器 grep 模式。
    2. 屏蔽默认的 dev-hugepages.mount systemd 单元文件,以便使用页面大小创建新挂载。
    3. 确保首先创建文件夹。
    4. 为每个 pagesize 创建 systemd 挂载单元。
    5. 在第一个循环后运行 systemd 守护进程-reload,使其包含新创建的单元文件。
    6. 为 2M 和 1G pagesize 启用每个挂载。您可以根据需要更新此循环,使其包含其他 pagesize。
  2. 可选: /dev 文件夹会自动绑定到 nova_computenova_libvirt 容器。如果您已为巨页挂载使用不同的目的地,则需要将挂载传递给 nova_computenova_libvirt 容器:

    parameter_defaults
      NovaComputeOptVolumes:
        - /opt/dev:/opt/dev
      NovaLibvirtOptVolumes:
        - /opt/dev:/opt/dev
  3. 将您的 heat 模板注册为 ~/templates/firstboot.yaml 环境文件中的 OS::TripleO::NodeUserData 资源类型:

    resource_registry:
      OS::TripleO::NodeUserData: ./hugepages.yaml
    重要

    您只能将 NodeUserData 资源注册到每个资源的 heat 模板。后续用法会覆盖要使用的 heat 模板。

  4. 使用其他环境文件将第一个引导环境文件添加到堆栈中,并部署 overcloud:

    (undercloud)$ openstack overcloud deploy --templates \
      -e [your environment files] \
      -e /home/stack/templates/firstboot.yaml \
      ...