手当たり次第に書くんだ

飽きっぽいのは本能

VM パフォーマンス Day2 – CPU 最適化と NUMA / CPU ピニングの考え方

VM の CPU 最適化は、vCPU 数を増やすことではありません。重要なのは、vCPU がどの物理 CPU で実行され、どの NUMA ノードのメモリを使い、QEMU の emulator thread や IRQ がどこで処理されるかです。

CPU 性能が不安定な VM では、CPU が不足しているのではなく、スケジューリング待ち、NUMA 越え、キャッシュミス、割り込み処理の分散、CPU オーバーコミットが原因になっていることがあります。

Day2 では、CPU ピニング、NUMA、emulatorpin、IRQ、CPU オーバーコミットを、単なるチューニングではなく VM の配置設計として整理します。

CPU 最適化で見るべきもの

VM の CPU は、ゲスト OS から見ると自分専用の CPU に見えます。しかし実際には、vCPU はハイパーバイザーによって物理 CPU 上にスケジュールされます。この対応関係が安定しないと、レイテンシやスループットが揺れます。

観点見る内容問題が出る例
vCPU と pCPUvCPU がどの物理 CPU で実行されるか高負荷時に vCPU が実行待ちになる
CPU ピニングvCPU を特定 CPU に固定するかキャッシュが毎回捨てられ性能が揺れる
NUMACPU とメモリが同じ NUMA ノードにあるかCPU は速いがメモリアクセスが遅い
emulatorpinQEMU の補助スレッドをどこで動かすかI/O 処理だけ別 NUMA へ飛ぶ
IRQ割り込み処理がどの CPU で処理されるかvCPU と IRQ が離れてレイテンシが増える

CPU ピニングは専用化の設計である

CPU ピニングは、vCPU を特定の物理 CPU に固定する設定です。これにより、ハイパーバイザーのスケジューラが vCPU をあちこちの CPU に移動させることを抑え、実行場所を安定させます。

CPU ピニングの主な効果は、CPU 使用率を下げることではありません。実行待ち、キャッシュ再構築、NUMA 越え、レイテンシの揺れを減らすことです。

  • vCPU の実行場所を固定する
  • CPU キャッシュの再利用性を高める
  • スケジューリングによる揺れを減らす
  • 高負荷時のレイテンシを安定させる
  • 性能測定時の再現性を高める

ただし、CPU ピニングは万能ではありません。ピニングした CPU を他の VM やホスト処理と取り合っていれば効果は落ちます。また、CPU だけ固定してもメモリ、IRQ、emulator thread が別 NUMA に散っていれば、期待した性能にはなりません。

CPU オーバーコミットをどう扱うか

CPU オーバーコミットは、物理 CPU 数より多くの vCPU を VM に割り当てる設計です。一般的なサーバー統合では有効ですが、性能を安定させたい VM では慎重に扱う必要があります。

オーバーコミットが問題になるのは、平均使用率が高いときではなく、複数 VM が同時に CPU を必要としたときです。このとき vCPU は物理 CPU に乗るまで待たされ、レイテンシが増えます。

  • 低負荷 VM が多い環境ではオーバーコミットは有効
  • 高性能 VM や低遅延 VM では専有に近い設計が必要
  • 性能保証したい VM と一般 VM を同じ CPU プールに混ぜない
  • 平均 CPU 使用率だけでなく、実行待ちやレイテンシを見る

NUMA を跨ぐと CPU が速くても遅くなる

NUMA は、CPU ソケットとメモリが近い組み合わせを持つ構造です。CPU が同じ NUMA ノード上のメモリへアクセスする場合は速く、別 NUMA ノードのメモリへアクセスする場合は遅くなります。

VM では、vCPU をある NUMA ノードに固定しても、メモリが別 NUMA ノードに確保されると性能が崩れます。特に高性能 VM では、CPU とメモリの配置をセットで考える必要があります。

  • vCPU を同じ NUMA ノード内の CPU に配置する
  • VM メモリも同じ NUMA ノードへ寄せる
  • HugePages の予約も NUMA ノード単位で考える
  • SR-IOV や NVMe passthrough は PCIe デバイスの NUMA も確認する
  • NUMA を跨ぐ VM は、CPU 数が多くても性能が安定しにくい

emulatorpin と IRQ を無視しない

KVM / QEMU の VM では、vCPU 以外にも処理を担うスレッドがあります。代表的なのが emulator thread です。I/O やデバイスエミュレーションに関わる処理が、vCPU と離れた CPU や NUMA ノードで動くと、I/O レイテンシが悪化することがあります。

また、NIC やストレージの割り込み処理がどの CPU で処理されるかも重要です。vCPU、emulator thread、IRQ、メモリ、PCIe デバイスの NUMA をそろえることで、処理経路が短くなります。

対象配置の考え方
vCPUVM が実行する CPU に固定する
emulatorpin対象 VM の vCPU と近い CPU に寄せる
IRQI/O を処理する CPU と VM の配置を合わせる
メモリvCPU と同じ NUMA ノードに寄せる
PCIe デバイスSR-IOV / NVMe の接続 NUMA を確認する

CPU 最適化は運用制約を生む

CPU ピニングや NUMA 固定は、性能を安定させる一方で、VM の配置自由度を下げます。これは単なるチューニングではなく、VM の運用条件を変える設定です。

  • VM を別ホストへ移すと同じ CPU 配置を再現できない場合がある
  • ホスト上の CPU を専有するため集約率が下がる
  • HugePages や SR-IOV と組み合わせると移動性がさらに下がる
  • メンテナンス時に配置計画を考える必要がある
  • 性能保証 VM と一般 VM を分けた運用設計が必要になる

CPU 最適化を入れるなら、その VM は通常の汎用 VM とは別のサービスとして扱うべきです。性能を保証する代わりに、配置、移動、復旧、監視の前提が変わります。

設計時の確認ポイント

CPU 最適化を行う前に、次の観点を確認すると整理しやすくなります。

  • その VM は本当に低遅延や高性能が必要か
  • vCPU 数は物理 CPU と NUMA ノードに収まっているか
  • CPU ピニング対象の CPU は他用途と競合していないか
  • メモリと HugePages は同じ NUMA ノードに確保されているか
  • emulatorpin と IRQ の配置を確認しているか
  • 性能改善と引き換えに失う移動性を許容できるか

まとめ

VM の CPU 最適化は、vCPU 数を増やすことではなく、vCPU、pCPU、NUMA、メモリ、emulator thread、IRQ を一貫した配置にすることです。

CPU ピニングは強力ですが、単体で完結する技術ではありません。NUMA 配置、HugePages、I/O デバイス、割り込み処理と合わせて考えなければ、期待した性能は出ません。

また、CPU 最適化は運用制約を生みます。性能を安定させる VM は、通常の汎用 VM とは違うサービス定義になると考えるべきです。Day3 では、この CPU 配置と密接に関係するメモリ最適化と HugePages を整理します。

参考
書籍
参考書籍

作って理解する仮想化技術 ── ハイパーバイザを実装しながら仕組みを学ぶ

ハイパーバイザ、CPU 仮想化支援、メモリ仮想化、割り込み、仮想デバイスなど、VM の性能設計を低レイヤから理解したい場合の参考書籍です。価格や在庫はリンク先で確認してください。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

VM パフォーマンスシリーズ

関連記事

VM パフォーマンス Day2 – CPU 最適化と NUMA / CPU ピニングの考え方

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る