3.3. コンピュートノードでのヒュージページの設定

クラウド管理者は、インスタンスがヒュージページを要求できるようにコンピュートノードを設定することができます。

手順

  1. Compute 環境ファイルを開きます。
  2. インスタンスではないプロセス用に各 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 に設定します。
  3. コンピュートノードで 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 を参照してください。

  4. (オプション) インスタンスが 1 GB のヒュージページを割り当てるのを許可するには、CPU 機能フラグ NovaLibvirtCPUModelExtraFlags を設定して pdpe1gb を指定します。

    parameter_defaults:
      ComputeParameters:
        NovaLibvirtCPUMode: 'custom'
        NovaLibvirtCPUModels: 'Haswell-noTSX'
        NovaLibvirtCPUModelExtraFlags: 'vmx, pdpe1gb'
    注記
    • インスタンスが 2 MB のヒュージページしか要求しない場合、CPU 機能フラグを設定する必要はありません。
    • ホストが 1 GB ヒュージページの割り当てをサポートする場合に限り、インスタンスに 1 GB のヒュージページを割り当てることができます。
    • NovaLibvirtCPUModehost-model または custom に設定されている場合にのみ、NovaLibvirtCPUModelExtraFlagspdpe1gb に設定する必要があります。
    • ホストが pdpe1gb をサポートし、NovaLibvirtCPUModehost-passthrough が使用される場合、NovaLibvirtCPUModelExtraFlagspdpe1gb を設定する必要はありません。pdpe1gb フラグは Opteron_G4 および Opteron_G5 CPU モデルにのみ含まれ、QEMU がサポートする Intel CPU モデルには含まれません。
    • Microarchitectural Data Sampling (MDS) 等の CPU ハードウェアの問題を軽減するには、他の CPU フラグを設定しなければならない場合があります。詳しくは、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. NovaSchedulerDefaultFilters パラメーターにまだ NUMATopologyFilter がなければ、このフィルターを追加します。
  7. その他の環境ファイルと共に 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 追加スペックキーが設定されたフレーバーを作成します。

前提条件

手順

  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

    Compute スケジューラーは、インスタンスのメモリーをサポートするのに十分なサイズの空きヒュージページを持つホストを特定します。スケジューラーが十分なページを持つホストおよび NUMA ノードを検出できない場合、リクエストは失敗して NoValidHost エラーが報告されます。

3.3.2. 初回起動時に複数の Huge Page フォルダーをマウント

Compute サービス (nova) を設定して、初回起動プロセスの一環として複数のページサイズを処理することができます。初回起動プロセスでは、初めてノードを起動する際に heat テンプレート設定をすべてのノードに追加します。これ以降は (たとえば、オーバークラウドスタックの更新時)、これらのテンプレートを追加してもこれらのスクリプトは実行されません。

手順

  1. 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 スクリプトは、以下のタスクを実行します。

    1. 'co?mp' に一致するホスト名を指定することで、ホストをフィルタリングして、huge page フォルダーのマウントを作成します。必要に応じて、特定のコンピュートの filter grep パターンを更新できます。
    2. デフォルトの dev-hugepages.mount systemd ユニットファイルをマスクし、ページサイズを使用して新規マウントを作成できるようにします。
    3. フォルダーが最初に作成されていることを確認します。
    4. pagesize ごとに systemd マウントユニットを作成します。
    5. 最初のループ後に systemd daemon-reload を実行し、新たに作成されたユニットファイルを追加します。
    6. 2M および 1G のページサイズのマウントを有効にします。このループを更新して、必要に応じて追加のページサイズを含めることができます。
  2. オプション: /dev フォルダーは、自動的に nova_compute および nova_libvirt のコンテナーにバインドマウントされます。Huge Page マウントに異なる宛先を使用した場合は、そのマウントを nova_compute および nova_libvirt コンテナーに渡す必要があります。

    parameter_defaults
      NovaComputeOptVolumes:
        - /opt/dev:/opt/dev
      NovaLibvirtOptVolumes:
        - /opt/dev:/opt/dev
  3. ~/templates/firstboot.yaml 環境ファイルの OS::TripleO::NodeUserData リソースタイプとして heat テンプレートを登録します。

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

    NodeUserData リソースを登録することができるのは、1 つのリソースにつき 1 つの heat テンプレートだけです。別の heat テンプレートに登録すると、使用する heat テンプレートがそのテンプレートに変わります。

  4. 初回起動環境ファイルを他の環境ファイルと一緒にスタックに追加し、オーバークラウドをデプロイします。

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