手当たり次第に書くんだ

飽きっぽいのは本能

vhost-net / vhost-user で VM ネットワークを高速化する考え方 – virtio と kernel bypass の違い

VM パフォーマンス最適化の設計ハブへ戻る

VM のネットワーク性能を考えるとき、最初に出てくるのは virtio-net ですが、実際の性能設計では vhost-netvhost-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-netvhost-user
処理場所host kernel 側userspace dataplane 側
典型構成通常の KVM / QEMU / virtio-netQEMU + 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-netguest に効率的な仮想 NIC を見せるKVM の標準的な仮想 NIC としてまず使う
vhost-netvirtio 処理を kernel 側で支援する一般的な VM ネットワーク性能改善の基本線
vhost-userQEMU と userspace dataplane を接続するOVS-DPDK や NFV 基盤で検討する
DPDKuserspace で packet processing を行うvhost-user と組み合わせて dataplane を専用化しやすい
SR-IOVNIC の 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 といった選択肢を比較します。

VM パフォーマンス最適化の設計ハブへ戻る

vhost-net / vhost-user で VM ネットワークを高速化する考え方 – virtio と kernel bypass の違い

コメントを残す

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

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

トップへ戻る