手当たり次第に書くんだ

飽きっぽいのは本能

VM パフォーマンス Day6 – vhost-net / vhost-user と kernel bypass の考え方

Day5 では、virtio-net が標準的な仮想 NIC であり、QEMU、virtqueue、割り込み、コピー、ホスト側 datapath が性能に影響することを整理しました。

Day6 では、その処理を QEMU からどこへ逃がすかを考えます。vhost-net は virtio の処理をカーネル側へ寄せる方式で、vhost-user はユーザー空間 dataplane へ接続する方式です。

重要なのは、vhost-net が速い、vhost-user が速いという単純な序列ではありません。どの datapath に責任を持たせ、どのレイヤを迂回し、どの運用制約を受け入れるかです。

virtio-net の限界を振り返る

通常の virtio-net では、ゲスト OS の virtio-net ドライバ、virtqueue、QEMU、ホストカーネル、物理 NIC という経路を通ります。この経路では QEMU が重要な橋渡し役になります。

  • QEMU スレッドにパケット処理が集まりやすい
  • ユーザー空間とカーネル空間の往復が増える
  • pps が増えると CPU コストが見えやすい
  • 割り込みや virtqueue 更新が高頻度に発生する
  • ホスト側 datapath の状態にも性能が左右される

vhost 系の技術は、この QEMU 中心の処理を減らすために使われます。

vhost-net は virtio 処理をカーネル側へ寄せる

vhost-net は、virtio-net の一部処理を QEMU からホストカーネル側の vhost thread へ移す仕組みです。これにより、QEMU が直接処理する範囲を減らし、ホストカーネル側でより効率的にパケットを扱えるようにします。

観点vhost-net の意味
処理場所QEMU からホストカーネル側へ寄せる
目的QEMU の負荷と context switch を減らす
datapathLinux kernel network stack を通る
相性Linux bridge、kernel OVS、通常の仮想ネットワーク
制約kernel datapath の制約は残る

vhost-net は、標準的な VM ネットワークを大きく崩さずに性能を改善しやすい方式です。運用性を保ったまま QEMU の負荷を下げたい場合に向きます。

vhost-net で残る制約

vhost-net は QEMU の負荷を減らしますが、Linux kernel datapath を完全に迂回するわけではありません。Linux bridge、tap、OVS kernel datapath、softirq、qdisc などのレイヤは残ります。

  • kernel network stack を通る
  • softirq や IRQ 配置の影響を受ける
  • host 側の bridge / OVS 設計に依存する
  • CPU / NUMA 配置の問題は残る
  • 高 pps や NFV 用途ではさらに短い datapath が必要になる場合がある

つまり、vhost-net は標準構成の改善であり、kernel bypass そのものではありません。

vhost-user はユーザー空間 dataplane へ接続する

vhost-user は、virtio の処理をユーザー空間の dataplane と接続する仕組みです。代表的には OVS-DPDK や DPDK アプリケーションと組み合わせて使われます。

vhost-user では、QEMU と dataplane プロセスが UNIX domain socket などを通じて連携し、実際のパケット処理はユーザー空間 dataplane 側で行われます。

観点vhost-user の意味
処理場所ユーザー空間 dataplane 側へ寄せる
目的kernel datapath を迂回し、高速 dataplane と接続する
代表例OVS-DPDK、DPDK dataplane、NFV
利点高 pps、低遅延用途に向く
制約CPU コア専有、HugePages、運用設計が必要

kernel bypass は速さだけの話ではない

kernel bypass は、Linux kernel network stack をできるだけ通らずにパケットを処理する考え方です。DPDK はその代表例です。

kernel bypass により、softirq、qdisc、通常の NIC ドライバ処理などを避けられるため、高 pps の処理に向きます。一方で、カーネルが提供していた機能や可観測性、標準的な運用手順も迂回することになります。

  • 高速化できるが、CPU コアを専有しやすい
  • HugePages や NIC バインドが必要になる場合がある
  • 標準的な Linux ネットワークツールで見えにくくなる
  • 障害切り分けの責任境界が変わる
  • ライブマイグレーションや柔軟な運用に制約が出やすい

vhost-user は DPDK 必須ではないが、DPDK と組み合わされやすい

vhost-user は仕組みとしてはユーザー空間 dataplane との接続方式であり、DPDK そのものではありません。ただし、実運用では OVS-DPDK や DPDK ベースの dataplane と組み合わせられることが多くなります。

そのため、vhost-user を使う場合は、vhost-user の設定だけでなく、dataplane プロセス、HugePages、CPU ピニング、NUMA、NIC の扱いまで含めて設計する必要があります。

virtio-net / vhost-net / vhost-user の比較

方式datapath向く用途主な制約
virtio-netQEMU 中心汎用 VM、運用性重視高 pps で QEMU 負荷が見えやすい
vhost-netkernel datapath標準構成の高速化kernel datapath の制約は残る
vhost-userユーザー空間 dataplaneNFV、DPDK、低遅延、高 pps運用設計と専用リソースが必要

この比較で重要なのは、速さの順番ではなく、どの処理をどのレイヤへ移すかです。運用性を残すなら virtio-net / vhost-net、dataplane を専用化するなら vhost-user / DPDK へ進むことになります。

設計時の確認ポイント

vhost 系の方式を選ぶときは、次の観点を確認します。

  • QEMU が本当にボトルネックになっているか
  • 問題は bandwidth なのか pps なのか latency なのか
  • kernel datapath を残してよいか
  • ユーザー空間 dataplane の運用を持てるか
  • CPU ピニング、NUMA、HugePages と合わせて設計しているか
  • 標準的な監視や障害切り分けをどこまで失うか

まとめ

vhost-net と vhost-user は、virtio-net の処理を QEMU から逃がすための方式です。vhost-net はカーネル側へ寄せ、vhost-user はユーザー空間 dataplane へ接続します。

vhost-net は、標準的な仮想ネットワークの運用性を保ちながら QEMU の負荷を下げやすい方式です。一方、vhost-user は DPDK や OVS-DPDK のような高速 dataplane と組み合わせることで、高 pps や NFV 用途に向きます。

ただし、高速化するほど、CPU、NUMA、HugePages、監視、移動性、障害切り分けの制約が増えます。Day7 では、さらに仮想化レイヤを迂回する SR-IOV / PCI Passthrough を整理します。

参考
書籍
参考書籍

作って理解する仮想化技術 ── ハイパーバイザを実装しながら仕組みを学ぶ

ハイパーバイザ、CPU 仮想化支援、メモリ仮想化、割り込み、仮想デバイスなど、VM の性能設計を低レイヤから理解したい場合の参考書籍です。価格や在庫はリンク先で確認してください。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

VM パフォーマンスシリーズ

関連記事

VM パフォーマンス Day6 – vhost-net / vhost-user と kernel bypass の考え方

コメントを残す

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

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

トップへ戻る