SR-IOV vs DPDK

# なぜ SR-IOV vs DPDK をテーマに
　5G ネットワークの三大特徴高速度、低遅延、多接続の中、高速度と低遅延を実現するために、Core & RAN の VNF / CNF が高いスループットと低遅延のネットワーク要件をクリアしなければいけません。
　その要件を実現するための技術として、SR-IOV と DPDK がよく挙げられています。それぞれの定義および2つの違いと利用シーンは[こちらの Blog](https://telcocloudbridge.com/blog/dpdk-vs-sr-iov-for-nfv-why-a-wrong-decision-can-impact-performance/) と [Intel さんの論文](https://cupdf.com/document/sr-iov-for-nfv-solutions-intel-7-sr-iov-for-nfv-solutions-practical-considerations.html)には詳しく記載されています。この Blog は私個人の勉強のためのメモとなります。

# 通常の VM のネットワークフロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/87ef0da3-25eb-6941-fb7d-b3cf0477c61d.png)
　アプリは OS カーネルを通して VM vNIC からパケットを送出し、さらにハイパーバイザーの vSwith を経由して、最終的に物理サーバの NIC から外の物理ネットワークに出て行きます。受信する時も同じプロセスを経て受信します。

# SR-IOV とは
　SR-IOV (Single Root IO Virtualization) は物理 NIC が提供する仮想機能であり、1つの物理 NIC（PF）から複数の仮想 NIC（VF)を作り出し、直接 vNIC として VM にアサインする技術です。ハイパーバイザーも vNIC -> VF への PCI Pass Through をサポートしなければいけません。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/d7a64c3e-3c0c-c9a5-0194-0b848f985c41.png)
　SR-IOV を使う場合、ハイパーバイザーの vSwitch での処理が省かれるため、より高スループットと低遅延が実現されます。一方で、vSwitch が提供する運用に利便な機能（例えば vSphere VDS / vMotion）が使えなくなります。
　※ [vSphere 環境での SR-IOV 実装](https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.networking.doc/GUID-CC021803-30EA-444D-BCBE-618E0D836B9F.html)

# DPDK とは
#### DPDK
　DPDK（Data Plane Development Kit）はその名と通り、開発キットなので、アプリに組み込み型で高速通信を実現する技術です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/f1fb2597-af1f-960c-90b0-a3fc0cb53406.png)
　アプリが DPDK を使い、ネットワーク IO 処理をカーネルを飛ばして、直接 NIC 経由で外と通信します。
　素の DPDK はアプリ向けの技術なので、サーバは VM / 物理マシンを問わないです。
#### DPDK + OVS
　DPDK の特性を VM の世界で生かして、ハイパーバイザに内蔵する vSwitch と結合したのは DPDK + OVS です。
　OVS も Linux ベースなので、DPDK を入れることによって、vSwith での処理もアプリ VM と同じように、カーネルを飛ばすことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/d13baf14-b4e7-6fca-0a20-e8350465a279.png)
　この場合、アプリには DPDK が入ってないですが、OVS の DPDK は OVS のパフォーマンスを上げられます。
　※ vSphere + NSX-T の場合、NSX-T の Enhanced Data Path 機能を使い、N-VDS で DPDK が実装されます。（ただ、VM が DPDK を対応しないと、vSwitch のみの DPDK は性能改善の効果があんまりよくない）
　※ [NSX-T 3.2 Enhanced Data Path の実装](https://docs.vmware.com/jp/VMware-NSX-T-Data-Center/3.2/installation/GUID-F459E3E4-F5F2-4032-A723-07D4051EFF8D.html)

#### DPDK + OVS & VNF
　アプリの DPDK と OVS の DPDK を併用することによって、VM のカーネルと vSwitch のカーネルを両方飛ばすことによって、更なる性能改善が期待できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/25f2c306-d976-de9d-6410-100cb89a5003.png)

# DPDK vs SR-IOV
　DPDK と SR-IOV は両方ともネットワーク処理性能を上げるための技術ですが、どれを使うべきかとの質問がよくあります。
　NFV 環境において、ベアメタルに近い性能を追求するケースがよくありますので、SR-IOV がよく使われます。でも DPDK は SR-IOV と比べるともメリットがあります。
　1つは DPDK が vSwitch の機能を影響しなく、運用に利便性を提供しつつ性能を上げることができます。
　もう1つ、DPDK は vSwitch を使うので、VM-VM 間の E-W 通信は物理 NW に出ず、仮想 NW 内で完結することができ場合もありますので、特定のシナリオにおいて、SR-IOV より高い性能を出すことができます。
　こちらの [Intel さんの論文](https://cupdf.com/document/sr-iov-for-nfv-solutions-intel-7-sr-iov-for-nfv-solutions-practical-considerations.html) は異なるシナリオにおいて、DPDK と SR-IOV の性能差異に関する検証結果を示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/0cdc517d-7984-12ca-e4cc-ac49304ed33b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/325bde6d-236a-2f27-de6a-12c711f0bcab.png)
　逆に、N-S のトラフィックが多い場合、SR-IOV は著しい性能改善効果があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/6cc29926-b7e7-c825-dc24-0812e6871280.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/1e67493c-8086-8e9f-e5c2-9efd2a2a7c30.png)

# DPDK + SR-IOV
　上記 DPDK と SR-IOV を比較しましたが、実は DPDK と SR-IOV 仕組み上コンフリクトしていないので、両方合わせて構成することもできます。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/44fd73a5-be25-44b5-d8fa-215598650a7c.png)
　いわゆる、アプリ/VM レイヤに DPDK + ハイパーバイザレイヤに SR-IOV の組み合わせです。単独より組み合わせの方は改善効果が期待できます。
　ただ、前章で比較されているのはハイパーバイザレイヤでの DPDK vs SR-IOV なので、こちらの組み合わせと前提が違うので、気を付けておく必要があります。

# 最後に
　今回は SR-IOV と DPDK の概要、違いおよび利用シーンについてまとめました。CNF の場合も同じ考え方をシェアします。ただ、CNF の場合は Multus 等の実装方法も絡んで来るので、そこらへんは次回以降書いていきます。