はじめに
ネットワークは CPU・メモリ・ストレージのどれとも異なる性質を持ちます。
ストレージほどレイテンシは大きくありませんが、パケット処理は連続的で、CPU 使用率・割り込み・ホスト側ネットワークスタックの全てが絡みます。
特に仮想化環境でのネットワーク I/O は、ゲスト → QEMU → ホストカーネル → NIC という多段構造を通過するため、以下の要素が積み重なり、性能が頭打ちになりやすい領域です。
- 割り込み回数
- ユーザー空間とカーネル空間の切り替え
- virtqueue のキュー処理
- QEMU スレッドの負荷
本記事では、ネットワーク最適化の第一歩として virtio-net の構造と限界を整理します。
virtio-net の基本構造
一般的な VM のネットワークパスは次の通りです。
VM(virtio-net ドライバ)→ QEMU(ユーザー空間)→ ホスト OS カーネル → 物理 NICこの経路を通るため、パケット送受信には複数のメモリコピー・スレッド遷移・割り込み処理 が発生します。
ストレージ I/O(Day4)と同様、ネットワークの性能も「経路が長いほど遅くなる」という鉄則に従います。
virtqueue(Descriptor Ring)の仕組み
virtio-net の内部では、パケットバッファを virtqueue と呼ばれるリング構造で管理します。
virtqueue は次の 3 要素で構成されます。
- descriptor:バッファのアドレスと長さを示す
- available ring:ゲスト OS が送信・受信キューへエントリを提示する
- used ring:デバイス側(実際には QEMU 側)が処理済みエントリを報告する
ストレージの virtio-blk と同様、これは ゲストと QEMU が共有するメモリリングを介して I/O を交換する方式です。
ただし、ネットワーク I/O の特徴である 高頻度・低サイズのパケット処理では、このリング構造の更新頻度が大きくなり、結果として virtqueue の管理コストが相対的に高くなるという性質があります。
virtio-net が遅くなる原因
virtio-net が抱えるボトルネックは主に 3 つあります。
QEMU がすべてのパケット処理を担当する
ストレージの virtio-blk と同じく、virtio-net も QEMU が virtqueue の処理とホストカーネルへの送受信を全て担当します。
大量の pps(packet per second)が来ると、以下の現象が起こります。
- QEMU スレッドが飽和
- CPU の user 使用率が上昇
- レイテンシが不安定化
ユーザー空間とカーネル空間の切り替え(context switch)
virtio-net は、ゲスト ↔ QEMU(ユーザー空間)↔ ホストカーネルの往復が必ず発生します。context switch が増えるほど、1 つのパケットあたりの処理コストが跳ね上がります。
割り込み(interrupt)のオーバーヘッド
NIC からの割り込みは QEMU を経由してゲストに届けられます。ストレージの場合、I/O は比較的バッチ化できますが、ネットワークはリアルタイム性が高いため、割り込み頻度が高くなりやすい。
その結果、以下が発生し、virtio-net が伸び悩む大きな原因になります。
- 不必要な wakeup
- 割り込みストーム
- キュー処理の遅延
- CPU 使用率の跳ね上がり
virtio-net のメリットと限界
virtio-net は現在でも非常に優秀な設計であり、一般的な VM では十分な性能を発揮します。
virtio-net のメリットは以下が挙げられます。
- OS 標準サポートが広い
- シンプル
- ライブマイグレーションとの相性が良い
- 安定性が高い
しかし、以下の例のように性能要求が上がると、すぐに限界に達します。
- 10GbE/25GbE 以上の帯域
- 高 PPS(パケット/秒)
- NFV(ネットワーク機能仮想化)
- IPS/Firewall/Router のような低レイテンシ用途
virtio-net の限界を突破するための技術が、Day6 の vhost-net、Day7 の vhost-user / SR-IOV、Day8 の DPDK / OVS-DPDK の世界です。
virtio-net の理解は、その高速化手法をすべて俯瞰する“基準点”になります。
まとめ
virtio-net は仮想 NIC の標準であり、KVM 仮想ネットワークの“基盤”となる存在です。
しかし構造上、以下のような根本的な制約を持ちます。
- QEMU がボトルネックになりやすい
- 割り込みと context switch の負荷が大きい
- PPS が増えると急速に性能が頭打ちになる
次回(Day6)では、virtio-net の構造を補完する vhost-net / vhost-user を扱い、ネットワーク I/O パスがどのように短縮されるのかを整理します。

