DPDK の仮想スイッチ フレームワーク OvS

DPDK の概要

DPDK は、X86 プラットフォーム上で高速パケット処理を行うためのライブラリとドライバーのコレクションです。ネットワーク プロトコル スタックではなく、レイヤー 2 およびレイヤー 3 の転送機能は提供せず、ファイアウォール ACL 機能もありませんが、上記の機能は使用できます。 DPDK を通じて簡単に開発できます。

DPDK の利点は、高速化の目的を達成するためにカーネルを経由せずにユーザー モード データをネットワーク カードに直接転送できることです。主な構造を図に示します。

従来のソケット方式と DPDK との比較:

DPDK の主要な技術ポイント:

  1. ラージ ページキャッシュのサポートを使用して、メモリ アクセス効率を向上させます。

  2. UIO サポートは、アプリケーション スペースでドライバー サポートを提供するために使用されます。つまり、ネットワーク カード ドライバーはユーザー スペースで実行され 、ユーザー スペースとアプリケーション スペースでのメッセージの複数のコピーが削減されます。

  3. LINUX アフィニティ サポートを使用すると、コントロール プレーン スレッドと各データ プレーンスレッドが異なる CPU コアにバインドされ、スレッドが各 CPU コア間で行き来してスケジュールされることがなくなります。

  4. LOCKLESS : ロックフリーのリング キャッシュ管理を提供し、メモリ アクセス効率を高速化します。

  5. 送受信パケットのバッチ処理 複数の送受信パケットを1つのキャッシュラインに集中させ、適用と解放を繰り返すことなくメモリプール内に実装します。

  6. PMD ドライバー、ユーザー モードのポーリングドライバーは、コンテキスト切り替えのオーバーヘッドを削減し、仮想マシンとホストのゼロ コピーの実現を促進します。

OVS+DPDK

OpenvSwitch は豊富な機能を備え、マルチレイヤ仮想スイッチとしてクラウド環境で広く使用されています。Open vSwitch の主な機能は、物理マシン上の VM にレイヤー 2 ネットワーク アクセスを提供し、クラウド環境内の他の物理スイッチと並行してレイヤー 2 で動作することです。

従来のホスト ovs はカーネル状態で動作し、ゲスト virtio とのデータ転送にはカーネル状態とユーザー状態の間で複数のデータ切り替えが必要となり、パフォーマンスのボトルネックが発生します。

Ovs+Dpdk と Ovs 自体の違いは、次の図で簡単に表すことができます。

OVS の初期バージョンでは、マルチレベル フロー テーブル ルックアップが遅いという問題を軽減するために、OVS はカーネル状態で Microflow Cache メソッドを使用します。Microflow Cache は、ハッシュベースの完全一致ルックアップ テーブル (O(1)) であり、テーブル アイテムはマルチレベル ルックアップ テーブルの結果をキャッシュし、各リンク粒度の状態を維持します。Microflow Cache は、メッセージがユーザー状態のマルチレベル テーブルに入る回数を減らします。フローの最初のパケットがユーザー モードでテーブル ルックアップに入ると、後続のパケットがカーネル内のマイクロフロー キャッシュにヒットし、テーブル ルックアップが高速化されます。ただし、多数の短いフローがあるネットワーク環境では、マイクロフロー キャッシュのヒット率が非常に低いため、ほとんどのパケットは依然としてマルチレベル フロー テーブル検索のためにユーザー モードに移行する必要があるため、転送パフォーマンスは制限されます。

そこで、Mircoflow Cache の問題を解決するために、OVS は Mircoflow Cache を Megaflow Cache に置き換えました。Mircoflow Cache の正確なハッシュ ルックアップ テーブルとは異なり、Megaflow Cache はワイルドカードを使用したテーブル ルックアップをサポートしているため、テーブルをルックアップするためにパケットがユーザー空間に送信される回数を減らすことができます。Yu Zhihui のブログでは、当時のメガフローのデータ構造とテーブル検索プロセスを分析しました。関連する内容はここでは繰り返しません。上記の記事のリンクを参照してください。ただし、OVS はタプル空間検索 (後述) を使用して Megaflow キャッシュ ルックアップを実装するため、テーブル ルックアップの平均数はタプル テーブル数の半分になります。タプル空間検索のタプル テーブル チェーンが m であると仮定すると、平均テーブル検索コストは O(m/2) です。Mircoflow Cache と Megaflow Cache のテーブル ルックアップ コストの比較は、O(1)<O(m/2) です。したがって、Mircoflow Cache と比較して、Megaflow Cache はユーザー空間でのパケットのルックアップ回数を減らしますが、カーネル モードでのパケットのルックアップ回数を増やします。

このため、現在のバージョンの OVS は、Megaflow Cache + Microflow Cache というフロー キャッシュ構成形式を採用しており、依然として Microflow Cache を第 1 レベルのキャッシュとして保持しています。つまり、メッセージが入力された後、最初に第 1 レベルのキャッシュがチェックされます。ただ、このMicroflow Cacheは本来のMicroflow Cacheとは意味が異なります。オリジナルの Microflow Cache は実際に正確なハッシュ テーブルですが、最新バージョンの Microflow Cache はテーブルではなく、最後の Megaflow Cache エントリを指すインデックス値です。この場合、メッセージの最初のテーブル検索では線形チェーン検索を実行する必要がなく、Megaflow タプル テーブルの 1 つに直接対応できます。これら 3 つのステージのテーブル ルックアップ コストを表に示します。

DPDK の高性能 (ユーザー空間) ネットワーク カード ドライバー、大容量ページ メモリ、ロックフリーの構造設計により、10G ネットワーク カードの回線速度のパフォーマンスを簡単に達成できます。ovs-dpdk を使用すると、vm から vm へ、および nic から vm へのデータ転送全体がユーザー モードで動作できるようになり、ovs のパフォーマンスが大幅に向上します。

さらに、ovs-dpdk は、DPDK と vhost-user テクノロジーの利点を組み合わせています。vhost-user は、仮想マシンからホストへのデータのゼロ コピーを実装するユーザー モードの vhost-backend プログラムです。

ネイティブ ovs と ovs-dpdk の比較

(1) ネイティブ ovs データ ストリームの処理プロセスは次のとおりです。

  1. データ パケットはネットワーク カードに到着すると、データパスにアップロードされます。

  2. データパスは、キャッシュ内の正確なフロー テーブルがこのパケットを直接転送できるかどうかを確認し、キャッシュ内にレコードが見つからない場合、カーネルはネットリンクを介してユーザー空間の vswitchd にアップコールを送信します。

  3. vswitchd はデータベースをチェックして、パケットの宛先ポートがどこにあるかを確認します。ここで openflow フロー テーブルを操作するには、ovsdb および ovs-ofctl と対話する必要があります。

  4. カーネル モード フロー テーブルの内容を更新します。

  5. データパスに再注入し、データ パケットを再送信します。

  6. フロー テーブルを再度クエリし、データ パケットの正確な転送ルールを取得し、ルールに従って転送します。

(2) ovs-dpdk 方式:

ユーザーモードプロセスは、ネットワークカードを直接引き継いでデータの送受信を行い、ポートごとにデータ送受信用のコアを割り当てる「IO専用コア」技術を採用し、割り込み処理をポーリング処理方式に置き換える。 IO パフォーマンスが大幅に向上します。

要約:

ovs-dpdkを使用する

ハードウェア要件

ネットワーク カードは DPDK をサポートする必要があります。http://dpdk.org/doc/nics を参照してください。

CPU は DPDK をサポートする必要があります。テスト コマンド: cat /proc/cpuinfo |grep pdpe1gb

DPDK は virtio dpdk ドライバーもサポートしているため、DPDK ハードウェアのネットワーク カードをサポートする必要はありません。

hugepage サポートをオンにする

hua@node1:~$ cat  /etc/default/grub |grep GRUB_CMDLINE_LINUXGRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on pci=assign-busses"GRUB_CMDLINE_LINUX="transparent_hugepage=never hugepagesz=2M hugepages=64 default_hugepagesz=2M"
hua@node1:~$ mkdir /mnt/hugehua@node1:~$ mount -t hugetlbfs nodev /mnt/hugehua@node1:~$ echo 8192 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepageshua@node1:~$ cat /proc/meminfo |grep HugePages_HugePages_Total:       8192HugePages_Free:        8192HugePages_Rsvd:        0HugePages_Surp:        0hua@node1:~$ grep Hugepagesize /proc/meminfoHugepagesize:       2048 kB

uio_pci_generic ドライバーを使用するようにネットワーク カードを構成すると、仮想マシンは PF を DPDK ポートとして使用するか、ダイレクト モードで VF を使用できます。

PF ドライバーには ixgbe または DPDK PF ドライバーが使用でき、VF ドライバーには ixgbefv または DPDK VF ドライバーが使用できますが、DPDK PF ドライバーを使用する場合は grub に iommu=pt を追加します。

以下の方法でも通信可能です。

テストシーンの構築

​​​​​​​

sudo ovs-vsctl ovsbr0 br-intsudo ovs-vsctl set bridge ovsbr0 datapath_type=netdevsudo ovs-vsctl add-port ovsbr0 dpdk0 -- set Interface dpdk0 type=dpdk  #Port name shoud begin with dpdk
# 给虚机创建普通ovs port:sudo ovs-vsctl add-port ovsbr0 intP1 -- set Interface intP1 type=internalsudo ip addr add 192.168.10.129/24 dev intP1sudo ip link set dev intP1 upsudo tcpdump -i intP1
# 或给虚机创建vhost-user port:sudo ovs-vsctl add-port ovsbr0 vhost-user2 -- set Interface vhost-user2 type=dpdkvhostuser
# 虚机使用vhost-user portsudo qemu-system-x86_64 -enable-kvm -m 128 -smp 2 \    -chardev socket,id=char0,path=/var/run/openvswitch/vhost-user1 \    -netdev type=vhost-user,id=mynet1,chardev=char0,vhostforce \    -device virtio-net-pci,netdev=mynet1,mac=52:54:00:02:d9:01 \    -object memory-backend-file,id=mem,size=128M,mem-path=/mnt/huge,share=on \    -numa node,memdev=mem -mem-prealloc \    -net user,hostfwd=tcp::10021-:22 -net nic \    /bak/images/openstack_demo.img
# Inside VM: sudo ifconfig eth0 192.168.9.108/24

vhost-user の使用の概略図は次のとおりです。

dpdk-virtio-net

元のアドレス: https://blog.csdn.net/qq_15437629/article/details/77887910

DPDK の仮想スイッチ フレームワーク OvS

  • 0vS 3 つの主要コンポーネント ovs vwitond、ovd-server、oswichn.ko

  • OvS パケット処理メカニズム

  • OvS 4 データ パス

  • VXLANデータプロトコル

dpdk-ネットワークプロトコルスタック-vpp-OvS-DDos-仮想化体系学習コース

  • DDos 保護

  • OvS仮想スイッチ

  • VPP パケット処理フレームワーク

  • nff-go ネットワーク開発フレームワーク

  • ネットワーク仮想化 virtio

  • spdk の効率的なディスク IO の読み取りと書き込み

  • ユーザーモードプロトコルスタック

  • c1000k、c10M

32件のプロジェクト事例

2 行以上の手書きコード

dpdk の 4 つの技術的方向性は、セキュリティ、ネットワーク、ストレージ、クラウド生成です。

80時間以上の録画と放送時間

[記事の利点]: 編集者が個人的に良いと思ういくつかの学習本とビデオ資料を整理し、Junyang:Documents で共有しました。必要に応じて自分で追加できます。~参加するには 909332607 をクリックしてください(自己収集が必要です)
(情報には次が含まれます: Dpdk/ネットワーク プロトコル スタック/vpp/OvS/DDos/NFV/仮想化、tcp/ip、プラグイン、機能、フレキシブル アレイ、golang、mysql、linux、Redis、 CDN など)、無料共有~
Dpdk/ネットワーク プロトコル スタック/vpp/OvS/DDos/NFV/仮想化/高性能エキスパート学習アドレス: https://ke.qq.com/course/506620

おすすめ

転載: blog.csdn.net/weixin_60043341/article/details/127905898