第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ファイルを取得します。source ~/stackrc
[stack@director ~]$ source ~/stackrcCopy to Clipboard Copied! Toggle word wrap Toggle overflow roles_data_cpu_pinning.yamlという名前で、Controller、Compute、およびComputeCPUPinningロールが含まれる新しいロールデータファイルを生成します。openstack overcloud roles \ generate -o /home/stack/templates/roles_data_cpu_pinning.yaml \ Compute:ComputeCPUPinning Compute Controller
(undercloud)$ openstack overcloud roles \ generate -o /home/stack/templates/roles_data_cpu_pinning.yaml \ Compute:ComputeCPUPinning Compute ControllerCopy to Clipboard Copied! Toggle word wrap Toggle overflow roles_data_cpu_pinning.yamlを開き、以下のパラメーターおよびセクションを編集または追加します。Expand セクション/パラメーター 現在の値 新しい値 ロールのコメント
Role: ComputeRole: ComputeCPUPinningロール名
Computename: ComputeCPUPinningdescriptionBasic Compute Node roleCPU Pinning Compute Node roleHostnameFormatDefault%stackname%-novacompute-%index%%stackname%-novacomputepinning-%index%deprecated_nic_config_namecompute.yamlcompute-cpu-pinning.yaml-
オーバークラウド用の CPU ピニングコンピュートノードをノード定義のテンプレート
node.jsonまたはnode.yamlに追加して、そのノードを登録します。詳細は、director のインストールと使用方法 の オーバークラウドノードの登録 を参照してください。 ノードのハードウェアを検査します。
openstack overcloud node introspect \ --all-manageable --provide
(undercloud)$ openstack overcloud node introspect \ --all-manageable --provideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 詳細は、director のインストールと使用方法 ガイドの ベアメタルノードハードウェアのインベントリーの作成 を参照してください。
CPU ピニングを使用するコンピュートノード用の
compute-cpu-pinningオーバークラウドフレーバーを作成します。openstack flavor create --id auto \ --ram <ram_size_mb> --disk <disk_size_gb> \ --vcpus <no_vcpus> compute-cpu-pinning
(undercloud)$ openstack flavor create --id auto \ --ram <ram_size_mb> --disk <disk_size_gb> \ --vcpus <no_vcpus> compute-cpu-pinningCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
<ram_size_mb>をベアメタルノードの RAM (MB 単位) に置き換えます。 -
<disk_size_gb>をベアメタルノード上のディスク容量 (GB 単位) に置き換えます。 <no_vcpus>をベアメタルノードの CPU 数に置き換えます。注記これらの属性は、インスタンスのスケジューリングには使用されません。ただし Compute スケジューラーは、ディスク容量を使用してルートパーティションのサイズを決定します。
-
CPU ピニング用に指定する各ベアメタルノードに、カスタムの CPU ピニングリソースクラスをタグ付けします。
openstack baremetal node set \ --resource-class baremetal.CPU-PINNING <node>
(undercloud)$ openstack baremetal node set \ --resource-class baremetal.CPU-PINNING <node>Copy to Clipboard Copied! Toggle word wrap Toggle overflow <node>をベアメタルノードの ID に置き換えてください。compute-cpu-pinningフレーバーをカスタムの CPU ピニングリソースクラスに関連付けます。openstack flavor set \ --property resources:CUSTOM_BAREMETAL_CPU_PINNING=1 \ compute-cpu-pinning
(undercloud)$ openstack flavor set \ --property resources:CUSTOM_BAREMETAL_CPU_PINNING=1 \ compute-cpu-pinningCopy to Clipboard Copied! Toggle word wrap Toggle overflow Bare Metal サービスノードのリソースクラスに対応するカスタムリソースクラスの名前を指定するには、リソースクラスを大文字に変換し、それぞれの句読点をアンダースコアに置き換え、
CUSTOM_の接頭辞を追加します。注記フレーバーが要求できるのは、ベアメタルリソースクラスの 1 つのインスタンスだけです。
以下のフレーバー属性を設定して、Compute スケジューラーがインスタンスのスケジューリングにベアメタルフレーバー属性を使用するのを防ぎます。
openstack flavor set \ --property resources:VCPU=0 \ --property resources:MEMORY_MB=0 \ --property resources:DISK_GB=0 compute-cpu-pinning
(undercloud)$ openstack flavor set \ --property resources:VCPU=0 \ --property resources:MEMORY_MB=0 \ --property resources:DISK_GB=0 compute-cpu-pinningCopy to Clipboard Copied! Toggle word wrap Toggle overflow (オプション)
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
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.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow <cpu_pinning_net_top>をComputeCPUPinningロールのネットワークトポロジーが含まれるファイルの名前に置き換えます。たとえば、デフォルトのネットワークトポロジーを使用する場合はcompute.yamlです。以下のパラメーターを
node-info.yamlファイルに追加して、CPU ピニングコンピュートノードの数および CPU ピニング対応コンピュートノード用に使用するフレーバーを指定します。parameter_defaults: OvercloudComputeCPUPinningFlavor: compute-cpu-pinning ComputeCPUPinningCount: 3
parameter_defaults: OvercloudComputeCPUPinningFlavor: compute-cpu-pinning ComputeCPUPinningCount: 3Copy to Clipboard Copied! Toggle word wrap Toggle overflow ロールが作成されたことを確認するには、以下のコマンドを入力します。
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
(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 jsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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']
parameter_defaults: NovaSchedulerDefaultFilters: ['AvailabilityZoneFilter','ComputeFilter','ComputeCapabilitiesFilter','ImagePropertiesFilter','ServerGroupAntiAffinityFilter','ServerGroupAffinityFilter','PciPassthroughFilter','NUMATopologyFilter']Copy to Clipboard Copied! Toggle word wrap Toggle overflow NUMATopologyFilterの詳細は、Compute scheduler filters を参照してください。専用のインスタンス用に物理 CPU コアを確保するには、以下の設定を
cpu_pinning.yamlに追加します。parameter_defaults: ComputeCPUPinningParameters: NovaComputeCpuDedicatedSet: 1,3,5,7parameter_defaults: ComputeCPUPinningParameters: NovaComputeCpuDedicatedSet: 1,3,5,7Copy to Clipboard Copied! Toggle word wrap Toggle overflow 共有のインスタンス用に物理 CPU コアを確保するには、以下の設定を
cpu_pinning.yamlに追加します。parameter_defaults: ComputeCPUPinningParameters: ... NovaComputeCpuSharedSet: 2,6parameter_defaults: ComputeCPUPinningParameters: ... NovaComputeCpuSharedSet: 2,6Copy to Clipboard Copied! Toggle word wrap Toggle overflow ホストのプロセス用に確保する RAM 容量を指定するには、以下の設定を
cpu_pinning.yamlに追加します。parameter_defaults: ComputeCPUPinningParameters: ... NovaReservedHostMemory: <ram>parameter_defaults: ComputeCPUPinningParameters: ... NovaReservedHostMemory: <ram>Copy to Clipboard Copied! Toggle word wrap Toggle overflow <ram>を、確保するメモリー容量 (MB 単位) に置き換えます。インスタンス用に確保した CPU コアでホストプロセスが実行されないようにするには、
IsolCpusListパラメーターに、インスタンス用に確保した CPU コアを設定します。parameter_defaults: ComputeCPUPinningParameters: ... IsolCpusList: 1-3,5-7parameter_defaults: ComputeCPUPinningParameters: ... IsolCpusList: 1-3,5-7Copy to Clipboard Copied! Toggle word wrap Toggle overflow コンマ区切りの CPU インデックスのリストまたは範囲を使用して、
IsolCpusListパラメーターの値を指定します。その他の環境ファイルと共に新しいロールファイルおよび環境ファイルをスタックに追加して、オーバークラウドをデプロイします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.1.4. インスタンス用の専用 CPU フレーバーの作成 リンクのコピーリンクがクリップボードにコピーされました!
クラウドユーザーが専用の CPU を持つインスタンスを作成できるようにするには、インスタンス起動用の専用 CPU ポリシーが設定されたフレーバーを作成します。
前提条件
- ホストで同時マルチスレッド (SMT) が有効である。
- コンピュートノードが CPU ピニングを許可するように設定されている。詳しくは、コンピュートノードでの CPU ピニングの設定 を参照してください。
手順
source コマンドで
overcloudrcファイルを読み込みます。source ~/overcloudrc
(undercloud)$ source ~/overcloudrcCopy to Clipboard Copied! Toggle word wrap Toggle overflow CPU ピニングを要求するインスタンス用のフレーバーを作成します。
openstack flavor create --ram <size_mb> \ --disk <size_gb> --vcpus <no_reserved_vcpus> pinned_cpus
(overcloud)$ openstack flavor create --ram <size_mb> \ --disk <size_gb> --vcpus <no_reserved_vcpus> pinned_cpusCopy to Clipboard Copied! Toggle word wrap Toggle overflow ピニングされた CPU を要求するには、フレーバーの
hw:cpu_policy属性をdedicatedに設定します。openstack flavor set \ --property hw:cpu_policy=dedicated pinned_cpus
(overcloud)$ openstack flavor set \ --property hw:cpu_policy=dedicated pinned_cpusCopy to Clipboard Copied! Toggle word wrap Toggle overflow それぞれの仮想 CPU をスレッドシブリングに配置するには、フレーバーの
hw:cpu_thread_policy属性をrequireに設定します。openstack flavor set \ --property hw:cpu_thread_policy=require pinned_cpus
(overcloud)$ openstack flavor set \ --property hw:cpu_thread_policy=require pinned_cpusCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記-
ホストに SMT アーキテクチャーがない場合や、スレッドシブリングが利用可能な CPU コアが十分にない場合には、スケジューリングが失敗します。これを回避するには、
hw:cpu_thread_policyをrequireではなくpreferに設定します。preferポリシーは、スレッドシブリングが利用可能な場合に使用されるデフォルトのポリシーです。 -
hw:cpu_thread_policy=isolateを使用する場合は、SMT を無効にするか、SMT をサポートしないプラットフォームを使用する必要があります。
-
ホストに SMT アーキテクチャーがない場合や、スレッドシブリングが利用可能な CPU コアが十分にない場合には、スケジューリングが失敗します。これを回避するには、
検証
フレーバーにより専用の CPU を持つインスタンスが作成されることを確認するには、新しいフレーバーを使用してインスタンスを起動します。
openstack server create --flavor pinned_cpus \ --image <image> pinned_cpu_instance
(overcloud)$ openstack server create --flavor pinned_cpus \ --image <image> pinned_cpu_instanceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 新規インスタンスが正しく配置されていることを確認するには、以下のコマンドを入力し、その出力で
OS-EXT-SRV-ATTR:hypervisor_hostnameの箇所を確認します。openstack server show pinned_cpu_instance
(overcloud)$ openstack server show pinned_cpu_instanceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
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
# 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
/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. 関連情報 リンクのコピーリンクがクリップボードにコピーされました!
- Network Functions Virtualization Planning and Configuration Guideの Discovering your NUMA node topology
- Network Functions Virtualization Product Guideの CPUs and NUMA nodes