17.6. 仮想マシンの CPU パフォーマンスの最適化
vCPU は、ホストマシンの物理 CPU と同様、仮想マシンのパフォーマンスにおいて極めて重要です。したがって、vCPU を最適化すると、仮想マシンのリソース効率に大きな影響を及ぼす可能性があります。vCPU を最適化するには、以下を実行します。
- 仮想マシンに割り当てられているホスト CPU の数を調整します。これは、CLI または Web コンソール を使用して実行できます。
vCPU モデルが、ホストの CPU モデルに調整されていることを確認します。たとえば、仮想マシン testguest1 を、ホストの CPU モデルを使用するように設定するには、次のコマンドを実行します。
# virt-xml testguest1 --edit --cpu host-model
- Kernel Same-page Merging (KSM) を無効にします。
ホストマシンが Non-Uniform Memory Access (NUMA) を使用する場合は、その仮想マシンに対して NUMA を設定 することもできます。これにより、ホストの CPU およびメモリープロセスが、仮想マシンの CPU およびメモリープロセスにできるだけ近くにマッピングされます。事実上、NUMA チューニングにより、仮想マシンに割り当てられたシステムメモリーへのより効率的なアクセスが可能になります。これにより、vCPU 処理の効果が改善されます。
詳細は、仮想マシンでの NUMA の設定 および 特定のワークロードに合わせた仮想マシンのパフォーマンスの最適化 を参照してください。
17.6.1. 仮想 CPU のオーバーコミット
仮想 CPU のオーバーコミットを使用すると、ホスト上で実行される仮想マシン (VM) 内の全仮想 CPU の合計数が、ホスト上の物理 CPU の数を超える設定が可能になります。ただし、ホスト上で物理的に使用可能なコア数よりも多くのコアを仮想マシンで同時に実行すると、パフォーマンスが低下する可能性があります。
最高のパフォーマンスを得るには、各仮想マシンで目的のワークロードを実行するのに必要な数の仮想 CPU だけを仮想マシンに割り当てます。
仮想 CPU のオーバーコミットに関する推奨事項を以下に示します。
- 最高のパフォーマンスを得るために、仮想マシンのワークロードに必要な最小限の仮想 CPU を割り当てます。
- 詳細なテストを行わずに実稼働環境で仮想 CPU をオーバーコミットすることは避けてください。
- 仮想 CPU をオーバーコミットする場合、負荷が 100% 未満のときは、通常、仮想 CPU と物理 CPU の比率を 5 対 1 にするのが安全です。
- 物理プロセッサーコアごとに合計 10 個を超える仮想 CPU を割り当てることは推奨されません。
- 高負荷時のパフォーマンス低下を防ぐために CPU 使用率を監視します。
オーバーコミットされた環境では、メモリーを 100% 使用するアプリケーションや処理リソースが不安定になる可能性があります。CPU のオーバーコミット率はワークロードに依存するため、詳細なテストを行わずに実稼働環境でメモリーや CPU をオーバーコミットしないでください。
17.6.2. コマンドラインを使用した仮想 CPU の追加と削除
仮想マシンの CPU パフォーマンスを増減するには、仮想マシンに割り当てられた仮想 CPU (vCPU) を追加または削除します。
実行中の仮想マシンで実行する場合、これは vCPU ホットプラグおよびホットアンプラグとも呼ばれます。ただし、RHEL 8 では vCPU のホットアンプラグに対応しておらず、Red Hat ではその使用を強く推奨していません。
前提条件
オプション: ターゲット仮想マシン内の vCPU の現在の状態を表示します。たとえば、仮想マシン testguest 上の vCPU の数を表示するには、以下を実行します。
# virsh vcpucount testguest maximum config 4 maximum live 2 current config 2 current live 1
この出力は、testguest が現在 1 vCPU を使用していることを示し、1 つ以上の vCPU をホットプラグして仮想マシンのパフォーマンスを向上できることを示しています。ただし、再起動後に使用される vCPU の testguest 数は 2 に変更され、2 以上の vCPU のホットプラグが可能になります。
手順
仮想マシンに割り当てることができる vCPU の最大数を調整します。これは、仮想マシンの次回起動時に有効になります。
たとえば、仮想マシン testguest の vCPU の最大数を 8 に増やすには、次のコマンドを実行します。
# virsh setvcpus testguest 8 --maximum --config
最大値は、CPU トポロジー、ホストハードウェア、ハイパーバイザー、およびその他の要素によって制限される可能性があることに注意してください。
仮想マシンに割り当てられている現在の vCPU の数を、前の手順で設定した最大値まで調整します。以下に例を示します。
実行中の仮想マシン testguest にアタッチされている vCPU を 4 に増やすには、以下を実行します。
# virsh setvcpus testguest 4 --live
これにより、仮想マシンの次回の起動まで、仮想マシンのパフォーマンスおよび testguest のホスト負荷のフットプリントが高まります。
testguest 仮想マシンにアタッチされている vCPU の数を永続的に 1 に減らすには、次のコマンドを実行します。
# virsh setvcpus testguest 1 --config
これにより、仮想マシンの次回の起動後に、仮想マシンのパフォーマンスおよび testguest のホスト負荷のフットプリントが低下します。ただし、必要に応じて、仮想マシンに追加の vCPU をホットプラグして、一時的にパフォーマンスを向上させることができます。
検証
仮想マシンの vCPU の現在の状態に変更が反映されていることを確認します。
# virsh vcpucount testguest maximum config 8 maximum live 4 current config 1 current live 4
17.6.3. Web コンソールを使用した仮想 CPU の管理
RHEL 9 Web コンソールを使用して、Web コンソールが接続している仮想マシンが使用する仮想 CPU を確認し、設定できます。
前提条件
- RHEL 8 Web コンソールがインストールされている。
- cockpit サービスが有効になっている。
ユーザーアカウントが Web コンソールにログインできる。
手順は、Web コンソールのインストールおよび有効化 を参照してください。
- Web コンソールの仮想マシンプラグインが システムにインストールされている。
手順
RHEL 8 Web コンソールにログインします。
詳細は、Web コンソールへのログイン を参照してください。
新しいページが開き、選択した仮想マシンに関する基本情報を含む Overview セクションと、仮想マシンのグラフィカルインターフェイスにアクセスするための Console セクションが表示されます。
概要ペインで、vCPU の数の横にある
をクリックします。vCPU の詳細ダイアログが表示されます。
選択した仮想マシンの仮想 CPU を設定します。
vCPU 数: 現在使用中の vCPU の数
注記vCPU 数は、vCPU 最大値以下にする必要があります。
- vCPU 最大値 - 仮想マシンに設定できる仮想 CPU の最大数を入力します。この値が vCPU 数 よりも大きい場合には、vCPU を追加で仮想マシンに割り当てることができます。
- ソケット - 仮想マシンに公開するソケットの数を選択します。
- ソケットごとのコア - 仮想マシンに公開する各ソケットのコア数を選択します。
コアあたりのスレッド - 仮想マシンに公開する各コアのスレッド数を選択します。
Sockets、Cores per socket、および Threads per core オプションは、仮想マシンの CPU トポロジーを調整することに注意してください。これは、vCPU のパフォーマンスにメリットがあり、ゲスト OS の特定のソフトウェアの機能に影響を与える可能性があります。デプロイメントで別の設定が必要ない場合は、デフォルト値のままにします。
仮想マシンに仮想 CPU が設定されます。
注記仮想 CPU 設定の変更は、仮想マシンの再起動後にのみ有効になります。
17.6.4. 仮想マシンでの NUMA の設定
以下の方法は、RHEL 8 ホストで、仮想マシンの Non-Uniform Memory Access (NUMA) 設定の設定に使用できます。
使いやすさのため、自動化ユーティリティーとサービスを使用して、仮想マシンの NUMA を設定できます。ただし、手動で NUMA を設定すると、パフォーマンスが大幅に向上する可能性が高くなります。
前提条件
ホストが NUMA 対応のマシンである。これを確認するには、
virsh nodeinfo
コマンドを使用して、NUMA cell(2)
の行を確認します。# virsh nodeinfo CPU model: x86_64 CPU(s): 48 CPU frequency: 1200 MHz CPU socket(s): 1 Core(s) per socket: 12 Thread(s) per core: 2 NUMA cell(s): 2 Memory size: 67012964 KiB
行の値が 2 以上であると、そのホストは NUMA に対応しています。
オプション: ホストに
numactl
パッケージがインストールされている。# yum install numactl
手順
自動方式
仮想マシンの NUMA ポリシーを
Preferred
に設定します。たとえば、testguest5 仮想マシンを設定するには、次のコマンドを実行します。# virt-xml testguest5 --edit --vcpus placement=auto # virt-xml testguest5 --edit --numatune mode=preferred
numad
サービスを使用して、メモリーリソースに合わせて仮想マシン CPU を自動的に調整します。# echo 1 > /proc/sys/kernel/numa_balancing
umad
サービスを起動して、メモリーリソースで仮想マシンの CPU を自動的に調整します。# systemctl start numad
手動方式
NUMA 設定を手動で調整する場合は、特定の仮想マシンにどのホスト NUMA ノードを割り当てるかを指定できます。これにより、仮想マシンの vCPU によるホストメモリーの使用率が向上します。
オプション:
numactl
コマンドを使用して、ホスト上の NUMA トポロジーを表示します。# numactl --hardware available: 2 nodes (0-1) node 0 size: 18156 MB node 0 free: 9053 MB node 1 size: 18180 MB node 1 free: 6853 MB node distances: node 0 1 0: 10 20 1: 20 10
仮想マシンの XML 設定を編集して、特定の NUMA ノードに CPU およびメモリーリソースを割り当てます。たとえば、次の設定では、testguest6 が NUMA ノード
0
の仮想 CPU 0 - 7 と NUMA ノード1
の仮想 CPU 8 - 15 を使用するように指定します。両方のノードに 16 GiB の仮想マシンメモリーも割り当てます。# virsh edit <testguest6> <domain type='kvm'> <name>testguest6</name> ... <vcpu placement='static'>16</vcpu> ... <cpu ...> <numa> <cell id='0' cpus='0-7' memory='16' unit='GiB'/> <cell id='1' cpus='8-15' memory='16' unit='GiB'/> </numa> ... </domain>
- 仮想マシンが実行中の場合は、再起動して設定を適用します。
最高のパフォーマンス結果を得るために、ホスト上の各 NUMA ノードの最大メモリーサイズに従うことを推奨します。
関連情報
- 特定のワークロードに合わせた仮想マシンのパフォーマンスの最適化
-
numastat
ユーティリティーを使用した 特定のワークロードに合わせた仮想マシンのパフォーマンスの最適化
17.6.5. 仮想 CPU ピニングの設定
仮想マシン (VM) の CPU パフォーマンスを向上させるために、ホスト上の特定の物理 CPU スレッドに仮想 CPU (vCPU) をピニングすることができます。これにより、仮想 CPU に専用の物理 CPU スレッドが確保され、仮想 CPU のパフォーマンスが大幅に向上します。
CPU パフォーマンスをさらに最適化するために、指定の仮想マシンに関連付けられた QEMU プロセススレッドを、特定のホスト CPU にピニングすることもできます。
手順
ホストの CPU トポロジーを確認します。
# lscpu -p=node,cpu Node,CPU 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7
この例では、NUMA ノードとホスト上の使用可能な物理 CPU スレッドが出力に含まれています。
仮想マシン内の仮想 CPU スレッドの数を確認します。
# lscpu -p=node,cpu Node,CPU 0,0 0,1 0,2 0,3
この例では、NUMA ノードと仮想マシン内の使用可能な仮想 CPU スレッドが出力に含まれています。
仮想マシンの特定の仮想 CPU スレッドを、特定のホスト CPU または CPU の範囲にピニングします。これは、仮想 CPU のパフォーマンスを向上させる安全な方法として推奨されます。
たとえば、次のコマンドは、testguest6 仮想マシンの仮想 CPU スレッド 0 - 3 を、それぞれホスト CPU 1、3、5、7 にピニングします。
# virsh vcpupin testguest6 0 1 # virsh vcpupin testguest6 1 3 # virsh vcpupin testguest6 2 5 # virsh vcpupin testguest6 3 7
オプション: 仮想 CPU スレッドが CPU に正常にピニングされているかどうかを確認します。
# virsh vcpupin testguest6 VCPU CPU Affinity ---------------------- 0 1 1 3 2 5 3 7
vCPU スレッドのピニング後に、指定の仮想マシンに関連付けられた QEMU プロセススレッドを、特定ホスト CPU、またはある範囲の CPU に固定することもできます。これにより、QEMU プロセスが物理 CPU 上でより効率的に実行されるようになります。
たとえば、次のコマンドは、testguest6 の QEMU プロセススレッドを CPU 2 および 4 にピニングし、これが成功したことを確認します。
# virsh emulatorpin testguest6 2,4 # virsh emulatorpin testguest6 emulator: CPU Affinity ---------------------------------- *: 2,4
17.6.6. 仮想 CPU キャッピングの設定
仮想 CPU (vCPU) キャッピングを使用すると、仮想マシン (VM) が使用できる CPU リソースの量を制限できます。1 台の仮想マシンによるホストの CPU リソースの過剰な使用を防ぎ、ハイパーバイザーによる CPU スケジューリングの管理を容易にすることで、全体的なパフォーマンスを向上させることができます。
手順
ホストの現在の仮想 CPU スケジューリング設定を表示します。
# virsh schedinfo <vm_name> Scheduler : posix cpu_shares : 0 vcpu_period : 0 vcpu_quota : 0 emulator_period: 0 emulator_quota : 0 global_period : 0 global_quota : 0 iothread_period: 0 iothread_quota : 0
仮想マシンの絶対的な仮想 CPU キャップを設定するには、
vcpu_period
およびvcpu_quota
パラメーターを設定します。どちらのパラメーターも、マイクロ秒単位の時間の長さを表す数値を使用します。virsh schedinfo
コマンドを使用してvcpu_period
パラメーターを設定します。以下に例を示します。# virsh schedinfo <vm_name> --set vcpu_period=100000
この例では、
vcpu_period
は 100,000 マイクロ秒に設定されています。これは、スケジューラーがこの時間間隔中に仮想 CPU キャッピングを適用することを意味します。--live --config
オプションを使用して、実行中の仮想マシンを再起動せずに設定することもできます。virsh schedinfo
コマンドを使用してvcpu_quota
パラメーターを設定します。以下に例を示します。# virsh schedinfo <vm_name> --set vcpu_quota=50000
この例では、
vcpu_quota
は 50,000 マイクロ秒に設定されています。これは、vcpu_period
時間間隔中に仮想マシンが使用できる CPU 時間の最大量を指定します。この場合、vcpu_quota
はvcpu_period
の半分に設定されているため、仮想マシンはその間隔中に CPU 時間の最大 50% を使用できます。--live --config
オプションを使用して、実行中の仮想マシンを再起動せずに設定することもできます。
検証
仮想 CPU スケジューリングのパラメーターの値が正しいことを確認します。
# virsh schedinfo <vm_name> Scheduler : posix cpu_shares : 2048 vcpu_period : 100000 vcpu_quota : 50000 ...
17.6.7. CPU 重みの調整
CPU 重み (または CPU シェア) 設定は、実行中の他の仮想マシンと比較して、仮想マシン (VM) が受け取る CPU 時間を制御するものです。特定の仮想マシンの CPU 重み を増やすことで、この仮想マシンが他の仮想マシンよりも多くの CPU 時間を確保できるようになります。複数の仮想マシン間で CPU 時間の割り当ての優先度を設定するには、cpu_shares
パラメーターを設定します。
指定可能な CPU 重み値の範囲は 0 から 262144 です。新しい KVM 仮想マシンのデフォルト値は 1024 です。
手順
仮想マシンの現在の CPU 重み を確認します。
# virsh schedinfo <vm_name> Scheduler : posix cpu_shares : 1024 vcpu_period : 0 vcpu_quota : 0 emulator_period: 0 emulator_quota : 0 global_period : 0 global_quota : 0 iothread_period: 0 iothread_quota : 0
CPU 重み を希望の値に調整します。
# virsh schedinfo <vm_name> --set cpu_shares=2048 Scheduler : posix cpu_shares : 2048 vcpu_period : 0 vcpu_quota : 0 emulator_period: 0 emulator_quota : 0 global_period : 0 global_quota : 0 iothread_period: 0 iothread_quota : 0
この例では、
cpu_shares
は 2048 に設定されています。そのため、他のすべての仮想マシンの値が 1024 に設定されている場合、この仮想マシンには約 2 倍の CPU 時間が割り当てられます。--live --config
オプションを使用して、実行中の仮想マシンを再起動せずに設定することもできます。
17.6.8. カーネルの同一ページマージを無効にする
Kernel Same-Page Merging (KSM) は、仮想マシン (VM) 間で同一のメモリーページを共有することにより、メモリー密度を向上させます。
ただし、KSM を使用すると CPU 使用率が増加し、ワークロードによっては全体的なパフォーマンスに悪影響を与える可能性があります。
RHEL 8 では、KSM はデフォルトで有効になっています。したがって、仮想マシンデプロイメントにおける CPU パフォーマンスが最適でない場合は、KSM を無効にすることで改善できます。
前提条件
- ホストシステムへのルートアクセス。
手順
- ホスト上の仮想マシンのパフォーマンスとリソース消費を監視して、KSM を有効にすることによる利点を評価します。具体的には、KSM による CPU 使用率の増加によってメモリーの改善が相殺されないこと、および別のパフォーマンスの問題が発生しないことを確認します。レイテンシーの影響を受けやすいワークロードでは、NUMA 間のページマージにも注意してください。
オプション: KSM によって仮想マシンのパフォーマンスが向上しない場合は、無効にします。
KSM を単一セッションの間だけ無効にするには、
systemctl
ユーティリティーを使用してksm
およびksmtuned
サービスを停止します。# systemctl stop ksm # systemctl stop ksmtuned
KSM を永続的に無効にするには、
systemctl
ユーティリティーを使用してksm
およびksmtuned
サービスを無効にします。# systemctl disable ksm Removed /etc/systemd/system/multi-user.target.wants/ksm.service. # systemctl disable ksmtuned Removed /etc/systemd/system/multi-user.target.wants/ksmtuned.service.
注記KSM を無効にする前に仮想マシン間で共有されていたメモリーページは、そのまま共有されます。共有を停止するには、以下のコマンドを使用して、システムの
PageKSM
ページをすべて削除します。# echo 2 > /sys/kernel/mm/ksm/run
ただし、このコマンドはメモリー使用量を増加させ、ホストまたは仮想マシンでパフォーマンスの問題を引き起こす可能性があります。
検証
- ホスト上の仮想マシンのパフォーマンスとリソース消費を監視して、KSM を有効にすることによる利点を評価します。手順については、仮想マシンのパフォーマンス監視ツールを 参照してください。