3.3. コンピュートノードでのヒュージページの設定
クラウド管理者は、インスタンスがヒュージページを要求できるようにコンピュートノードを設定することができます。
手順
- Compute 環境ファイルを開きます。
インスタンスではないプロセス用に各 NUMA ノードで確保するヒュージページのメモリー量を設定します。
parameter_defaults: ComputeParameters: NovaReservedHugePages: ["node:0,size:1GB,count:1","node:1,size:1GB,count:1"]
各ノードの
size
の値を、割り当てられたヒュージページのサイズに置き換えます。以下の有効な値のいずれかに設定します。- 2048 (2 MB 用)
- 1 GB
-
各ノードの
count
の値を、NUMA ノードごとに OVS が使用するヒュージページの数に置き換えます。たとえば、Open vSwitch が 4096 のソケットメモリーを使用する場合、この属性を 2 に設定します。
コンピュートノードで Huge Page を設定します。
parameter_defaults: ComputeParameters: ... KernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=32"
注記複数の Huge Page サイズを設定する場合、初回の起動時に Huge Page フォルダーもマウントする必要があります。詳細は、Mounting multiple huge page folders during first boot を参照してください。
(オプション) インスタンスが 1 GB のヒュージページを割り当てるのを許可するには、CPU 機能フラグ
NovaLibvirtCPUModelExtraFlags
を設定してpdpe1gb
を指定します。parameter_defaults: ComputeParameters: NovaLibvirtCPUMode: 'custom' NovaLibvirtCPUModels: 'Haswell-noTSX' NovaLibvirtCPUModelExtraFlags: 'vmx, pdpe1gb'
注記- インスタンスが 2 MB のヒュージページしか要求しない場合、CPU 機能フラグを設定する必要はありません。
- ホストが 1 GB ヒュージページの割り当てをサポートする場合に限り、インスタンスに 1 GB のヒュージページを割り当てることができます。
-
NovaLibvirtCPUMode
がhost-model
またはcustom
に設定されている場合にのみ、NovaLibvirtCPUModelExtraFlags
をpdpe1gb
に設定する必要があります。 -
ホストが
pdpe1gb
をサポートし、NovaLibvirtCPUMode
にhost-passthrough
が使用される場合、NovaLibvirtCPUModelExtraFlags
にpdpe1gb
を設定する必要はありません。pdpe1gb
フラグは Opteron_G4 および Opteron_G5 CPU モデルにのみ含まれ、QEMU がサポートする Intel CPU モデルには含まれません。 - Microarchitectural Data Sampling (MDS) 等の CPU ハードウェアの問題を軽減するには、他の CPU フラグを設定しなければならない場合があります。詳しくは、RHOS Mitigation for MDS ("Microarchitectural Data Sampling") Security Flaws を参照してください。
Meltdown に対する保護の適用後にパフォーマンスが失われないようにするには、CPU 機能フラグ
NovaLibvirtCPUModelExtraFlags
を設定して+pcid
を指定します。parameter_defaults: ComputeParameters: NovaLibvirtCPUMode: 'custom' NovaLibvirtCPUModels: 'Haswell-noTSX' NovaLibvirtCPUModelExtraFlags: 'vmx, pdpe1gb, +pcid'
ヒント-
NovaSchedulerDefaultFilters
パラメーターにまだNUMATopologyFilter
がなければ、このフィルターを追加します。 その他の環境ファイルと共に Compute 環境ファイルをスタックに追加して、オーバークラウドをデプロイします。
(undercloud)$ openstack overcloud deploy --templates \ -e [your environment files] \ -e /home/stack/templates/<compute_environment_file>.yaml
3.3.1. インスタンス用のヒュージページフレーバーの作成
クラウドユーザーがヒュージページを使用するインスタンスを作成できるようにするには、インスタンス起動用の hw:mem_page_size
追加スペックキーが設定されたフレーバーを作成します。
前提条件
- コンピュートノードがヒュージページに対応する設定である。詳しくは、Configuring huge pages on Compute nodes を参照してください。
手順
ヒュージページを要求するインスタンス用のフレーバーを作成します。
$ 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=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)。
-
フレーバーによりヒュージページを使用するインスタンスが作成されることを確認するには、新しいフレーバーを使用してインスタンスを起動します。
$ openstack server create --flavor huge_pages \ --image <image> huge_pages_instance
Compute スケジューラーは、インスタンスのメモリーをサポートするのに十分なサイズの空きヒュージページを持つホストを特定します。スケジューラーが十分なページを持つホストおよび NUMA ノードを検出できない場合、リクエストは失敗して
NoValidHost
エラーが報告されます。
3.3.2. 初回起動時に複数の Huge Page フォルダーをマウント
Compute サービス (nova) を設定して、初回起動プロセスの一環として複数のページサイズを処理することができます。初回起動プロセスでは、初めてノードを起動する際に heat テンプレート設定をすべてのノードに追加します。これ以降は (たとえば、オーバークラウドスタックの更新時)、これらのテンプレートを追加してもこれらのスクリプトは実行されません。
手順
Huge Page フォルダーのマウントを作成するためにスクリプトを実行する初回起動テンプレートファイル
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'
に一致するホスト名を指定することで、ホストをフィルタリングして、huge page フォルダーのマウントを作成します。必要に応じて、特定のコンピュートの filter grep パターンを更新できます。 -
デフォルトの
dev-hugepages.mount systemd
ユニットファイルをマスクし、ページサイズを使用して新規マウントを作成できるようにします。 - フォルダーが最初に作成されていることを確認します。
-
pagesize
ごとにsystemd
マウントユニットを作成します。 -
最初のループ後に
systemd daemon-reload
を実行し、新たに作成されたユニットファイルを追加します。 - 2M および 1G のページサイズのマウントを有効にします。このループを更新して、必要に応じて追加のページサイズを含めることができます。
-
オプション:
/dev
フォルダーは、自動的にnova_compute
およびnova_libvirt
のコンテナーにバインドマウントされます。Huge Page マウントに異なる宛先を使用した場合は、そのマウントをnova_compute
およびnova_libvirt
コンテナーに渡す必要があります。parameter_defaults NovaComputeOptVolumes: - /opt/dev:/opt/dev NovaLibvirtOptVolumes: - /opt/dev:/opt/dev
~/templates/firstboot.yaml
環境ファイルのOS::TripleO::NodeUserData
リソースタイプとして heat テンプレートを登録します。resource_registry: OS::TripleO::NodeUserData: ./hugepages.yaml
重要NodeUserData
リソースを登録することができるのは、1 つのリソースにつき 1 つの heat テンプレートだけです。別の heat テンプレートに登録すると、使用する heat テンプレートがそのテンプレートに変わります。初回起動環境ファイルを他の環境ファイルと一緒にスタックに追加し、オーバークラウドをデプロイします。
(undercloud)$ openstack overcloud deploy --templates \ -e [your environment files] \ -e /home/stack/templates/firstboot.yaml \ ...