18.7. 仮想マシンの CPU パフォーマンスの最適化
vCPU は、ホストマシンの物理 CPU と同様、仮想マシンのパフォーマンスにおいて極めて重要です。したがって、vCPU を最適化すると、仮想マシンのリソース効率に大きな影響を及ぼす可能性があります。vCPU を最適化するには、以下を実行します。
- 仮想マシンに割り当てられているホスト CPU の数を調整します。これは、CLI または Web コンソール を使用して実行できます。
vCPU モデルが、ホストの CPU モデルに調整されていることを確認します。たとえば、仮想マシン testguest1 を、ホストの CPU モデルを使用するように設定するには、次のコマンドを実行します。
virt-xml testguest1 --edit --cpu host-model
# virt-xml testguest1 --edit --cpu host-modelCopy to Clipboard Copied! Toggle word wrap Toggle overflow ARM 64 システムでは、
--cpu host-passthroughを使用します。- Kernel Same-Page Merging (KSM) を管理します。
ホストマシンが Non-Uniform Memory Access (NUMA) を使用する場合は、その仮想マシンに対して NUMA を設定 することもできます。これにより、ホストの CPU およびメモリープロセスが、仮想マシンの CPU およびメモリープロセスにできるだけ近くにマッピングされます。事実上、NUMA チューニングにより、仮想マシンに割り当てられたシステムメモリーへのより効率的なアクセスが可能になります。これにより、vCPU 処理の効果が改善されます。
詳細は Configuring NUMA in a virtual machine and Virtual machine performance optimization for specific workloads を参照してください。
18.7.1. vCPU のオーバーコミットメント リンクのコピーリンクがクリップボードにコピーされました!
vCPU のオーバーコミットを使用すると、ホスト上で実行されている仮想マシン(VM)のすべての vCPU の合計が、ホスト上の物理 CPU の数を超えるセットアップを作成できます。ただし、仮想マシンで物理的に使用可能なコアよりも多くのコアを同時に実行すると、パフォーマンスの低下が発生する可能性があります。
最適なパフォーマンスを得るには、各仮想マシンで目的のワークロードを実行するために必要な数の vCPU しかない仮想マシンを割り当てます。
vCPU のオーバーコミットの推奨事項:
- 最適なパフォーマンスを得るには、仮想マシンのワークロードに必要な最小限の vCPU を割り当てます。
- 広範なテストを行わずに、本番環境で vCPU をオーバーコミットしないでください。
- vCPU を上書きする場合、安全な比率は、100% 未満の負荷のために 5 つの vCPU から 1 つの物理 CPU です。
- 物理プロセッサーコアごとに、割り当てた仮想 CPU の合計が 10 を超えることは推奨されません。
- CPU 使用率を監視して、負荷が大きい場合のパフォーマンスの低下を防ぎます。
オーバーコミットされた環境では、メモリーを 100% 使用するアプリケーションや処理リソースが不安定になる可能性があります。CPU のオーバーコミット率はワークロードに依存するため、詳細なテストを行わずに実稼働環境でメモリーまたは CPU をオーバーコミットしないでください。
18.7.2. コマンドラインを使用した仮想 CPU の追加と削除 リンクのコピーリンクがクリップボードにコピーされました!
仮想マシンの CPU パフォーマンスを増減するには、仮想マシンに割り当てられた仮想 CPU (vCPU) を追加または削除します。
実行中の仮想マシンで実行する場合、これは vCPU ホットプラグおよびホットアンプラグとも呼ばれます。ただし、RHEL 9 では vCPU のホットアンプラグに対応しておらず、Red Hat ではその使用を強く推奨していません。
前提条件
オプション: ターゲット仮想マシン内の vCPU の現在の状態を表示します。たとえば、仮想マシン testguest 上の vCPU の数を表示するには、以下を実行します。
virsh vcpucount testguest
# virsh vcpucount testguest maximum config 4 maximum live 2 current config 2 current live 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow この出力は、testguest が現在 1 vCPU を使用していることを示し、1 つ以上の vCPU をホットプラグして仮想マシンのパフォーマンスを向上できることを示しています。ただし、再起動後に使用される vCPU の testguest 数は 2 に変更され、2 以上の vCPU のホットプラグが可能になります。
手順
仮想マシンに割り当てることができる vCPU の最大数を調整します。これは、仮想マシンの次回起動時に有効になります。
たとえば、仮想マシン testguest の vCPU の最大数を 8 に増やすには、次のコマンドを実行します。
virsh setvcpus testguest 8 --maximum --config
# virsh setvcpus testguest 8 --maximum --configCopy to Clipboard Copied! Toggle word wrap Toggle overflow 最大値は、CPU トポロジー、ホストハードウェア、ハイパーバイザー、およびその他の要素によって制限される可能性があることに注意してください。
仮想マシンに割り当てられている現在の vCPU の数を、前の手順で設定した最大値まで調整します。以下に例を示します。
実行中の仮想マシン testguest にアタッチされている vCPU を 4 に増やすには、以下を実行します。
virsh setvcpus testguest 4 --live
# virsh setvcpus testguest 4 --liveCopy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、仮想マシンの次回の起動まで、仮想マシンのパフォーマンスおよび testguest のホスト負荷のフットプリントが高まります。
testguest 仮想マシンにアタッチされている vCPU の数を永続的に 1 に減らすには、次のコマンドを実行します。
virsh setvcpus testguest 1 --config
# virsh setvcpus testguest 1 --configCopy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、仮想マシンの次回の起動後に、仮想マシンのパフォーマンスおよび testguest のホスト負荷のフットプリントが低下します。ただし、必要に応じて、仮想マシンに追加の vCPU をホットプラグして、一時的にパフォーマンスを向上させることができます。
検証
仮想マシンの vCPU の現在の状態に変更が反映されていることを確認します。
virsh vcpucount testguest
# virsh vcpucount testguest maximum config 8 maximum live 4 current config 1 current live 4Copy to Clipboard Copied! Toggle word wrap Toggle overflow
18.7.3. Web コンソールを使用した仮想 CPU の管理 リンクのコピーリンクがクリップボードにコピーされました!
RHEL 9 Web コンソールを使用して、Web コンソールが接続している仮想マシンが使用する仮想 CPU を確認し、設定できます。
前提条件
- RHEL 9 Web コンソールがインストールされている。
- cockpit サービスが有効になっている。
ユーザーアカウントが Web コンソールにログインできる。
手順は、Web コンソールのインストールおよび有効化 を参照してください。
- Web コンソールの仮想マシンプラグインが システムにインストールされている。
手順
RHEL 9 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 設定の変更は、仮想マシンの再起動後にのみ有効になります。
18.7.4. 仮想マシンでの NUMA の設定 リンクのコピーリンクがクリップボードにコピーされました!
以下の方法は、RHEL 9 ホストで、仮想マシンの Non-Uniform Memory Access (NUMA) 設定の設定に使用できます。
使いやすさのため、自動化ユーティリティーとサービスを使用して、仮想マシンの NUMA を設定できます。ただし、手動で NUMA を設定すると、パフォーマンスが大幅に向上する可能性が高くなります。
前提条件
ホストが NUMA 対応のマシンである。これを確認するには、
virsh nodeinfoコマンドを使用して、NUMA cell(2)の行を確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 行の値が 2 以上であると、そのホストは NUMA に対応しています。
オプション: ホストにctlctl
パッケージがインストールされている。dnf install numactl
# dnf install numactlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
手順
自動方式
仮想マシンの NUMA ポリシーを
Preferredに設定します。たとえば、仮想マシン testguest5 を設定するには、次のようにします。virt-xml testguest5 --edit --vcpus placement=auto virt-xml testguest5 --edit --numatune mode=preferred
# virt-xml testguest5 --edit --vcpus placement=auto # virt-xml testguest5 --edit --numatune mode=preferredCopy to Clipboard Copied! Toggle word wrap Toggle overflow numadサービスを使用して、メモリーリソースで仮想マシンの CPU を自動的に調整します。echo 1 > /proc/sys/kernel/numa_balancing
# echo 1 > /proc/sys/kernel/numa_balancingCopy to Clipboard Copied! Toggle word wrap Toggle overflow umadサービスを起動して、メモリーリソースで仮想マシンの CPU を自動的に調整します。systemctl start numad
# systemctl start numadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
手動方式
NUMA 設定を手動で調整するには、特定の仮想マシンに対して特別に割り当てるホスト NUMA ノードを指定します。これにより、仮想マシンの vCPU によるホストメモリーの使用率が向上します。
必要に 応じ て、
numactlコマンドを使用して、ホストの NUMA トポロジーを表示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 仮想マシンの XML 設定を編集して、特定の NUMA ノードに CPU およびメモリーリソースを割り当てます。たとえば、以下の設定では、NUMA ノード 0 で vCPU
0-7 を使用し、NUMA ノード1で vCPUS 8-15 を使用するように testguest6 を設定します。両方のノードには、16 GiB の仮想マシンメモリーも割り当てられます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 仮想マシンが実行中の場合は、再起動して設定を適用します。
最適なパフォーマンス結果を得るには、ホスト上の各 NUMA ノードの最大メモリーサイズを考慮することが推奨されます。
18.7.5. 仮想 CPU ピニングの設定 リンクのコピーリンクがクリップボードにコピーされました!
仮想マシンの CPU パフォーマンスを向上させるために、仮想 CPU (vCPU)をホストの特定の物理 CPU スレッドに固定できます。これにより、vCPU に専用の物理 CPU スレッドが含まれるようにするため、vCPU のパフォーマンスが大幅に向上します。
CPU パフォーマンスをさらに最適化するには、指定した仮想マシンに関連付けられている QEMU プロセススレッドを、特定のホスト CPU に固定することもできます。
手順
ホストの CPU トポロジーを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、出力には NUMA ノードと、ホスト上で利用可能な物理 CPU スレッドが含まれます。
仮想マシン内の vCPU スレッドの数を確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、出力には NUMA ノードと利用可能な vCPU スレッドが仮想マシン内に含まれます。
仮想マシンから、特定ホストの CPU、またはある範囲の CPU に特定の vCPU スレッドをピニングします。これは、vCPU のパフォーマンスを向上させる安全な方法として推奨されます。
たとえば、次のコマンドでは、仮想マシン testguest6 の vCPU スレッドの 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
# virsh vcpupin testguest6 0 1 # virsh vcpupin testguest6 1 3 # virsh vcpupin testguest6 2 5 # virsh vcpupin testguest6 3 7Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション:vCPU スレッドが CPU に正常にピニングされているかどうかを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow vCPU スレッドのピニング後に、指定の仮想マシンに関連付けられた QEMU プロセススレッドを、特定ホスト CPU、またはある範囲の CPU に固定することもできます。これは、QEMU プロセスが物理 CPU でより効率的に実行されるのに役立ちます。
たとえば、以下のコマンドは、testguest6 の QEMU プロセススレッドを CPU 2 および 4 にピニングし、これが成功したことを確認します。
virsh emulatorpin testguest6 2,4 virsh emulatorpin testguest6
# virsh emulatorpin testguest6 2,4 # virsh emulatorpin testguest6 emulator: CPU Affinity ---------------------------------- *: 2,4Copy to Clipboard Copied! Toggle word wrap Toggle overflow
18.7.6. 仮想 CPU キャッピングの設定 リンクのコピーリンクがクリップボードにコピーされました!
仮想 CPU (vCPU)上限を使用して、仮想マシン(VM)が使用できる CPU リソースの量を制限できます。vCPU 上限により、1 台の VM によるホストの CPU リソースを過剰に使用しなくなり、ハイパーバイザーによる CPU スケジューリングを容易に管理できるため、全体的なパフォーマンスを向上させることができます。
手順
ホストで現在の vCPU スケジューリング設定を表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 仮想マシンに絶対 vCPU 上限を設定するには、
vcpu_periodパラメーターおよびvcpu_quotaパラメーターを設定します。どちらのパラメーターも、マイクロ秒単位で期間を表す数値を使用します。virsh schedinfoコマンドを使用して、vcpu_periodパラメーターを設定します。以下に例を示します。virsh schedinfo <vm_name> --set vcpu_period=100000
# virsh schedinfo <vm_name> --set vcpu_period=100000Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、
vcpu_periodは 100,000 マイクロ秒に設定されています。これは、スケジューラーがこの時間間隔に vCPU 上限を強制することを意味します。また、the--
live --configオプションを使用して、再起動せずに実行中の仮想マシンを設定することもできます。virsh schedinfoコマンドを使用して、vcpu_quotaパラメーターを設定します。以下に例を示します。virsh schedinfo <vm_name> --set vcpu_quota=50000
# virsh schedinfo <vm_name> --set vcpu_quota=50000Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、
vcpu_quotaは 50,000 マイクロ秒に設定されています。これは、vcpu_periodインターバルに仮想マシンが使用できる最大 CPU 時間を指定します。この場合、vcpu_quotaはvcpu_periodの半分に設定されるため、仮想マシンは、その間に最大 CPU 時間の 50% を使用できます。また、the--
live --configオプションを使用して、再起動せずに実行中の仮想マシンを設定することもできます。
検証
vCPU スケジューリングパラメーターに正しい値があることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
18.7.7. CPU の重みのチューニング リンクのコピーリンクがクリップボードにコピーされました!
CPU の重み (または CPU 共有)設定は、他の実行中の仮想マシンと比較して、仮想マシンが受け取る CPU 時間を制御します。特定の仮想マシンの CPU 重み を増やすことで、この仮想マシンが他の仮想マシンと比較してより多くの CPU 時間になるようにすることができます。複数の仮想マシン間の CPU 時間割り当てを優先するには、cpu_shares パラメーターを設定します
CPU の重みの値の範囲は 0 から 262144、新しい KVM 仮想マシンのデフォルト値は 1024 です。
手順
仮想マシンの現在の CPU ウェイト を確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow CPU の重み を優先値に調整します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、
cpu_sharesは 2048 に設定されています。つまり、他のすべての仮想マシンの値が 1024 に設定されている場合、この仮想マシンは CPU 時間の約 2 倍になります。また、the--
live --configオプションを使用して、再起動せずに実行中の仮想マシンを設定することもできます。
18.7.8. Kernel Same-Page Merging の有効化と無効化 リンクのコピーリンクがクリップボードにコピーされました!
Kernel Same-Page Merging (KSM) は、仮想マシン (VM) 間で同一のメモリーページを共有することにより、メモリー密度を向上させます。したがって、KSM を有効にすると、仮想マシンデプロイメントのメモリー効率が向上する可能性があります。
ただし、KSM を有効にすると、CPU 使用率も増加し、ワークロードによっては全体的なパフォーマンスに悪影響が生じる可能性があります。
RHEL 9 以降では、KSM はデフォルトで無効になっています。KSM を有効にして仮想マシンパフォーマンスへの影響をテストするには、次の手順を参照してください。
前提条件
- ホストシステムへのルートアクセス。
手順
KSM を有効にします。
警告KSM を有効にすると、CPU 使用率が増大し、CPU 全体のパフォーマンスに影響を及ぼします。
ksmtunedサービスをインストールします。{PackageManagerCommand} install ksmtuned# {PackageManagerCommand} install ksmtunedCopy to Clipboard Copied! Toggle word wrap Toggle overflow サービスを起動します。
KSM を単一セッションの間だけ有効にするには、
systemctlユーティリティーを使用してksmおよびksmtunedサービスを開始します。systemctl start ksm systemctl start ksmtuned
# systemctl start ksm # systemctl start ksmtunedCopy to Clipboard Copied! Toggle word wrap Toggle overflow KSM を永続的に有効にするには、
systemctlユーティリティーを使用してksmサービスおよびksmtunedサービスを有効にします。systemctl enable ksm systemctl enable ksmtuned
# systemctl enable ksm Created symlink /etc/systemd/system/multi-user.target.wants/ksm.service/usr/lib/systemd/system/ksm.service # systemctl enable ksmtuned Created symlink /etc/systemd/system/multi-user.target.wants/ksmtuned.service /usr/lib/systemd/system/ksmtuned.service Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- ホスト上の仮想マシンのパフォーマンスとリソース消費を監視して、KSM を有効にすることによる利点を評価します。具体的には、KSM による CPU 使用率の増加によってメモリーの改善が相殺されないこと、および別のパフォーマンスの問題が発生しないことを確認します。レイテンシーの影響を受けやすいワークロードでは、NUMA 間のページマージにも注意してください。
オプション: KSM によって仮想マシンのパフォーマンスが向上しない場合は、無効にします。
KSM を単一セッションの間だけ無効にするには、
systemctlユーティリティーを使用してksmおよびksmtunedサービスを停止します。systemctl stop ksm systemctl stop ksmtuned
# systemctl stop ksm # systemctl stop ksmtunedCopy to Clipboard Copied! Toggle word wrap Toggle overflow KSM を永続的に無効にするには、
systemctlユーティリティーを使用してksmおよびksmtunedサービスを無効にします。systemctl disable ksm systemctl disable 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.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
KSM を無効にする前に仮想マシン間で共有されていたメモリーページは、そのまま共有されます。共有を停止するには、以下のコマンドを使用して、システムの PageKSM ページをすべて削除します。
echo 2 > /sys/kernel/mm/ksm/run
# echo 2 > /sys/kernel/mm/ksm/run
ただし、このコマンドはメモリー使用量を増加させ、ホストまたは仮想マシンでパフォーマンスの問題を引き起こす可能性があります。