はじめに
近年、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 に余計なコストを生じさせる。
したがって、「どのレイヤをどれだけ短縮できるか」が最適化の中心になります。
次回以降の記事では、このボトルネックに対して具体的にどの技術を使い、どのように最適化すればよいかを順に解説していきます。

