はじめに
VM の性能を向上させるうえで、CPU の最適化は最も効果が大きい領域です。CPU はすべての処理の基盤となるため、ここにボトルネックが残っている状態では、ネットワークやストレージを最適化しても十分な効果が得られません。
CPU 最適化の中心となるのは次の 3 点です。
- CPU ピニング(vCPU と pCPU の固定)
- NUMA ノードの整合性
- CPU オーバーコミットの排除
本記事では、この 3 点を軸に、なぜ CPU がボトルネックになりやすいのか、そしてどのように改善できるのかを解説します。
CPU ピニング(CPU Affinity)
CPU ピニングとは、vCPU を特定の pCPU(物理コア)に固定して実行させる手法です。
デフォルトでは、ハイパーバイザーのスケジューラが vCPU を空いている pCPU に動的に割り当てますが、この動的割り当てが性能低下を引き起こします。
CPU ピンニングによって次のような問題を解消できます。
スケジューリング遅延の防止
vCPU がどこで実行されるかが固定されていない場合、ハイパーバイザーは都度スケジューリングを行います。多くの VM が動作している環境では、空き pCPU が無く vCPU が“実行待ち”となることがあります。
CPU ピニングを行うと、「このコアはこの VM の専用」という状態を作れるため、実行待ちが発生しにくくなります。
コンテキストスイッチの削減
vCPU が頻繁に異なる物理コアへ移動すると、以下の理由で性能が低下します。
- CPU キャッシュの内容が捨てられる
- QEMU や割り込みとの整合性が崩れる
CPU ピニングは「キャッシュの再構築」を最小限に抑え、安定したスループットを維持するうえで非常に効果的です。
エミュレーションスレッド(emulatorpin)の最適化
KVM/QEMU では、I/O 処理を行う“エミュレーションスレッド”が存在します。このスレッドが vCPU と離れた NUMA ノードで実行されると、I/O レイテンシが大きく悪化します。
そのため、以下を同じ NUMA ノードに配置することが CPU 最適化の基本となります。
- vCPU
- emulatorpin
- IRQ
- メモリ
CPU オーバーコミットを避ける
CPU オーバーコミットとは、pCPU 数より多くの vCPU を割り当てる運用のことです。
例えば、物理 8 コアのサーバーで VM に合計 16 vCPU を割り当てる場合は 200% のオーバーコミットになります。
一般的なクラウド基盤ではよく使われる手法ですが、性能最適化を目的とするなら、以下のようにデメリットの方が大きくなります。
- vCPU が pCPU の空きを待つ時間が増加
- レイテンシが乱れ、ネットワークやストレージ性能にも波及
- 予測できない性能劣化が発生
特に次のような VM はオーバーコミット禁止が基本です。
- DPDK を使う VM
- NFV / VNF(仮想ルーター、FW、LB)
- 高スループットが必要な VM
- ストレージ(Ceph OSD / Monitor / Metadata Server)
- 性能の揺らぎに敏感なアプリケーション
NUMA 配置の整合性
NUMA(Non-Uniform Memory Access)の構造を理解し、CPU とメモリを同じ NUMA ノードに寄せること はCPU最適化の中でも極めて重要です。
NUMA はハードウェアの構造そのものなので、設計を間違えるとどんな最適化も効果を発揮しません。
NUMA を跨ぐと何が起こるか
例えば、以下の構成になると、メモリアクセスが常に“遠回り”になります。
- vCPU:NUMA ノード 0
- メモリ:NUMA ノード 1
これによって、以下の副作用が起きます。
- メモリアクセスが遅くなる
- キャッシュミスが増える
- ネットワークやストレージ I/O にも遅延が波及する
VM のパフォーマンスを重視する場合、vCPU とメモリを同一 NUMA ノードに配置することは必須です。
PCIe デバイス(SR-IOV / NVMe)の NUMA も重要
SR-IOV の VF や NVMe デバイスは、物理的にどの NUMA ノードに属しているかが決まっています。
たとえば、以下の構成は、明確な性能低下につながります。
- vCPU:NUMA 0
- メモリ:NUMA 0
- NIC(SR-IOV VF):NUMA 1
最適化の基本は、以下のように同じ NUMA ノードに揃えることです。
- vCPU
- メモリ
- NIC / NVMe(パススルー時)
割り込み(IRQ)の最適化
IRQ が異なる NUMA ノードや過負荷の pCPU に割り当てられると、割り込み処理だけで遅延が発生します。
最適化のポイントは次のとおりです。
- IRQ を VM 配置と同じ NUMA ノードへ固定する。
- irqbalance を無効化し、手動割り当てにする
- RSS(Receive Side Scaling)キューと pCPU を対応させる
特にネットワーク性能を重視する VM では、IRQ の最適化は効果が大きくなります。
必要に応じてカーネル設定を調整する
レイテンシ最適化を追求したい場合、ホスト OS 側で CPU の割り込みを抑制する設定も有効です。
isolcpus=nohz_full=rcu_nocbs=
これらは特定の pCPU を「専有 CPU」として扱いやすくし、より安定した vCPU 実行環境を作ります。
まとめ
CPU ピニング、オーバーコミットの排除、NUMA の整合性、IRQ 配置などは、どれも VM の性能最適化において最も重要な要素です。
CPU の最適化が正しく行われた環境は、Day3 以降で取り上げる以下の効果を最大化します。
- メモリ最適化(HugePages)
- ストレージ最適化(NVMe パススルー)
- ネットワーク最適化(SR-IOV, DPDK, vhost-user)

