5.4. 在 Compute 节点上配置巨页
作为云管理员,您可以配置 Compute 节点,以启用实例来请求巨页。
配置巨页会在实例上创建一个隐式 NUMA 拓扑,即使未请求 NUMA 拓扑。
流程
- 打开 Compute 环境文件。
将巨页内存量配置为在每个 NUMA 节点上为不是实例的进程保留:
parameter_defaults: ComputeParameters: NovaReservedHugePages: ["node:0,size:1GB,count:1","node:1,size:1GB,count:1"]
将每个节点的
size
值替换为分配的巨页大小。设置为以下有效值之一:- 2048 (用于 2MB)
- 1GB
-
将每个节点的
count
值替换为每个 NUMA 节点使用 OVS 的巨页数量。例如,对于 Open vSwitch 使用的 4096 个套接字内存,将其设置为 2。
在 Compute 节点上配置巨页:
parameter_defaults: ComputeParameters: ... KernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=32"
注意如果配置多个巨页大小,还必须在第一次引导过程中挂载巨页文件夹。如需更多信息,请参阅 第一次引导过程中挂载多个巨页文件夹。
可选: 要允许实例分配 1GB 巨页,配置 CPU 功能标志
NovaLibvirtCPUModelExtraFlags
,使其包含pdpe1gb
:parameter_defaults: ComputeParameters: NovaLibvirtCPUMode: 'custom' NovaLibvirtCPUModels: 'Haswell-noTSX' NovaLibvirtCPUModelExtraFlags: 'vmx, pdpe1gb'
注意- CPU 功能标志不需要配置为允许实例仅请求 2 MB 巨页。
- 当主机支持 1G 巨页分配时,您只能将 1G 巨页分配给实例。
-
当将
NovaLibvirtCPUModelExtraFlags
设置为host-model
或custom
时,您只需要将NovaLibvirtCPUModelExtraFlags
设置为pdpe1gb
。 -
如果主机支持
pdpe1gb
,并且host-passthrough
用作NovaLibvirtCPUMode
,则不需要将pdpe1gb
设置为NovaLibvirtCPUModelExtraFlags
。pdpe1gb
标志仅包含在 Opteron_G4 和 Opteron_G5 CPU 模型中,它不包含在 QEMU 支持的任何 Intel CPU 模型中。 - 要缓解 CPU 硬件问题,如 Microarchitectural Data Sampling (MDS),您可能需要配置其他 CPU 标记。如需更多信息,请参阅 RHOS Mitigation for MDS ("Microarchitectural Data Sampling")安全 Flaws。
要避免在应用 Meltdown 保护后性能会降低的问题,请配置 CPU 功能标志
NovaLibvirtCPUModelExtraFlags
来包含+pcid
:parameter_defaults: ComputeParameters: NovaLibvirtCPUMode: 'custom' NovaLibvirtCPUModels: 'Haswell-noTSX' NovaLibvirtCPUModelExtraFlags: 'vmx, pdpe1gb, +pcid'
提示如需更多信息,请参阅使用 "PCID"CPU 功能标记为 OpenStack 客户机提供 Meltdown CVE 修复的性能影响。
-
将
NUMATopologyFilter
添加到NovaSchedulerEnabledFilters
参数(如果尚不存在)。 使用其他环境文件将计算环境文件添加到堆栈中,并部署 overcloud:
(undercloud)$ openstack overcloud deploy --templates \ -e [your environment files] \ -e /home/stack/templates/<compute_environment_file>.yaml
5.4.1. 为实例创建巨页类型
要让您的云用户创建使用巨页的实例,您可以创建一个带有 hw:mem_page_size
额外 spec 键的类别,以用于启动实例。
先决条件
- Compute 节点被配置为巨页。如需更多信息,请参阅在 Compute 节点上配置巨页。
流程
为需要巨页的实例创建类别:
$ openstack flavor create --ram <size_mb> --disk <size_gb> \ --vcpus <no_reserved_vcpus> huge_pages
要请求巨页,请将类别的
hw:mem_page_size
属性设置为所需的大小:$ openstack flavor set huge_pages --property hw:mem_page_size=<page_size>
将
<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。
-
要验证类别会创建一个带有巨页的实例,请使用您的新类别启动实例:
$ openstack server create --flavor huge_pages \ --image <image> huge_pages_instance
计算调度程序标识了具有足够可用巨页的主机,以支持实例的内存。如果调度程序无法找到具有足够页面的主机和 NUMA 节点,则请求将失败,并显示
NoValidHost
错误。
5.4.2. 第一次引导过程中挂载多个巨页文件夹
您可以配置 Compute 服务(nova),作为第一次引导过程的一部分处理多个页面大小。第一次引导过程会在首次启动节点时将 heat 模板配置添加到所有节点。后续包含这些模板(如更新 overcloud 堆栈)不会运行这些脚本。
流程
创建第一个引导模板文件
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}
此模板中的
config
脚本执行以下任务:-
通过指定与
'co?mp'
匹配的主机名,过滤主机,为 上的巨页文件夹创建挂载。您可以根据需要更新特定计算的过滤器 grep 模式。 -
屏蔽默认的
dev-hugepages.mount systemd
单元文件,以启用使用页面大小创建新挂载。 - 确保首先创建文件夹。
-
为每个
页大小
创建systemd
挂载单元。 -
在第一个循环后运行
systemd daemon-reload
,使其包含新创建的单元文件。 - 为 2M 和 1G pagesize 启用每个挂载。您可以根据需要更新此循环以包含额外的 pagesize。
-
通过指定与
可选:
/dev
文件夹会自动绑定到nova_compute
和nova_libvirt
容器。如果您已将不同的目的地用于巨页挂载,则需要将挂载传递给nova_compute
和nova_libvirt
容器:parameter_defaults NovaComputeOptVolumes: - /opt/dev:/opt/dev NovaLibvirtOptVolumes: - /opt/dev:/opt/dev
将 heat 模板注册为
~/templates/firstboot.yaml
环境文件中的OS::TripleO::NodeUserData
资源类型:resource_registry: OS::TripleO::NodeUserData: ./hugepages.yaml
重要您只能将
NodeUserData
资源注册到每个资源的一个 heat 模板。后续用法会覆盖要使用的 heat 模板。使用其他环境文件将第一个引导环境文件添加到堆栈中,并部署 overcloud:
(undercloud)$ openstack overcloud deploy --templates \ -e [your environment files] \ -e /home/stack/templates/firstboot.yaml \ ...