先に進む前に、Windows 10 VMがQEMU-KVMで常に100%のCPU使用率を示すのはなぜですか?をお読みください。同じ問題がOpenStack上のWindows10VMにも当てはまり、速度が低下し、常に100%のCPU使用率を使用します。この記事では、CPUごとにすべてのコアを利用するマルチコアプロセッサでWindows10VMを実行するようにOpenStackを構成する方法を示します。
セットアップ情報
KVMバージョン: 2.12.0
ゲストOS: Windows10ホーム
ホストCPU: AMD Opteron(TM)プロセッサ6128と
- CPUモデル:x86_64
- CPU:16
- CPU周波数:2000 MHz
- CPUソケット:1
- ソケットあたりのコア:4
- コアあたりのスレッド:1
- NUMAセル:4
- メモリサイズ:65771872 KiB
マルチコアプロセッサでWindows10VMを実行するようにOpenStackを構成する方法
上記の最新のサーバーCPUは、NUMA(Non-Uniform Memory Access)アーキテクチャを使用しています。次の画像は、UMAとNUMAの比較を示しています。 NUMAアーキテクチャは、プロセッサごとに個別のメモリを提供します(すべてのプロセッサがバスを介して共有メモリにアクセスするUMAとは異なります)。同時に、プロセッサは共有バスを使用して他のプロセッサに属するメモリにアクセスできます。 CPUには、マルチプロセッサ上の他のメモリよりも高速に自身のローカルメモリにアクセスできるというパフォーマンス上の利点があります。
PIC提供:www.nakivo.com
次の図に示すようにNUMAホストでVMを実行する場合、プロセスを実行するvCPUがこれらのプロセスで使用されるメモリと同じNUMAノード上にあることが重要です。これにより、すべてのメモリアクセスがノードに対してローカルになり、限られたノード間のメモリ帯域幅を消費せず、メモリアクセスに遅延が追加されます。
OpenStackのNUMAトポロジーとCPUピニング機能の構成により、ハイパーバイザーCPUでのインスタンスの実行方法と、インスタンスで使用可能な仮想CPUのトポロジーを高レベルで制御できます。
NUMAノードの配置とトポロジを使用してフレーバーを構成する方法
以下の構成により、libvirtドライバーはゲスト用のインテリジェントなCPU/CORES配置を実行できるようになります。これにより、ゲストによるノード間のメモリアクセスを回避することで、コンピューティングリソースの有効利用率が向上し、遅延が減少します。トポロジの仕様をサポートするには、フレーバーに仕様を追加する必要があります。 Openstackでは、プロパティを使用して仮想マシンのプロセッサのCPUトポロジを定義できます。
$ openstack flavor set FLAVOR-NAME \ --property hw:cpu_sockets=FLAVOR-SOCKETS \ --property hw:cpu_cores=FLAVOR-CORES \ --property hw:cpu_threads=FLAVOR-THREADS \
場所:
- FLAVOR-SOCKETS :(整数)ゲストVMのソケットの数。デフォルトでは、これは要求されたvCPUの数に設定されています。
- FLAVOR-CORES :(整数)ゲストVMのソケットあたりのコア数。デフォルトでは、これは1に設定されています。
- FLAVOR-THREADS :(整数)ゲストVMのコアあたりのスレッド数。デフォルトでは、これは1に設定されています。
各VMに、ホストコンピューターで使用可能な実際のコアの数よりも多くの仮想コアを構成しないでください。
私のトポロジーでは、以下がフレーバーセットです:
$ openstack flavor set Windows10 \ --property hw:cpu_sockets=1 \ --property hw:cpu_cores=4 \ --property hw:cpu_threads=1 \