第3章 パフォーマンス改善のためのコンピュートノードの設定
クラウドユーザーは、インスタンスのスケジューリングおよび配置を設定して、最大のパフォーマンスを得ることができます。そのためには、NFV や高性能コンピューティング (HPC) などの特化されたワークロードを対象にするカスタムフレーバーを作成します。
以下の機能を使用して、最大のパフォーマンスを得るためにインスタンスを調整します。
- CPU ピニング: 仮想 CPU を物理 CPU に固定します。
- エミュレータースレッド: インスタンスに関連付けられたエミュレータースレッドを物理 CPU に固定します。
- ヒュージページ: 通常のメモリー (4 KB ページ) とヒュージページ (2 MB または 1 GB ページ) の両方について、インスタンスのメモリー割り当てポリシーを調整します。
これらの機能のいずれかを設定すると、インスタンス上に NUMA トポロジーが存在しない場合、暗黙的な NUMA トポロジーが作成されます。
3.1. コンピュートノードでの CPU ピニングの設定
コンピュートノードで CPU ピニングを有効化することで、各インスタンスの CPU プロセスを専用のホスト CPU で実行するように設定することができます。インスタンスが CPU ピニングを使用する場合には、各インスタンスの仮想 CPU プロセスには、他のインスタンスの仮想 CPU プロセスが使用できない独自のホストの物理 CPU が割り当てられます。CPU ピニングが設定されたコンピュートノード上で動作するインスタンスには、NUMA トポロジーがあります。インスタンスの NUMA トポロジーの各 NUMA ノードは、ホストコンピュートノード上の NUMA ノードにマッピングされます。
専用の (ピニングされた) CPU を持つインスタンスと共有 (フローティング) の CPU を持つインスタンスを同じコンピュートノード上にスケジューリングするように、Compute のスケジューラーを設定することができます。NUMA トポロジーを持つコンピュートノード上で CPU ピニングを設定するには、以下の手順を実施する必要があります。
- CPU ピニング用のコンピュートノードを指定する。
- ピニングされたインスタンス仮想 CPU プロセス、フローティングのインスタンス仮想 CPU プロセス、およびホストのプロセス用にホストコアを確保するようにコンピュートノードを設定する。
- オーバークラウドをデプロイする。
- CPU ピニングを要求するインスタンスを起動するためのフレーバーを作成する。
- 共有 (あるいはフローティング) の CPU を使用するインスタンスを起動するためのフレーバーを作成する。
3.1.1. 前提条件
- コンピュートノードの NUMA トポロジーを把握している。
3.1.2. CPU ピニング用コンピュートノードの指定
ピニングされた CPU を使用するインスタンス用にコンピュートノードを指定するには、CPU ピニングロールを設定するための新規ロールファイルを作成し、CPU ピニングのためにコンピュートノードをタグ付けするための新規オーバークラウドフレーバーおよび CPU ピニングリソースクラスを設定する必要があります。
手順
-
アンダークラウドに
stack
ユーザーとしてログインします。 stackrc
ファイルを取得します。[stack@director ~]$ source ~/stackrc
roles_data_cpu_pinning.yaml
という名前で、Controller
、Compute
、およびComputeCPUPinning
ロールが含まれる新しいロールデータファイルを生成します。(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 のインストールと使用方法 の オーバークラウドノードの登録 を参照してください。 ノードのハードウェアを検査します。
(undercloud)$ openstack overcloud node introspect \ --all-manageable --provide
詳細は、Director Installation and Usage ガイドの Creating an inventory of the bare-metal node hardware を参照してください。
CPU ピニングを使用するコンピュートノード用の
compute-cpu-pinning
オーバークラウドフレーバーを作成します。(undercloud)$ openstack flavor create --id auto \ --ram <ram_size_mb> --disk <disk_size_gb> \ --vcpus <no_vcpus> compute-cpu-pinning
-
<ram_size_mb>
をベアメタルノードの RAM (MB 単位) に置き換えます。 -
<disk_size_gb>
をベアメタルノード上のディスク容量 (GB 単位) に置き換えます。 <no_vcpus>
をベアメタルノードの CPU 数に置き換えます。注記これらの属性は、インスタンスのスケジューリングには使用されません。ただし Compute スケジューラーは、ディスク容量を使用してルートパーティションのサイズを決定します。
-
ノードリストを取得して UUID を把握します。
(undercloud)$ openstack baremetal node list
CPU ピニング用に指定する各ベアメタルノードに、カスタムの CPU ピニングリソースクラスをタグ付けします。
(undercloud)$ openstack baremetal node set \ --resource-class baremetal.CPU-PINNING <node>
<node>
をベアメタルノードの ID に置き換えてください。compute-cpu-pinning
フレーバーをカスタムの CPU ピニングリソースクラスに関連付けます。(undercloud)$ openstack flavor set \ --property resources:CUSTOM_BAREMETAL_CPU_PINNING=1 \ compute-cpu-pinning
Bare Metal サービスノードのリソースクラスに対応するカスタムリソースクラスの名前を指定するには、リソースクラスを大文字に変換し、それぞれの句読点をアンダースコアに置き換え、
CUSTOM_
の接頭辞を追加します。注記フレーバーが要求できるのは、ベアメタルリソースクラスの 1 つのインスタンスだけです。
以下のフレーバー属性を設定して、Compute スケジューラーがインスタンスのスケジューリングにベアメタルフレーバー属性を使用するのを防ぎます。
(undercloud)$ openstack flavor set \ --property resources:VCPU=0 \ --property resources:MEMORY_MB=0 \ --property resources:DISK_GB=0 compute-cpu-pinning
(オプション)
ComputeCPUPinning
ロールのネットワークトポロジーがCompute
ロールのネットワークトポロジーと異なる場合は、カスタムネットワークインターフェイステンプレートを作成します。詳細は、オーバークラウドの高度なカスタマイズ の カスタムネットワークインターフェイステンプレート を参照してください。ComputeCPUPinning
ロールのネットワークトポロジーがCompute
ロールと同じ場合は、compute.yaml
で定義されるデフォルトのネットワークトポロジーを使用することができます。ComputeCPUPinning
ロールのNet::SoftwareConfig
をnetwork-environment.yaml
ファイルに登録します。resource_registry: OS::TripleO::Compute::Net::SoftwareConfig: /home/stack/templates/nic-configs/compute.yaml OS::TripleO::ComputeCPUPinning::Net::SoftwareConfig: /home/stack/templates/nic-configs/<cpu_pinning_net_top>.yaml OS::TripleO::Controller::Net::SoftwareConfig: /home/stack/templates/nic-configs/controller.yaml
<cpu_pinning_net_top>
をComputeCPUPinning
ロールのネットワークトポロジーが含まれるファイルの名前に置き換えます。たとえば、デフォルトのネットワークトポロジーを使用する場合はcompute.yaml
です。以下のパラメーターを
node-info.yaml
ファイルに追加して、CPU ピニングコンピュートノードの数および CPU ピニング対応コンピュートノード用に使用するフレーバーを指定します。parameter_defaults: OvercloudComputeCPUPinningFlavor: compute-cpu-pinning ComputeCPUPinningCount: 3
ロールが作成されたことを確認するには、以下のコマンドを入力します。
(undercloud)$ openstack baremetal node list --long -c "UUID" \ -c "Instance UUID" -c "Resource Class" -c "Provisioning State" \ -c "Power State" -c "Last Error" -c "Fault" -c "Name" -f json
出力例:
[ { "Fault": null, "Instance UUID": "e8e60d37-d7c7-4210-acf7-f04b245582ea", "Last Error": null, "Name": "compute-0", "Power State": "power on", "Provisioning State": "active", "Resource Class": "baremetal.CPU-PINNING", "UUID": "b5a9ac58-63a7-49ba-b4ad-33d84000ccb4" }, { "Fault": null, "Instance UUID": "3ec34c0b-c4f5-4535-9bd3-8a1649d2e1bd", "Last Error": null, "Name": "compute-1", "Power State": "power on", "Provisioning State": "active", "Resource Class": "compute", "UUID": "432e7f86-8da2-44a6-9b14-dfacdf611366" }, { "Fault": null, "Instance UUID": "4992c2da-adde-41b3-bef1-3a5b8e356fc0", "Last Error": null, "Name": "controller-0", "Power State": "power on", "Provisioning State": "active", "Resource Class": "controller", "UUID": "474c2fc8-b884-4377-b6d7-781082a3a9c0" } ]
3.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 環境ファイルの
NovaSchedulerDefaultFilters
パラメーターにNUMATopologyFilter
がなければ、このフィルターを追加します。parameter_defaults: NovaSchedulerDefaultFilters: ['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
ホストのプロセス用に確保する RAM 容量を指定するには、以下の設定を
cpu_pinning.yaml
に追加します。parameter_defaults: ComputeCPUPinningParameters: ... NovaReservedHostMemory: <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/node-info.yaml
3.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
それぞれの仮想 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
新規インスタンスが正しく配置されていることを確認するには、以下のコマンドを入力し、その出力で
OS-EXT-SRV-ATTR:hypervisor_hostname
の箇所を確認します。(overcloud)$ openstack server show pinned_cpu_instance
3.1.6. 同時マルチスレッド (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
3.1.7. 関連情報
- ネットワーク機能仮想化 (NFV) のプランニングおよび設定ガイドの NUMA ノードのトポロジーについての理解
- ネットワーク機能仮想化 (NFV) の製品ガイドの CPU と NUMA ノード