手当たり次第に書くんだ

飽きっぽいのは本能

VM パフォーマンス Day1: VM の性能ボトルネックとは何か

はじめに

近年、KVM や VMware、Hyper-V などのハイパーバイザーを利用した仮想化基盤は、開発環境から商用サービスまで幅広く利用されています。しかし、仮想化レイヤが介在する以上、VM は物理サーバーと同等の性能をそのまま発揮できるわけではありません。

本シリーズでは、「VM の性能を限界まで引き上げるには、どのレイヤをどのように最適化すべきか」 を KVM をベースに体系的に解説していきます。

Day1 となる本記事では、まず VM がなぜ性能低下を起こすのか という前提を整理します。この理解があることで、後続の最適化の意味が明確になります。

VM の性能ボトルネックとは何か

仮想マシンは、物理サーバーの CPU・メモリ・ストレージ・ネットワークといったリソースを共有して動作します。しかし、仮想化によって追加されるレイヤがあるため、物理環境にはないさまざまなオーバーヘッドが必ず発生します。

性能低下の要因は、大きく次の 4 つに分類できます。

CPU オーバーヘッド

CPU は VM の最も基本的なリソースであり、ここにボトルネックが生じるとあらゆる処理が遅くなります。

仮想化では、以下のような追加処理が入ります。

  • vCPU → pCPU の割り当てはハイパーバイザーが行う
  • スケジューリング待ちが発生する
  • vCPU が複数の物理 CPU を跨ぐとキャッシュ効率が低下する
  • QEMU がエミュレーション処理を担当する部分がある
  • NUMA ノード間を跨ぐ場合はさらに遅延が増える

また、vCPU 数を pCPU より多くする「CPU オーバーコミット」は、高負荷時にレイテンシとスループットを大きく損ないます。

CPU は VM の性能の土台であるため、後述する CPU ピニングや NUMA 設計が極めて重要になります。

メモリアクセスのオーバーヘッド

仮想化環境では、ゲスト OS とホスト OS の両方でページテーブルを持つため、メモリアクセスは物理環境よりも複雑になります。

主なボトルネックは次のとおりです。

  • ページテーブルの二重化(EPT / RVI)
  • TLB ミスの増加
  • ページウォークの回数増加
  • HugePages 未使用による細かなページ管理コスト
  • NUMA ノードを跨ぐメモリアクセスによる帯域低下

特に、NUMA ノードを間違えて配置した VM は、CPU が速くてもメモリ性能が足を引っ張り、全体の性能が低下します。

ストレージ I/O のオーバーヘッド

ストレージは仮想化によって最も影響を受けやすい領域です。仮想ディスクへのアクセスは、一般的に以下のような経路を辿ります。

VM → virtio-blk / virtio-scsi → QEMU → ホストの I/O スタック → NVMe / SSD

この多段構造により、次のような負荷が生じます。

  • virtio キュー処理のオーバーヘッド
  • qcow2 の COW(Copy-on-Write)による遅延
  • ホスト側キャッシュとの整合
  • IOMMU のアドレス変換による遅延

性能重視の環境では、NVMe パススルーraw イメージ の利用が効果的になります。

ネットワーク I/O のオーバーヘッド

ネットワークも同様に、仮想化層を通過することでレイテンシが増加します。virtio-net を使用する一般的な経路は以下のとおりです。

VM → virtio-net → vhost-net → Linux kernel → OVS / bridge → NIC

この経路には、

  • カーネルのネットワークスタック
  • 割り込み処理(softirq)
  • virtqueue のキュー処理
  • OVS の packet classification

など、多くのコストが含まれます。そのため、性能が必要な環境では、

  • SR-IOV(物理に近いパス)
  • DPDK(カーネルを完全に迂回)
  • vhost-user(UNIX ソケット経由で最短経路化)

といった技術が導入されます。

まとめ

これらの要因を整理すると、VM の性能低下の本質は次の一言でまとめられます。

仮想化によって追加されるレイヤが、CPU・メモリ・I/O に余計なコストを生じさせる。

したがって、「どのレイヤをどれだけ短縮できるか」が最適化の中心になります。

次回以降の記事では、このボトルネックに対して具体的にどの技術を使い、どのように最適化すればよいかを順に解説していきます。

次回(Day2)は CPU 最適化を扱います。

VM パフォーマンス Day1: VM の性能ボトルネックとは何か

コメントを残す

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

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

トップへ戻る