検索

第4章 コンピュートノードで CPU を設定する

download PDF

クラウドユーザーは、インスタンスのスケジューリングおよび配置を設定して、最大のパフォーマンスを得ることができます。そのためには、NFV や高性能コンピューティング (HPC) などの特化されたワークロードを対象にするカスタムフレーバーを作成します。

以下の機能を使用して、最適な CPU パフォーマンスを得るためにインスタンスを調整します。

  • CPU ピニング: 仮想 CPU を物理 CPU に固定します。
  • エミュレータースレッド: インスタンスに関連付けられたエミュレータースレッドを物理 CPU に固定します。
  • CPU 機能フラグ: コンピュートノード間のライブマイグレーションの互換性を向上させるために、インスタンスに適用される CPU 機能フラグの標準セットを設定します。

4.1. Compute ノードでの CPU ピニングの設定

コンピュートノードで CPU ピニングを有効化することで、各インスタンスの CPU プロセスを専用のホスト CPU で実行するように設定することができます。インスタンスが CPU ピニングを使用する場合には、各インスタンスの仮想 CPU プロセスには、他のインスタンスの仮想 CPU プロセスが使用できない独自のホストの物理 CPU が割り当てられます。CPU ピニングが設定されたコンピュートノード上で動作するインスタンスには、NUMA トポロジーがあります。インスタンスの NUMA トポロジーの各 NUMA ノードは、ホストコンピュートノード上の NUMA ノードにマッピングされます。

専用の (ピニングされた) CPU を持つインスタンスと共有 (フローティング) の CPU を持つインスタンスを同じコンピュートノード上にスケジューリングするように、Compute のスケジューラーを設定することができます。NUMA トポロジーを持つコンピュートノード上で CPU ピニングを設定するには、以下の手順を実施する必要があります。

  1. CPU ピニング用のコンピュートノードを指定する。
  2. ピニングされたインスタンス仮想 CPU プロセス、フローティングのインスタンス仮想 CPU プロセス、およびホストのプロセス用にホストコアを確保するようにコンピュートノードを設定する。
  3. オーバークラウドをデプロイする。
  4. CPU ピニングを要求するインスタンスを起動するためのフレーバーを作成する。
  5. 共有 (あるいはフローティング) の CPU を使用するインスタンスを起動するためのフレーバーを作成する。
注記

CPU ピニングを設定すると、NUMA トポロジーが要求されていない場合でも、インスタンス上に暗黙的な NUMA トポロジーが作成されます。NUMA 仮想マシンと非 NUMA 仮想マシン (仮想マシン) を同じホストで実行しないでください。詳細は、NUMA 使用時の制約 を参照してください。

4.1.1. 前提条件

4.1.2. CPU ピニング用コンピュートノードの指定

ピニングされた CPU を持つインスタンスのコンピュートノードを指定するには、新しいロールファイルを作成して CPU ピニングロールを設定し、CPU ピニング用のコンピュートノードにタグを付けるために使用する CPU ピニングリソースクラスを使用してベアメタルノードを設定する必要があります。

注記

以下の手順は、まだプロビジョニングされていない新しいオーバークラウドノードに適用されます。すでにプロビジョニングされている既存のオーバークラウドノードにリソースクラスを割り当てるには、スケールダウン手順を使用してノードのプロビジョニングを解除してから、スケールアップ手順を使用して新しいリソースクラスの割り当てでノードを再プロビジョニングする必要があります。詳細は、オーバークラウドノードのスケーリング を参照してください。

手順

  1. アンダークラウドに stack ユーザーとしてログインします。
  2. stackrc ファイルを取得します。

    [stack@director ~]$ source ~/stackrc
  3. ControllerComputeComputeCPUPinning ロール、およびオーバークラウドに必要なその他のロールを含む、roles_data_cpu_pinning.yaml という名前の新しいロールデータファイルを生成します。

    (undercloud)$ openstack overcloud roles \
     generate -o /home/stack/templates/roles_data_cpu_pinning.yaml \
     Compute:ComputeCPUPinning Compute Controller
  4. roles_data_cpu_pinning.yaml を開き、以下のパラメーターおよびセクションを編集または追加します。

    セクション/パラメーター現在の値新しい値

    ロールのコメント

    Role: Compute

    Role: ComputeCPUPinning

    ロール名

    Compute

    name: ComputeCPUPinning

    description

    Basic Compute Node role

    CPU Pinning Compute Node role

    HostnameFormatDefault

    %stackname%-novacompute-%index%

    %stackname%-novacomputepinning-%index%

    deprecated_nic_config_name

    compute.yaml

    compute-cpu-pinning.yaml

  5. オーバークラウド用の CPU ピニングコンピュートノードをノード定義のテンプレート node.json または node.yaml に追加して、そのノードを登録します。詳細は、director を使用した Red Hat OpenStack Platform のインストールと管理 ガイドの オーバークラウドのノードの登録 を参照してください。
  6. ノードのハードウェアを検査します。

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

    詳細は、director を使用した Red Hat OpenStack Platform のインストールと管理 ガイドの ベアメタルノードハードウェアのインベントリーの作成 を参照してください。

  7. CPU ピニング用に指定する各ベアメタルノードに、カスタムの CPU ピニングリソースクラスをタグ付けします。

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

    <node> をベアメタルノードの ID に置き換えてください。

  8. ノード定義ファイル overcloud-baremetal-deploy.yamlComputeCPUPinning ロールを追加し、予測ノード配置、リソースクラス、ネットワークトポロジー、またはノードに割り当てるその他の属性を定義します。

    - name: Controller
      count: 3
    - name: Compute
      count: 3
    - name: ComputeCPUPinning
      count: 1
      defaults:
        resource_class: baremetal.CPU-PINNING
        network_config:
          template: /home/stack/templates/nic-config/myRoleTopology.j2 1
    1
    既存のネットワークトポロジーを再利用するか、ロール用の新しいカスタムネットワークインターフェイステンプレートを作成できます。詳細は、director を使用した Red Hat OpenStack Platform のインストールと管理 ガイドの カスタムネットワークインターフェイステンプレート を参照してください。network_config プロパティーを使用してネットワーク定義を定義しない場合、デフォルトのネットワーク定義が使用されます。

    ノード定義ファイルでノード属性を設定するために使用できるプロパティーの詳細は、ベアメタルノードのプロビジョニング属性 を参照してください。ノード定義ファイルの例は、ノード定義ファイルの例 を参照してください。

  9. プロビジョニングコマンドを実行して、ロールの新しいノードをプロビジョニングします。

    (undercloud)$ openstack overcloud node provision \
    --stack <stack> \
    [--network-config \]
    --output /home/stack/templates/overcloud-baremetal-deployed.yaml \
    /home/stack/templates/overcloud-baremetal-deploy.yaml
    • <stack> を、ベアメタルノードがプロビジョニングされるスタックの名前に置き換えます。指定しない場合、デフォルトは overcloud です。
    • --network-config オプションの引数を含めて、cli-overcloud-node-network-config.yaml Ansible Playbook にネットワーク定義を提供します。network_config プロパティーを使用してネットワーク定義を定義しない場合、デフォルトのネットワーク定義が使用されます。
  10. 別のターミナルでプロビジョニングの進捗をモニタリングします。プロビジョニングが成功すると、ノードの状態が available から active に変わります。

    (undercloud)$ watch openstack baremetal node list
  11. --network-config オプションを指定してプロビジョニングコマンドを実行しなかった場合は、network-environment.yaml ファイルで <Role>NetworkConfigTemplate パラメーターを設定して、NIC テンプレートファイルを指すようにします。

    parameter_defaults:
       ComputeNetworkConfigTemplate: /home/stack/templates/nic-configs/compute.j2
       ComputeCPUPinningNetworkConfigTemplate: /home/stack/templates/nic-configs/<cpu_pinning_net_top>.j2
       ControllerNetworkConfigTemplate: /home/stack/templates/nic-configs/controller.j2

    <cpu_pinning_net_top>ComputeCPUPinning ロールのネットワークトポロジーが含まれるファイルの名前に置き換えます。たとえば、デフォルトのネットワークトポロジーを使用する場合は compute.yaml です。

4.1.3. CPU ピニング用コンピュートノードの設定

ノードの NUMA トポロジーに基づいて、コンピュートノードでの CPU ピニングを設定します。効率を高めるために、全 NUMA ノードにわたって、CPU コアの一部をホストのプロセス用に確保します。残りの CPU コアをインスタンスの管理に割り当てます。

以下の手順では、以下の NUMA トポロジー (8 つの CPU コアを 2 つの NUMA ノードに分散) を使用して、CPU ピニングの設定方法を説明します。

表4.1 NUMA トポロジーの例

NUMA ノード 0

NUMA ノード 1

コア 0

コア 1

コア 2

コア 3

コア 4

コア 5

コア 6

コア 7

以下の手順では、コア 0 および 4 をホストのプロセス用に、コア 1、3、5、および 7 を CPU ピニングが必要なインスタンス用に、そしてコア 2 および 6 を CPU ピニングが不要なフローティングインスタンス用に、それぞれ確保します。

手順

  1. ピニングされたインスタンス、フローティングのインスタンス、およびホストプロセス用にコアを確保するようにコンピュートノードを設定する環境ファイルを作成します (例: cpu_pinning.yaml)。
  2. NUMA 対応コンピュートノードに NUMA トポロジーが設定されたインスタンスをスケジュールするには、Compute 環境ファイルの NovaSchedulerEnabledFilters パラメーターに NUMATopologyFilter がなければ、このフィルターを追加します。

    parameter_defaults:
      NovaSchedulerEnabledFilters:
        - AvailabilityZoneFilter
        - ComputeFilter
        - ComputeCapabilitiesFilter
        - ImagePropertiesFilter
        - ServerGroupAntiAffinityFilter
        - ServerGroupAffinityFilter
        - PciPassthroughFilter
        - NUMATopologyFilter

    NUMATopologyFilter の詳細は、Compute scheduler filters を参照してください。

  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. file-backed メモリーを使用していない場合は、ホストプロセス用に予約する RAM の容量を指定します。

    parameter_defaults:
      ComputeCPUPinningParameters:
        ...
        NovaReservedHugePages: <ram>

    <ram> を、確保するメモリー容量 (MB 単位) に置き換えます。

  6. インスタンス用に確保した CPU コアでホストプロセスが実行されないようにするには、IsolCpusList パラメーターに、インスタンス用に確保した CPU コアを設定します。

    parameter_defaults:
      ComputeCPUPinningParameters:
        ...
        IsolCpusList: 1-3,5-7

    コンマ区切りの CPU インデックスのリストまたは範囲を使用して、IsolCpusList パラメーターの値を指定します。

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

    (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/overcloud-baremetal-deployed.yaml \
      -e /home/stack/templates/node-info.yaml

4.1.4. インスタンス用の専用 CPU フレーバーの作成

クラウドユーザーが専用の CPU を持つインスタンスを作成できるようにするには、インスタンス起動用の専用 CPU ポリシーが設定されたフレーバーを作成します。

前提条件

手順

  1. source コマンドで 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 属性を dedicated に設定します。

    (overcloud)$ openstack flavor set \
     --property hw:cpu_policy=dedicated pinned_cpus
  4. file-backed メモリーを使用していない場合は、フレーバーの hw:mem_page_size プロパティーで NUMA 対応メモリー割り当てを有効に設定します。

    (overcloud)$ openstack flavor set \
     --property hw:mem_page_size=<page_size> pinned_cpus
    • <page_size> は、次に示す有効な値のいずれかに置き換えます。

      • large: ホストでサポートされる最大のページサイズを選択します。x86_64 システムでは 2 MB または 1 GB です。
      • small: (デフォルト) ホストでサポートされる最小のページサイズを選択します。X86_64 システムでは、4 kB (通常のページ) です。
      • any : イメージに設定された hw_mem_page_size を使用してページサイズを選択します。ページサイズがイメージで指定されていない場合は、libvirt ドライバーで決定される、利用可能な最大のページサイズを選択します。
      • <pagesize>: ワークロードに具体的な要件がある場合、ページサイズを明示的に設定します。ページサイズには整数値を使用し、KB またはその他の標準単位で指定します。(例: 4kB、2MB、2048、1GB)。
    注記

    hw:mem_page_sizesmall または any に設定するには、インスタンスではないプロセス用に各 NUMA ノードで予約するメモリーページの量を設定しておく必要があります。詳細は、コンピュートノードで Huge Page を設定する を参照してください。

  5. それぞれの仮想 CPU をスレッドシブリングに配置するには、フレーバーの hw:cpu_thread_policy 属性を require に設定します。

    (overcloud)$ openstack flavor set \
     --property hw:cpu_thread_policy=require pinned_cpus
    注記
    • ホストに SMT アーキテクチャーがない場合や、スレッドシブリングが利用可能な CPU コアが十分にない場合には、スケジューリングが失敗します。これを回避するには、hw:cpu_thread_policyrequire ではなく prefer に設定します。prefer ポリシーは、スレッドシブリングが利用可能な場合に使用されるデフォルトのポリシーです。
    • hw:cpu_thread_policy=isolate を使用する場合は、SMT を無効にするか、SMT をサポートしないプラットフォームを使用する必要があります。

検証

  1. フレーバーにより専用の CPU を持つインスタンスが作成されることを確認するには、新しいフレーバーを使用してインスタンスを起動します。

    (overcloud)$ openstack server create --flavor pinned_cpus \
     --image <image> pinned_cpu_instance

4.1.5. インスタンス用の共有 CPU フレーバーの作成

クラウドユーザーが共有の (あるいはフローティング) CPU を使用するインスタンスを作成できるようにするには、インスタンス起動用の共有 CPU ポリシーが設定されたフレーバーを作成します。

前提条件

手順

  1. source コマンドで 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
  4. file-backed メモリーを使用していない場合は、フレーバーの hw:mem_page_size プロパティーで NUMA 対応メモリー割り当てを有効に設定します。

    (overcloud)$ openstack flavor set \
     --property hw:mem_page_size=<page_size> pinned_cpus
    • <page_size> は、次に示す有効な値のいずれかに置き換えます。

      • large: ホストでサポートされる最大のページサイズを選択します。x86_64 システムでは 2 MB または 1 GB です。
      • small: (デフォルト) ホストでサポートされる最小のページサイズを選択します。X86_64 システムでは、4 kB (通常のページ) です。
      • any : イメージに設定された hw_mem_page_size を使用してページサイズを選択します。ページサイズがイメージで指定されていない場合は、libvirt ドライバーで決定される、利用可能な最大のページサイズを選択します。
      • <pagesize>: ワークロードに具体的な要件がある場合、ページサイズを明示的に設定します。ページサイズには整数値を使用し、KB またはその他の標準単位で指定します。(例: 4kB、2MB、2048、1GB)。
    注記

    hw:mem_page_sizesmall または any に設定するには、インスタンスではないプロセス用に各 NUMA ノードで予約するメモリーページの量を設定しておく必要があります。詳細は、コンピュートノードで Huge Page を設定する を参照してください。

4.1.6. インスタンス用の混合 CPU フレーバーの作成

クラウドユーザーが専用 CPU と共有 CPU の組み合わせを持つインスタンスを作成できるようにするには、インスタンス起動用の混合 CPU ポリシーが設定されたフレーバーを作成します。

手順

  1. source コマンドで overcloudrc ファイルを読み込みます。

    (undercloud)$ source ~/overcloudrc
  2. 専用 CPU と共有 CPU の組み合わせを要求するインスタンス用のフレーバーを作成します。

    (overcloud)$ openstack flavor create --ram <size_mb> \
     --disk <size_gb> --vcpus <number_of_reserved_vcpus> \
     --property hw:cpu_policy=mixed mixed_CPUs_flavor
  3. どの CPU を専用または共有にする必要があるかを指定します。

    (overcloud)$ openstack flavor set \
     --property hw:cpu_dedicated_mask=<CPU_number> \
     mixed_CPUs_flavor
    • <CPU_number> を、専用または共有する必要がある CPU に置き換えます。

      • 専用 CPU を指定するには、CPU 番号または CPU 範囲を指定します。たとえば、CPU 2 と 3 を専用に指定し、残りのすべての CPU を共有に指定するには、プロパティーを 2-3 に設定します。
      • 共有 CPU を指定するには、CPU 番号または CPU 範囲の前にキャレット (^) を付けます。たとえば、CPU 0 と 1 を共有に指定し、残りのすべての CPU を専用に指定するには、プロパティーを ^0-1 に設定します。
  4. file-backed メモリーを使用していない場合は、フレーバーの hw:mem_page_size プロパティーで NUMA 対応メモリー割り当てを有効に設定します。

    (overcloud)$ openstack flavor set \
     --property hw:mem_page_size=<page_size> pinned_cpus
    • <page_size> は、次に示す有効な値のいずれかに置き換えます。

      • large: ホストでサポートされる最大のページサイズを選択します。x86_64 システムでは 2 MB または 1 GB です。
      • small: (デフォルト) ホストでサポートされる最小のページサイズを選択します。X86_64 システムでは、4 kB (通常のページ) です。
      • any : イメージに設定された hw_mem_page_size を使用してページサイズを選択します。ページサイズがイメージで指定されていない場合は、libvirt ドライバーで決定される、利用可能な最大のページサイズを選択します。
      • <pagesize>: ワークロードに具体的な要件がある場合、ページサイズを明示的に設定します。ページサイズには整数値を使用し、KB またはその他の標準単位で指定します。(例: 4kB、2MB、2048、1GB)。
    注記

    hw:mem_page_sizesmall または any に設定するには、インスタンスではないプロセス用に各 NUMA ノードで予約するメモリーページの量を設定しておく必要があります。詳細は、コンピュートノードで Huge Page を設定する を参照してください。

4.1.7. 同時マルチスレッド (SMT) 対応のコンピュートノードでの CPU ピニングの設定

コンピュートノードが同時マルチスレッド (SMT) をサポートする場合、スレッドシブリングを専用または共有セットのいずれかにグルーピングします。スレッドシブリングは共通のハードウェアを共有するため、あるスレッドシブリング上で動作しているプロセスが、他のスレッドシブリングのパフォーマンスに影響を与える可能性があります。

たとえば、ホストは、SMT 対応のデュアルコア CPU に 4 つの論理 CPU コア (0、1、2、および 3) を認識します。この 4 つの CPU に対して、スレッドシブリングのペアが 2 つあります。

  • スレッドシブリング 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

4.1.8. 関連情報

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.