# Open vSwitch (OVS) Open vSwitch(OVS)は、最も広く使われている仮想スイッチである。ネットワーク仮想化システムのデータプレーンの主要な構成要素であり、その機能セットの豊かさが、システムが物理ネットワークの機能をどれだけ忠実に再現できるかを左右する。[[Nicira]] の Network Virtualization Platform や [[VMware]] NSX のようなプロプライエタリなシステム、および [[OVN]](Open Virtual Network)のようなオープンソースシステムの双方で使われており、ネットワーク仮想化が要求する柔軟性と高い性能の両立を目指して設計された。(Source: [[@2021__SystemsApproach__Software-Defined Networks - A Systems Approach - Chapter 8 Network Virtualization]] ch.8 §8.3.2) ## アーキテクチャ OVS は、ハードウェアスイッチの多くと同様に制御プレーンから [[OpenFlow]] でプログラムされる。それとは別に、OVSDB(Open vSwitch Database)プロトコルという別チャネルで構成情報を受け取る。これはハードウェアベースのデータプレーンにとっての gNMI/gNOI に相当する役割を果たす。データベースとしての OVSDB はスキーマを持ち OpenConfig スキーマに相当するものと考えられ、プロトコルとしては gNMI が protobuf を使うのに類比的に JSON ベースのメッセージ形式を使う。OVSDB は当初 OVS 用の構成状態を保存する目的で作られたが、ネットワーク転送状態を一般的に表現する手段として独自に発展しており、その広がった役割の代表例が [[OVN]] である。(Source: ch.8 §8.3.2) ## 性能とデータプレーンの実装 OVS のデータプレーン性能は、Pfaff らの論文([[@2015__NSDI__The Design and Implementation of Open vSwitch]]、USENIX NSDI 2015、Best Paper 受賞)が述べる一連の最適化によって達成されてきた。特に、カーネル内のフローキャッシュを用いた高速パスが特徴で、あるフローの最初のパケット以降は全てこの高速パスで転送される。フローの最初のパケットだけがユーザ空間デーモン `ovs-vswitchd` に渡され、一連のテーブル群でルックアップされる。このテーブル群はソフトウェアで実装されているため事実上無制限の数を持てる点が、ハードウェアによる OpenFlow スイッチング実装に対する明確な優位点であり、ネットワーク仮想化が要求する高度な柔軟性を可能にしている。(Source: ch.8 §8.3.2) OVS の実装レベルの詳細は、マイクロフローキャッシュ(単一トランスポート接続単位の細粒度キャッシュ)とメガフローキャッシュ(より粗いトラフィック集約に対応する第2層キャッシュ)の2層構造として設計されている。パケット分類は[[パケット分類|タプル空間探索]]方式を採用し、タプル優先度ソート・ステージドルックアップ・プレフィックストラッキング・分類器パーティショニングという4つの最適化により、キャッシュヒット率を犠牲にせず分類コストを削減する。Rackspace の大規模マルチテナントデータセンター(1,000台超のハイパーバイザ)における24時間の実運用データでは、全体キャッシュヒット率97.7%、ハイパーバイザの80%が `ovs-vswitchd` のCPU使用率5%以下を達成している。(Source: [[@2015__NSDI__The Design and Implementation of Open vSwitch]]) 性能面ではさらに、DPDK(Data Plane Development Kit)を適用した OVS-DPDK が代表的な最適化として挙げられる。仮想ネットワークと非仮想ネットワークの間でパケットを転送する Virtual-to-Physical Gateway のような、転送以外の CPU 負荷がほとんど無い用途に特に有効であり、RedHat Developer が報告した実験ではハイエンドの Intel プロセッサ上で OVS-DPDK が毎秒 1600 万パケット(16Mpps)以上を転送できるのに対し、OVS 単体では毎秒 100 万パケット(1Mpps)に近い転送率にとどまるとされる。一方、SR-IOV(仮想スイッチ自体をバイパスして VM が NIC を直接使う手法)は、仮想スイッチのプログラム可能性という価値そのものを損なうため、ネットワーク仮想化にとっては有用な最適化とは言えないとされる。(Source: ch.8 §8.3.3) 同時に、P4 をソフトウェア・ハードウェア双方の転送要素を書くための共通言語(lingua franca)として、両者を統一しようとする取り組みも進んでおり、これによりデータプレーン制御用の自動生成インターフェースとして [[P4]]Runtime も視野に入ってくる。(Source: ch.8 §8.3.2) ## NVP における役割(2014年、一次資料) [[@2014__NSDI__Network Virtualization in Multi-tenant Datacenters]]は、[[Network Virtualization Platform (NVP)|NVP]] が全トランスポートノード(ホストパーバイザー・ゲートウェイ・サービスノード)でパケット転送に OVS を使うと報告する。NVP は OVS を [[OpenFlow]] と OVSDB の2プロトコルでリモート制御し、論理データパスの各フローエントリに論理テーブル識別子へのメタデータマッチを強制的に付加することで、他の論理データパスからの分離を実現する。OVS のフローテーブルはソフトウェア実装であるためテーブル数やマッチ対象フィールドに人為的な制約がなく、この柔軟性が論理パイプラインの多段階構成を可能にしている。(Source: [[@2014__NSDI__Network Virtualization in Multi-tenant Datacenters]] §3.1) ## コンテナ・VM混在環境への対応 OVS は VM と外部の間だけでなく、コンテナ環境で同一または別ホスト上のコンテナ間のパケット転送にも使える。したがってコンテナ向けのネットワーク仮想化システムも、VM 向けと同じ構成要素の多くから構築でき、コンテナと VM が単一の仮想ネットワークで通信する混在環境も可能である。(Source: ch.8 §8.3.2) ## 関連 - [[OVN]] — OVS への機能拡張として構築されたオープンソースのネットワーク仮想化システム - [[GENEVE]] — OVS が実装するオーバーレイカプセル化の一つ - [[Nicira]] / [[VMware]] — OVS を使うプロプライエタリなネットワーク仮想化製品の提供元 - [[OpenFlow]] — OVS のデータプレーンをプログラムするプロトコル - [[P4]] — ソフトウェア・ハードウェア双方の転送要素を統一的に記述する言語として台頭 - [[パケット分類]] — OVS のタプル空間探索分類器とその最適化 - [[ネットワーク仮想化]] ## 出典 - Peterson, Cascone, O'Connor, Vachuska, and Davie, *Software-Defined Networks: A Systems Approach*, 2021, Chapter 8: Network Virtualization, §8.3.2, §8.3.3. https://sdn.systemsapproach.org/netvirt.html - [[@2015__NSDI__The Design and Implementation of Open vSwitch]](B. Pfaff, et al., NSDI '15。2層フローキャッシュとタプル空間探索パケット分類器の詳細設計、実運用性能評価) - [[@2014__NSDI__Network Virtualization in Multi-tenant Datacenters]](§3.1、NVPにおけるOVSの制御方式)