第4章 コンピュートノードで CPU を設定する
クラウドユーザーは、インスタンスのスケジューリングおよび配置を設定して、最大のパフォーマンスを得ることができます。そのためには、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 ピニングを設定するには、以下の手順を実施する必要があります。
- CPU ピニング用のコンピュートノードを指定する。
- ピニングされたインスタンス仮想 CPU プロセス、フローティングのインスタンス仮想 CPU プロセス、およびホストのプロセス用にホストコアを確保するようにコンピュートノードを設定する。
- オーバークラウドをデプロイする。
- CPU ピニングを要求するインスタンスを起動するためのフレーバーを作成する。
- 共有 (あるいはフローティング) の CPU を使用するインスタンスを起動するためのフレーバーを作成する。
CPU ピニングを設定すると、NUMA トポロジーが要求されていない場合でも、インスタンス上に暗黙的な NUMA トポロジーが作成されます。NUMA 仮想マシンと非 NUMA 仮想マシン (仮想マシン) を同じホストで実行しないでください。詳細は、NUMA 使用時の制約 を参照してください。
4.1.1. 前提条件
- コンピュートノードの NUMA トポロジーを把握している。
-
コンピュートノードで
NovaReservedHugePages
を設定している。詳細は、コンピュートノードで Huge Page を設定する を参照してください。
4.1.2. CPU ピニング用コンピュートノードの指定
ピニングされた CPU を持つインスタンスのコンピュートノードを指定するには、新しいロールファイルを作成して CPU ピニングロールを設定し、CPU ピニング用のコンピュートノードにタグを付けるために使用する CPU ピニングリソースクラスを使用してベアメタルノードを設定する必要があります。
以下の手順は、まだプロビジョニングされていない新しいオーバークラウドノードに適用されます。すでにプロビジョニングされている既存のオーバークラウドノードにリソースクラスを割り当てるには、スケールダウン手順を使用してノードのプロビジョニングを解除してから、スケールアップ手順を使用して新しいリソースクラスの割り当てでノードを再プロビジョニングする必要があります。詳細は、オーバークラウドノードのスケーリング を参照してください。
手順
-
アンダークラウドに
stack
ユーザーとしてログインします。 stackrc
ファイルを取得します。[stack@director ~]$ source ~/stackrc
Controller
、Compute
、ComputeCPUPinning
ロール、およびオーバークラウドに必要なその他のロールを含む、roles_data_cpu_pinning.yaml
という名前の新しいロールデータファイルを生成します。(undercloud)$ openstack overcloud roles \ generate -o /home/stack/templates/roles_data_cpu_pinning.yaml \ Compute:ComputeCPUPinning Compute Controller
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
-
オーバークラウド用の CPU ピニングコンピュートノードをノード定義のテンプレート
node.json
またはnode.yaml
に追加して、そのノードを登録します。詳細は、director を使用した Red Hat OpenStack Platform のインストールと管理 ガイドの オーバークラウドのノードの登録 を参照してください。 ノードのハードウェアを検査します。
(undercloud)$ openstack overcloud node introspect \ --all-manageable --provide
詳細は、director を使用した Red Hat OpenStack Platform のインストールと管理 ガイドの ベアメタルノードハードウェアのインベントリーの作成 を参照してください。
CPU ピニング用に指定する各ベアメタルノードに、カスタムの CPU ピニングリソースクラスをタグ付けします。
(undercloud)$ openstack baremetal node set \ --resource-class baremetal.CPU-PINNING <node>
<node>
をベアメタルノードの ID に置き換えてください。ノード定義ファイル
overcloud-baremetal-deploy.yaml
にComputeCPUPinning
ロールを追加し、予測ノード配置、リソースクラス、ネットワークトポロジー、またはノードに割り当てるその他の属性を定義します。- 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
プロパティーを使用してネットワーク定義を定義しない場合、デフォルトのネットワーク定義が使用されます。
ノード定義ファイルでノード属性を設定するために使用できるプロパティーの詳細は、ベアメタルノードのプロビジョニング属性 を参照してください。ノード定義ファイルの例は、ノード定義ファイルの例 を参照してください。
プロビジョニングコマンドを実行して、ロールの新しいノードをプロビジョニングします。
(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
プロパティーを使用してネットワーク定義を定義しない場合、デフォルトのネットワーク定義が使用されます。
-
別のターミナルでプロビジョニングの進捗をモニタリングします。プロビジョニングが成功すると、ノードの状態が
available
からactive
に変わります。(undercloud)$ watch openstack baremetal node list
--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 ピニングの設定方法を説明します。
NUMA ノード 0 | NUMA ノード 1 | ||
コア 0 | コア 1 | コア 2 | コア 3 |
コア 4 | コア 5 | コア 6 | コア 7 |
以下の手順では、コア 0 および 4 をホストのプロセス用に、コア 1、3、5、および 7 を CPU ピニングが必要なインスタンス用に、そしてコア 2 および 6 を CPU ピニングが不要なフローティングインスタンス用に、それぞれ確保します。
手順
-
ピニングされたインスタンス、フローティングのインスタンス、およびホストプロセス用にコアを確保するようにコンピュートノードを設定する環境ファイルを作成します (例:
cpu_pinning.yaml
)。 NUMA 対応コンピュートノードに NUMA トポロジーが設定されたインスタンスをスケジュールするには、Compute 環境ファイルの
NovaSchedulerEnabledFilters
パラメーターにNUMATopologyFilter
がなければ、このフィルターを追加します。parameter_defaults: NovaSchedulerEnabledFilters: - AvailabilityZoneFilter - ComputeFilter - ComputeCapabilitiesFilter - ImagePropertiesFilter - ServerGroupAntiAffinityFilter - ServerGroupAffinityFilter - PciPassthroughFilter - NUMATopologyFilter
NUMATopologyFilter
の詳細は、Compute scheduler filters を参照してください。専用のインスタンス用に物理 CPU コアを確保するには、以下の設定を
cpu_pinning.yaml
に追加します。parameter_defaults: ComputeCPUPinningParameters: NovaComputeCpuDedicatedSet: 1,3,5,7
共有のインスタンス用に物理 CPU コアを確保するには、以下の設定を
cpu_pinning.yaml
に追加します。parameter_defaults: ComputeCPUPinningParameters: ... NovaComputeCpuSharedSet: 2,6
file-backed メモリーを使用していない場合は、ホストプロセス用に予約する RAM の容量を指定します。
parameter_defaults: ComputeCPUPinningParameters: ... NovaReservedHugePages: <ram>
<ram>
を、確保するメモリー容量 (MB 単位) に置き換えます。インスタンス用に確保した CPU コアでホストプロセスが実行されないようにするには、
IsolCpusList
パラメーターに、インスタンス用に確保した CPU コアを設定します。parameter_defaults: ComputeCPUPinningParameters: ... IsolCpusList: 1-3,5-7
コンマ区切りの CPU インデックスのリストまたは範囲を使用して、
IsolCpusList
パラメーターの値を指定します。新しいファイルを他の環境ファイルと一緒にスタックに追加し、オーバークラウドをデプロイします。
(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 ポリシーが設定されたフレーバーを作成します。
前提条件
- ホストで同時マルチスレッド (SMT) が有効である。
- コンピュートノードが CPU ピニングを許可するように設定されている。詳細は、コンピュートノードでの CPU ピニングの設定 を参照してください。
手順
source コマンドで
overcloudrc
ファイルを読み込みます。(undercloud)$ source ~/overcloudrc
CPU ピニングを要求するインスタンス用のフレーバーを作成します。
(overcloud)$ openstack flavor create --ram <size_mb> \ --disk <size_gb> --vcpus <no_reserved_vcpus> pinned_cpus
ピニングされた CPU を要求するには、フレーバーの
hw:cpu_policy
属性をdedicated
に設定します。(overcloud)$ openstack flavor set \ --property hw:cpu_policy=dedicated pinned_cpus
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_size
をsmall
またはany
に設定するには、インスタンスではないプロセス用に各 NUMA ノードで予約するメモリーページの量を設定しておく必要があります。詳細は、コンピュートノードで Huge Page を設定する を参照してください。それぞれの仮想 CPU をスレッドシブリングに配置するには、フレーバーの
hw:cpu_thread_policy
属性をrequire
に設定します。(overcloud)$ openstack flavor set \ --property hw:cpu_thread_policy=require pinned_cpus
注記-
ホストに SMT アーキテクチャーがない場合や、スレッドシブリングが利用可能な CPU コアが十分にない場合には、スケジューリングが失敗します。これを回避するには、
hw:cpu_thread_policy
をrequire
ではなくprefer
に設定します。prefer
ポリシーは、スレッドシブリングが利用可能な場合に使用されるデフォルトのポリシーです。 -
hw:cpu_thread_policy=isolate
を使用する場合は、SMT を無効にするか、SMT をサポートしないプラットフォームを使用する必要があります。
-
ホストに SMT アーキテクチャーがない場合や、スレッドシブリングが利用可能な CPU コアが十分にない場合には、スケジューリングが失敗します。これを回避するには、
検証
フレーバーにより専用の CPU を持つインスタンスが作成されることを確認するには、新しいフレーバーを使用してインスタンスを起動します。
(overcloud)$ openstack server create --flavor pinned_cpus \ --image <image> pinned_cpu_instance
4.1.6. インスタンス用の混合 CPU フレーバーの作成
クラウドユーザーが専用 CPU と共有 CPU の組み合わせを持つインスタンスを作成できるようにするには、インスタンス起動用の混合 CPU ポリシーが設定されたフレーバーを作成します。
手順
source コマンドで
overcloudrc
ファイルを読み込みます。(undercloud)$ source ~/overcloudrc
専用 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
どの 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
に設定します。
-
専用 CPU を指定するには、CPU 番号または CPU 範囲を指定します。たとえば、CPU 2 と 3 を専用に指定し、残りのすべての CPU を共有に指定するには、プロパティーを
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_size
をsmall
または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