第7章 パフォーマンス改善のためのコンピュートノードの設定
インスタンスのスケジューリングおよび配置を設定して、最大のパフォーマンスを得ることができます。そのためには、NFV や高性能コンピューティング (HPC) などの特化されたワークロードを対象にするカスタムフレーバーを作成します。
以下の機能を使用して、最大のパフォーマンスを得るためにインスタンスを調整します。
- CPU ピニング: 仮想 CPU を物理 CPU に固定します。
- エミュレータースレッド: インスタンスに関連付けられたエミュレータースレッドを物理 CPU に固定します。
- ヒュージページ: 通常のメモリー (4 KB ページ) とヒュージページ (2 MB または 1 GB ページ) の両方について、インスタンスのメモリー割り当てポリシーを調整します。
これらの機能のいずれかを設定すると、インスタンス上に NUMA トポロジーが存在しない場合、暗黙的な NUMA トポロジーが作成されます。
7.1. NUMA ノードを使用する CPU ピニングの設定
本章では、NUMA トポロジーのサポートを使用して、NUMA アーキテクチャーを持つシステム上で OpenStack 環境を設定する方法について説明します。本章で説明する手順で、仮想マシン (VM) を専用の CPU コアに固定する方法を説明します。これにより、スケジューリング機能および仮想マシンのパフォーマンスが向上します。
NUMA についての予備知識は、「What is NUMA and how does it work on Linux ?」のアーティクルに記載されています。
以下の図では、2 つのノードからなる NUMA システムの例と、CPU コアとメモリーページを利用可能にする方法の例が提供されています。
Interconnect 経由で利用可能なリモートのメモリーには、NUMA ノード 0 からの VM1 に NUMA ノード 1 の CPU コアがある場合 のみ アクセスすることができます。このような場合には、NUMA ノード 1 のメモリーは、VM1 の 3 番目の CPU コアのローカルとして機能しますが (例: 上記の図では、VM1 は CPU4 が割り当てられています)、同じ仮想マシンの別の CPU コアに対してはリモートメモリーとして機能します。
libvirt での NUMA のチューニングについての詳しい情報は、『 仮想化の設定および管理 』を参照してください。
7.1.1. コンピュートノードの設定
具体的な設定は、お使いのホストシステムの NUMA トポロジーによって異なります。ただし、全 NUMA ノードにわたって、CPU コアの一部をホストのプロセス用に確保し、それ以外の CPU コアに仮想マシン (VM) を処理させる必要があります。以下の例で、2 つの NUMA ノード間で 8 つの CPU コアを均等に分散させる場合のレイアウトを説明します。
ノード 0 | ノード 1 | |||
ホストのプロセス | コア 0 | コア 1 | コア 4 | コア 5 |
仮想マシン | コア 2 | コア 3 | コア 6 | コア 7 |
標準的な作業負荷がかかった状態におけるホストのパフォーマンスを観察した上で、ホストのプロセス用に確保するコア数を決定します。
手順
Compute 環境ファイルの
NovaVcpuPinSet
設定を定義して、仮想マシン用に CPU コアを確保します。NovaVcpuPinSet: 2,3,6,7
同じファイルの
NovaReservedHostMemory
オプションを、ホストのプロセス用に確保するメモリー容量に設定します。たとえば、512 MB を確保する場合、設定は以下のようになります。NovaReservedHostMemory: 512
仮想マシン用に確保した CPU コアでホストプロセスが実行されないようにするには、Compute 環境ファイルの
IsolCpusList
パラメーターに、仮想マシン用に確保した CPU コアを設定します。CPU インデックスの一覧またはスペース区切りの範囲を使用して、IsolCpusList
パラメーターの値を指定します。以下に例を示します。IsolCpusList: 2 3 6 7
注記IsolCpusList
パラメーターにより、下層のコンピュートノードは対応する物理 CPU を自らは使用できなくなります。物理 CPU は仮想マシン専用です。この設定を適用するには、オーバークラウドをデプロイします。
(undercloud) $ openstack overcloud deploy --templates \ -e /home/stack/templates/<compute_environment_file>.yaml
7.1.2. スケジューラーの設定
手順
- Compute 環境ファイルを開きます。
NovaSchedulerDefaultFilters
パラメーターにまだ以下の値がなければ、値を追加します。-
NUMATopologyFilter
-
AggregateInstanceExtraSpecsFilter
-
- 設定ファイルを保存します。
- オーバークラウドをデプロイします。
7.1.3. アグリゲートとフレーバーの設定
ホストアグリゲートを設定して、CPU ピニングを使用するインスタンスと使用しないインスタンスを、それぞれ別のホストにデプロイします。これにより、ピニングされていないインスタンスがピニングされたインスタンスのリソース要件を使用するのを防ぐことができます。
NUMA トポリジーを持つインスタンスを、NUMA トポリジーを持たないインスタンスと同じホストにデプロイしないでください。
システム上で Compute CLI を使用して以下の手順を実行して、OpenStack 環境で、特定のリソースにピニングされた仮想マシンインスタンスを実行するための準備を行います。
手順
admin
の認証情報を読み込みます。source ~/keystonerc_admin
ピニング要求を受信するホスト用にアグリゲートを作成します。
nova aggregate-create <aggregate-name-pinned>
アグリゲートのメタデータを編集して、ピニングを有効化します。
nova aggregate-set-metadata <aggregate-pinned-UUID> pinned=true
その他のホスト用のアグリゲートを作成します。
nova aggregate-create <aggregate-name-unpinned>
このアグリゲートのメタデータを編集します。
nova aggregate-set-metadata <aggregate-unpinned-UUID> pinned=false
既存のフレーバーのスペックを以下のように変更します。
for i in $(nova flavor-list | cut -f 2 -d ' ' | grep -o '[0-9]*'); do nova flavor-key $i set "aggregate_instance_extra_specs:pinned"="false"; done
ピニング要求を受信するホスト用にフレーバーを作成します。
nova flavor-create <flavor-name-pinned> <flavor-ID> <RAM> <disk-size> <vCPUs>
詳細は以下のようになります。
-
<flavor-ID>
:nova
で UUID を生成する場合は、auto
に設定します。 -
<RAM>
: 必要なメモリーを MB 単位で指定します。 -
<disk-size>
: 必要なディスクサイズを GB 単位で指定します。 -
<vCPUs>
: 確保する仮想 CPU の数
-
このフレーバーの
hw:cpu_policy
のスペックは、dedicated
に指定して、CPU ピニングを有効化するための専用のリソースを必要とするように設定し、hw:cpu_thread_policy
の仕様をrequire
に指定して、スレッドシブリングに各仮想 CPU を配置します。nova flavor-key <flavor-name-pinned> set hw:cpu_policy=dedicated nova flavor-key <flavor-name-pinned> set hw:cpu_thread_policy=require
注記ホストに SMT アーキテクチャーがない場合や、スレッドシブリングに空きのある CPU コアが十分にない場合には、スケジューリングが失敗します。このような動作が望ましくない場合や、単にホストが SMT アーキテクチャーを備えていない場合には、
hw:cpu_thread_policy
の仕様を使わないようにするか、require
の代わりにprefer
に設定してください。デフォルトのprefer
ポリシーでは、スレッドシブリングが利用可能な場合には、必ず使用されます。aggregate_instance_extra_specs:pinned
のスペックは「true」に指定して、このフレーバーをベースとするインスタンスが、アグリゲートのメタデータ内のこのスペックを使用するように設定します。nova flavor-key <flavor-name-pinned> set aggregate_instance_extra_specs:pinned=true
新規アグリゲートにホストを追加します。
nova aggregate-add-host <aggregate-pinned-UUID> <host_name> nova aggregate-add-host <aggregate-unpinned-UUID> <host_name>
新規フレーバーを使用してインスタンスをブートします。
nova boot --image <image-name> --flavor <flavor-name-pinned> <server-name>
新規サーバーが正しく配置されたことを確認するには、以下のコマンドを実行して、その出力で
OS-EXT-SRV-ATTR:hypervisor_hostname
の箇所をチェックします。nova show <server-name>