手当たり次第に書くんだ

飽きっぽいのは本能

VM パフォーマンス Day5: ネットワーク最適化 – 仮想 NIC の基礎構造と性能特性

はじめに

ネットワークは 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-netDay7 の vhost-user / SR-IOVDay8 の DPDK / OVS-DPDK の世界です。

virtio-net の理解は、その高速化手法をすべて俯瞰する“基準点”になります。

まとめ

virtio-net は仮想 NIC の標準であり、KVM 仮想ネットワークの“基盤”となる存在です。

しかし構造上、以下のような根本的な制約を持ちます。

  • QEMU がボトルネックになりやすい
  • 割り込みと context switch の負荷が大きい
  • PPS が増えると急速に性能が頭打ちになる

次回(Day6)では、virtio-net の構造を補完する vhost-net / vhost-user を扱い、ネットワーク I/O パスがどのように短縮されるのかを整理します。

VM パフォーマンス Day5: ネットワーク最適化 – 仮想 NIC の基礎構造と性能特性

コメントを残す

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

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

トップへ戻る