仮想マシンの性能問題は、単に vCPU やメモリを増やせば解決するものではありません。VM は物理サーバーの上で動きますが、その間にはハイパーバイザー、QEMU / KVM、仮想デバイス、ホスト OS、ストレージ、ネットワークスタックなど複数のレイヤが入ります。
そのため、性能が落ちたときに見るべきなのは「リソースが足りないか」だけではなく、「どのレイヤで待ち、コピー、割り込み、スケジューリング、NUMA 越えが起きているか」です。
本シリーズでは、VM の性能を CPU、メモリ、ストレージ I/O、ネットワーク I/O に分けて整理します。Day1 では、その入口として VM の性能ボトルネックをどう分類するかを確認します。
VM の性能ボトルネックとは何か
VM の性能ボトルネックとは、ゲスト OS が処理を進めたいにもかかわらず、物理リソース、仮想化レイヤ、I/O 経路、または配置制約によって待たされる場所のことです。
物理サーバーでも CPU、メモリ、ストレージ、ネットワークはボトルネックになります。しかし VM では、それに加えて仮想化レイヤ固有の待ちが発生します。たとえば vCPU が物理 CPU に割り当てられるまで待つ、仮想ディスク I/O が QEMU とホスト I/O スタックを通る、仮想 NIC のパケット処理でコピーや割り込みが増える、といったものです。
| 領域 | 主なボトルネック | 後続記事 |
|---|---|---|
| CPU | vCPU スケジューリング、CPU オーバーコミット、CPU ピニング、NUMA 配置 | Day2 |
| メモリ | ページテーブル、TLB ミス、HugePages、NUMA 越え | Day3 |
| ストレージ I/O | virtio、QEMU、キャッシュ、raw / qcow2、io_uring | Day4 |
| ネットワーク I/O | virtio-net、vhost、割り込み、コピー、SR-IOV、DPDK | Day5 以降 |
CPU ボトルネックは vCPU 数だけでは判断できない
VM の CPU 性能を見るとき、最初に vCPU 数を増やしたくなります。しかし、vCPU 数は性能そのものではありません。vCPU は物理 CPU 上でスケジュールされる実行単位であり、物理 CPU に空きがなければ待たされます。
- vCPU が pCPU に割り当てられるまで待つ
- CPU オーバーコミットにより高負荷時の待ちが増える
- vCPU が NUMA ノードをまたぐとメモリアクセスが遅くなる
- QEMU のエミュレーションスレッドが適切な CPU に配置されていない
- CPU ピニングをしても、メモリ配置がずれると効果が落ちる
CPU 最適化は、単にコア数を増やす作業ではありません。vCPU、pCPU、NUMA ノード、emulator thread、割り込み処理の配置をそろえる作業です。
メモリボトルネックは容量不足だけではない
メモリの問題も、単に容量が足りるかどうかだけでは判断できません。VM ではゲスト OS とホスト側のメモリ管理が重なり、ページテーブル、TLB、HugePages、NUMA ローカリティが性能に影響します。
- 小さなページが多いと TLB ミスやページ管理コストが増える
- HugePages を使うとページ管理の粒度を大きくできる
- 1GB HugePages は効果が大きいが、予約や運用制約も大きい
- NUMA をまたぐメモリアクセスは CPU が速くても遅延要因になる
- CPU ピニングとメモリ配置はセットで考える必要がある
特に高性能 VM では、CPU を固定してもメモリが別 NUMA ノードに配置されると、期待した性能にはなりません。CPU とメモリは別々ではなく、同じ物理配置の問題として扱う必要があります。
ストレージ I/O は仮想ディスクの経路を見る
ストレージ I/O は、VM から見ると単なるディスクアクセスに見えます。しかし実際には、ゲスト OS、virtio、QEMU、ホスト OS、ファイルシステム、ストレージデバイスという複数の経路を通ります。
この経路のどこで待ちが発生するかによって、対策は変わります。仮想ディスク形式、キャッシュモード、virtio-blk と virtio-scsi の違い、raw と qcow2 の違い、io_uring、NVMe passthrough などは、すべて I/O 経路をどう短くするか、どこまでホスト側の管理を残すかという設計問題です。
- qcow2 は機能が多いが、性能面では raw より複雑になりやすい
- virtio-blk と virtio-scsi は用途と管理性が異なる
- キャッシュ設定は性能だけでなく障害時の整合性にも関係する
- NVMe passthrough は高速だが、柔軟性と運用性を犠牲にしやすい
ネットワーク I/O は datapath の長さで考える
ネットワーク I/O は、VM パフォーマンスの中でも特にレイヤが多い領域です。ゲスト OS の virtio-net、QEMU、vhost-net、vhost-user、Linux bridge、Open vSwitch、SR-IOV、DPDK など、どの datapath を通るかによって性能特性が大きく変わります。
基本的な考え方は、パケット処理の経路が長いほど、コピー、割り込み、コンテキストスイッチ、キュー処理が増えるということです。一方で、経路を短くするほど、ライブマイグレーション、可観測性、運用自由度、障害切り分けは難しくなります。
| 方式 | 考え方 | 主な制約 |
|---|---|---|
| virtio-net | 標準的な仮想 NIC | QEMU やホスト側処理のオーバーヘッドが残る |
| vhost-net | virtio 処理をカーネル側へ寄せる | 高速化するが kernel datapath の制約を受ける |
| vhost-user | ユーザー空間 dataplane と接続する | DPDK / OVS-DPDK などの設計が必要 |
| SR-IOV | NIC の VF を VM に直接割り当てる | 移動性や柔軟なネットワーク制御が落ちやすい |
| DPDK | カーネルを迂回してユーザー空間で高速処理する | CPU コア専有や運用設計が必要 |
高速化は制約との交換である
VM 性能最適化で重要なのは、高速化の技術を足せばよいという発想ではありません。CPU ピニング、HugePages、SR-IOV、DPDK のような技術は、性能を上げる代わりに、配置制約、移動制約、監視制約、復旧手順の変更を生みます。
つまり、性能チューニングは単なる設定変更ではなく、VM のサービス定義を変える作業です。どの程度の性能が必要で、そのためにどの運用自由度を捨てるのかを決める必要があります。
- CPU ピニングは性能を安定させるが、配置自由度を下げる
- HugePages はメモリ性能を改善するが、予約と移動性に制約が出る
- SR-IOV はネットワーク性能を上げるが、仮想ネットワーク機能を迂回しやすい
- DPDK は高速 dataplane を作れるが、CPU コア専有と運用設計が必要になる
まず見るべき順番
VM の性能問題を調べるときは、いきなり DPDK や SR-IOV のような高度な技術へ進むのではなく、まずボトルネックの場所を切り分けるべきです。
- CPU 使用率だけでなく steal / ready / scheduling delay を見る
- NUMA 配置とメモリローカリティを確認する
- ストレージ I/O の latency、queue depth、キャッシュ設定を見る
- ネットワーク I/O の pps、帯域、割り込み、drop、キューを確認する
- 最適化前後で、性能だけでなく運用制約も比較する
性能問題の原因を分類せずにチューニングすると、別のレイヤの問題を別の技術で隠すことになります。まずは CPU、メモリ、ストレージ、ネットワークのどこで待っているのかを整理することが重要です。
まとめ
VM の性能ボトルネックは、CPU、メモリ、ストレージ I/O、ネットワーク I/O の 4 領域に分けて見ると整理しやすくなります。ただし、VM ではそれぞれの領域に仮想化レイヤ固有の待ちや制約が加わります。
CPU では vCPU と pCPU の対応、メモリでは NUMA と HugePages、ストレージでは仮想ディスクの経路、ネットワークでは datapath の長さが重要になります。
このシリーズでは、Day2 以降でそれぞれの領域を掘り下げます。性能最適化は、単に速くするための設定ではなく、どのレイヤを短くし、どの運用制約を受け入れるかを設計する作業です。
書籍
作って理解する仮想化技術 ── ハイパーバイザを実装しながら仕組みを学ぶ
ハイパーバイザ、CPU 仮想化支援、メモリ仮想化、割り込み、仮想デバイスなど、VM の性能設計を低レイヤから理解したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
VM パフォーマンスシリーズ
- VM パフォーマンス最適化 – NUMA / CPU / I/O / ネットワークの設計ハブ
- VM パフォーマンス Day2 – CPU 最適化と NUMA / CPU ピニングの考え方
- VM パフォーマンス Day3 – メモリ最適化と HugePages / TLB の考え方
- VM パフォーマンス Day4 – ストレージ I/O 最適化と virtio / raw / qcow2 の考え方
- VM パフォーマンス Day5 – virtio-net の構造と仮想 NIC の性能特性
- VM パフォーマンス Day6 – vhost-net / vhost-user と kernel bypass の考え方
- VM パフォーマンス Day7 – SR-IOV / PCI Passthrough による仮想化の迂回
- VM パフォーマンス Day8 – DPDK による高速 dataplane と NFV の基本
関連記事
- VyOS VPP 導入検討 – 実運用ルーターに VPP をそのまま適用する難しさ
- パブリッククラウド上で NFV 型 NF は成立するのか – アンダーレイ / オーバーレイ / 帯域制約で考える
- AWS EC2 は帯域確保サービスの基盤として使えるのか – baseline / burst / flow 制約で考える



