VM のネットワーク性能を考えるとき、最初に出てくるのは virtio-net ですが、実際の性能設計では vhost-net や vhost-user も避けて通れません。この記事では、virtio の処理をどこで行うのかという観点から、vhost-net と vhost-user の違いを整理します。
結論から言えば、vhost-net は virtio の処理を Linux kernel 側へ寄せる仕組みで、vhost-user は QEMU と userspace dataplane を接続する仕組みです。どちらも VM の I/O パスを短くする方向の技術ですが、目的と運用上の性質はかなり違います。
virtio-net だけではどこが重くなるのか
virtio-net は、VM に対して仮想 NIC を見せるための標準的な方式です。エミュレーションより効率がよく、KVM / QEMU の通常構成ではまず virtio-net を使うのが基本になります。
ただし、VM が大量のパケットを処理する場合、guest、QEMU、host kernel、bridge / Open vSwitch、物理 NIC の間で、コンテキストスイッチやデータコピー、割り込み処理が増えます。この部分が packet forwarding 系ワークロードでは性能上の制約になりやすくなります。
vhost-net は kernel 側で virtio 処理を支援する
vhost-net は、virtio-net の一部処理を QEMU プロセスから host kernel 側へ移す仕組みです。QEMU がすべてを処理するよりも、kernel 側で virtqueue を扱えるため、VM ネットワークのオーバーヘッドを減らしやすくなります。
一般的な KVM の VM であれば、まず virtio-net と vhost-net の組み合わせで十分なことが多いです。Web サーバー、DB、管理系 VM、通常の業務 VM では、DPDK や SR-IOV を考える前に、この通常経路がきちんと使われているかを確認する方が現実的です。
vhost-user は userspace dataplane へ接続する
vhost-user は、QEMU と userspace dataplane を接続するための仕組みです。代表例は OVS-DPDK のように、Open vSwitch の datapath を DPDK 側へ寄せる構成です。
vhost-user では、packet processing を host kernel の通常ネットワーク経路から外し、userspace 側の dataplane と VM をつなぎます。そのため、NFV、仮想ルータ、仮想ファイアウォール、仮想ロードバランサのような高 pps ワークロードで選択肢になります。
vhost-net と vhost-user の違い
| 観点 | vhost-net | vhost-user |
|---|---|---|
| 処理場所 | host kernel 側 | userspace dataplane 側 |
| 典型構成 | 通常の KVM / QEMU / virtio-net | QEMU + OVS-DPDK など |
| 運用性 | Linux 標準構成に近く扱いやすい | 専用設計と専用監視が必要になりやすい |
| 性能の狙い | QEMU 経由のオーバーヘッドを減らす | kernel network stack を迂回して dataplane を専用化する |
| 向く用途 | 一般的な VM ネットワーク高速化 | NFV、高 pps、低遅延 dataplane |
vhost-user は vhost-net の単純な上位互換ではありません。vhost-net は通常の VM ネットワークを効率化する方向で、vhost-user は userspace dataplane を前提に VM ネットワークの構造自体を変える方向です。
kernel bypass は速さだけの話ではない
kernel bypass という言葉だけを見ると、kernel を通らない方が速い、という単純な話に見えます。しかし実際には、Linux kernel が提供している汎用性、監視しやすさ、既存ツールとの相性、セキュリティ境界の見え方も一緒に変わります。
vhost-user や DPDK を使う場合、CPU polling、HugePages、NUMA、PMD thread、NIC 配置などをまとめて設計する必要があります。単に機能を有効化するだけでは、期待した性能が出ないだけでなく、障害時の切り分けも難しくなります。
現在の VM で確認すること
VM ネットワークの方式を検討する前に、まず現在の interface、QEMU / libvirt の設定、vhost module、Open vSwitch の状態を確認します。
ip link show
lsmod | grep vhost
virsh domiflist vm-name
virsh dumpxml vm-name
ovs-vsctl showここでは、いきなり DPDK を有効化するのではなく、VM がどの仮想 NIC を使い、どの host 側 datapath を通っているかを確認します。
virtio-net / vhost-net / vhost-user の位置づけ
| 方式 | 役割 | 考え方 |
|---|---|---|
| virtio-net | guest に効率的な仮想 NIC を見せる | KVM の標準的な仮想 NIC としてまず使う |
| vhost-net | virtio 処理を kernel 側で支援する | 一般的な VM ネットワーク性能改善の基本線 |
| vhost-user | QEMU と userspace dataplane を接続する | OVS-DPDK や NFV 基盤で検討する |
| DPDK | userspace で packet processing を行う | vhost-user と組み合わせて dataplane を専用化しやすい |
| SR-IOV | NIC の VF を VM に近い形で渡す | software switch を迂回したい場合の別方向の選択肢 |
設計時の確認ポイント
- 一般的な VM なのか、packet forwarding を主目的にした VM なのかを分ける
- 帯域だけでなく pps、latency、jitter、packet loss を見る
- vhost-net で十分なのか、vhost-user / DPDK が必要なのかを分ける
- NUMA、CPU pinning、HugePages、NIC 配置を同時に見る
- 運用監視、障害切り分け、再起動時の復旧手順を用意する
特に重要なのは、vhost-user や DPDK は「設定すれば速くなる」ものではなく、dataplane 専用化の設計だという点です。通常の VM であれば、まず vhost-net を含む標準的な virtio 構成を正しく使う方が筋がよいです。
参考書籍
書籍
ハイパーバイザ、CPU 仮想化支援、メモリ仮想化、割り込み、仮想デバイスなど、VM の性能設計を低レイヤから理解したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
VM パフォーマンスシリーズ
関連する記事
まとめ
vhost-net と vhost-user は、どちらも VM ネットワーク性能に関係しますが、同じ方向の技術ではありません。vhost-net は通常の virtio-net を kernel 側で効率化する仕組みであり、vhost-user は userspace dataplane と VM を接続する仕組みです。
一般的な VM では、まず virtio-net と vhost-net を正しく使うことが基本です。NFV や高 pps dataplane のように、kernel network stack の汎用性よりも packet processing の決定性を重視する場合に、vhost-user、OVS-DPDK、DPDK、SR-IOV といった選択肢を比較します。





