メモのページ - チラシの裏メモ 3枚目

通信技術や気になった事を黙々とメモし続ける

6WIND VSRのアーキテクチャおよびカスタマイズ

6WIND VSRは、前々回の記事にて記載したとおり、高性能かつスケーラブルなソフトウェアルータ製品群である事をセールスポイントとしている。
6WIND VSRを含めCisco CSR1000vやJuniper vMX等のようなソフトウェアルータでは、パケットを高速に処理する為の仕組みが各ネットワーク機器ベンダによって開発および実装されている。
今回は、6WIND VSRに実装されているパケット高速処理の為の仕組みであるFast Pathの設定に触れてみた。
6WIND VSRのデプロイおよびL3ルーティングまでの流れは以下を参照。
https://debslink.hatenadiary.jp/entry/20230329/1680017202 6WIND VSRを試用してみた
https://debslink.hatenadiary.jp/entry/20230404/1680606122 6WIND VSRでOSPFとBGPの設定


6WINDの設計概念
6WIND社は、高性能かつスケーラブルな製品を提供し続ける為に以下のような設計概念を取り入れている。
・x86マルチプロセッサ・プラットフォーム向けに最適化されたアーキテクチャ。
・コントロールプレーンとデータプレーンを分離し、両プレーンの独立したスケーリングを可能にする。
・ロックレスデータプレーンネットワークスタックにより、一貫して最小限のレイテンシーを実現。
・Fast Pathと呼ばれるデータプレーンによって高い拡張性が提供される。Fast Pathとは、ルーティングやパケットフィルタリングやQoS等、様々なデータプレーン機能をサポートする為に最適化されたデータパスである。
・HWアクセラレーションが利用可能な場合は、その機能を活用する。データプレーンの性能を最大限に引き出し、最高のパフォーマンスを利用可能なHWリソースで実現する。

これらの高度な実装および設計コンセプトにより、6WIND VSRは以下が可能になっている。
・コントロール プレーンとデータ プレーンのCPUコアの分離
・展開環境のリソースの最適化された使用
・コントロール プレーンとデータ プレーンの両方で高パフォーマンスを発揮
・高度な冗長機能
・回復力のあるクラウド スケーリング
・物理および仮想化されたネットワーク要素全体で一貫した運用


6WINDのFast Pathとは
6WIND VSRに実装されているFast Pathとは、パケット処理の高速化を担当するVSRのコンポーネントである。6WIND社の独自機能ではない。
Fast Pathは6WIND VSRのOSであるLinuxから分離されており、DPDK(Data Plane Development Kit)上のユーザーランドの専用コアで実行される。DPDKとはData Plane Development Kitの略である。オープンソースとして公開されており、パケットを高速に処理する為のライブラリとネットワークドライバのセットである。DPDKはCisco CSR1000vやJuniper vMXにも実装されている。

6WIND VSRのアーキテクチャおよびFast Pathを以下に示す。
※図をクリックすると拡大表示します

①6WIND VSRでは、全てのパケットがDPDKを介しFast Pathにて送受信が可能である。
②Linux Networking StackとFast Pathのステータスは、Netlinkを使用し共有メモリで同期される。
③Data Planeは、専用化および最適化されてDPDK上で実行される。
④eBPFは、Linuxカーネル内でのイベント発生時に実行される処理を、カーネルモジュールの追加やソースコードの変更等を必要とせずに実行する為の機能を持つ。
⑤通常処理および基本例外処理は、標準のNetwork Interfaceで着信扱いされる。
⑥特別例外処理、例えば元のパケットが復元出来ずFast PathによってLinux Networking Stackに送信出来ない場合は、eBPFによって処理される。

Fast Pathは6WIND VSRのCLIを利用し設定および制御が可能である。
当記事では、Ethernet NICの高速化の為にFast Pathの有効化およびオプションを設定してみた。


当方の環境
ホスト機:macOS 13.3.1 / MacBook Pro 2020 / RAM: 16GB / CPU: Intel Core i5 2.0GHz
仮想化環境:Oracle VirtualBox 7.0.6
ゲストOS:6WIND VSR 3.4.10


6WIND VSRのFast Pathの設定
前回および前々回に実施したインターフェース設定やルーティング設定を残した状態で、Fast Pathを設定する。
ただし、Fast Pathを含めDPDK周りの設定は初期設定の際に実施するのが一般的だろう。初期設定から始める場合は以下のリンク先を参照。
https://debslink.hatenadiary.jp/entry/20230329/1680017202 6WIND VSRを試用してみた

Fast Pathの有効化
まずは、イーサネットNICを高速化する為に、対象のNICをFast Path専用にする設定を行う。
自分の環境では、WAN方向およびLAN方向のイーサネットNICをFast Pathの対象とした。

jpmtkvmrt99> edit running
jpmtkvmrt99 running config# system fast-path
jpmtkvmrt99 running fast-path#! port pci-b0s3
jpmtkvmrt99 running fast-path# port pci-b0s8
jpmtkvmrt99 running fast-path# port pci-b0s9
jpmtkvmrt99 running fast-path#
jpmtkvmrt99 running fast-path# commit
Configuration committed.
jpmtkvmrt99 running fast-path#

commitコマンドで設定内容の保存後、show configコマンドを打ち設定内容の確認。
cp-protection設定およびadvanced設定より下側は自動で入ったものであり、後で修正する事は可能である。

jpmtkvmrt99 running fast-path# show config
fast-path
    enabled true
    port pci-b0s3
    port pci-b0s8
    port pci-b0s9
    cp-protection
        budget 10
        ..
    advanced
        mask-irq true
        ipv4-netfilter-cache true
        ipv6-netfilter-cache true
        ipv4-pre-ipsec-fragmentation off
        ipv6-pre-ipsec-fragmentation off
        ipv6-lpm-long-prefix-optimization false
        ..
    linux-sync
        fpm-socket-size 2097152
        nl-socket-size 67108864
        ipset-dump-delay 1
        ..
    ..
jpmtkvmrt99 running fast-path#


Core MaskおよびFast Pathのカスタマイズ
以下はCore Maskの設定である。
Core Maskとは転送に使用するCPUコアを指定する事を指す。
・まずは、設定対象のNICを指定。下記ではpci-b0s3を指定。
・Linux側からパケットを受信するデータプレーン コアを指定。デフォルトでは全てのデータプレーン コア。下記では#5と#9〜#12を指定。
・例外処理のパケットを受信するコントロールプレーンのコアを指定。デフォルトでは最初のコントロールプレーンのコア(#0)。下記では#0〜#4を指定。

jpmtkvmrt99 running fast-path# port pci-b0s3
jpmtkvmrt99 running fast-path# core-mask
jpmtkvmrt99 running core-mask# fast-path 5,9-12
jpmtkvmrt99 running core-mask# exception 0-4
jpmtkvmrt99 running core-mask#
jpmtkvmrt99 running core-mask# commit
Configuration committed.
jpmtkvmrt99 running core-mask#

設定を終えたらcommitコマンドで設定内容の保存。
show configコマンドを打ち設定内容の確認。
Fast Pathが有効になっている事と、Port(NIC)が3つ共正常にアサインされている事が分かる。
Core Maskの設定が反映されている事が分かる。

jpmtkvmrt99 running core-mask# ..
jpmtkvmrt99 running fast-path# show config
fast-path
    enabled true
    port pci-b0s3
    port pci-b0s8
    port pci-b0s9
    core-mask
        fast-path 5,9-12
        exception 0-4
        ..
    cp-protection
        budget 10
        ..
    advanced
        mask-irq true
        ipv4-netfilter-cache true
        ipv6-netfilter-cache true
        ipv4-pre-ipsec-fragmentation off
        ipv6-pre-ipsec-fragmentation off
        ipv6-lpm-long-prefix-optimization false
        ..
    linux-sync
        fpm-socket-size 2097152
        nl-socket-size 67108864
        ipset-dump-delay 1
        ..
    ..
jpmtkvmrt99 running fast-path#


Fast Pathの制限設定
Fast Pathの機能は、スケーラビリティやメモリフットプリント等の要件に応じて調整が可能。
以下は、VRの数やIPv4 ルートの設定。
・VRFの最大数を指定。下記では128個で設定。
・IPv4な経路の最大数を指定。下記では1000000本で設定。

jpmtkvmrt99 running fast-path# port pci-b0s3
jpmtkvmrt99 running fast-path# limits
jpmtkvmrt99 running limits# fp-max-vrf 128
jpmtkvmrt99 running limits# ip4-max-route 1000000
jpmtkvmrt99 running limits#
jpmtkvmrt99 running limits# commit
Configuration committed.
jpmtkvmrt99 running limits#
jpmtkvmrt99 running limits# ..
jpmtkvmrt99 running fast-path#

設定を終えたらcommitコマンドで設定内容の保存。
show configコマンドを打ち設定内容の確認。
fp-max-vrfとip4-max-routeの行が追加されている事が分かる。

jpmtkvmrt99 running fast-path# show config
fast-path
    enabled true
    port pci-b0s3
    port pci-b0s8
    port pci-b0s9
    core-mask
        fast-path 5,9-12
        exception 0-4
        ..
    cp-protection
        budget 10
        ..
    advanced
        mask-irq true
        ipv4-netfilter-cache true
        ipv6-netfilter-cache true
        ipv4-pre-ipsec-fragmentation off
        ipv6-pre-ipsec-fragmentation off
        ipv6-lpm-long-prefix-optimization false
        ..
    limits
        fp-max-vrf 128
        ip4-max-route 1000000
        ..
    linux-sync
        fpm-socket-size 2097152
        nl-socket-size 67108864
        ipset-dump-delay 1
        ..
    ..
jpmtkvmrt99 running fast-path#


コントロールプレーンの保護
ARPのパケットやL3ルーティングで使用されるパケットやIKEで使用される制御パケット等を失う事が無いように、コントロールプレーン保護の機能によりこれらのコントロール パケットをドロップするリスクを減らす。
・対象のNICにてコントロールプレーンの保護設定。CPUバジェット数を10に設定。
・対象のNICにて、パケットの送受信共にコントロールプレーン保護を有効に設定。

jpmtkvmrt99 running fast-path# port pci-b0s3
jpmtkvmrt99 running fast-path# cp-protection budget 10
jpmtkvmrt99 running fast-path# / vrf main interface physical eth0
jpmtkvmrt99 running physical eth0# port pci-b0s3
jpmtkvmrt99 running physical eth0# rx-cp-protection true
jpmtkvmrt99 running physical eth0# tx-cp-protection true
jpmtkvmrt99 running physical eth0#
jpmtkvmrt99 running physical eth0# commit
Configuration committed.
jpmtkvmrt99 running physical eth0#

設定を終えたらcommitコマンドで設定内容の保存。
show configコマンドを打ち設定内容の確認。
cp-protectionの値が15になっている事が分かる。

jpmtkvmrt99 running vrf main# / system fast-path
jpmtkvmrt99 running fast-path#
jpmtkvmrt99 running fast-path# show config
fast-path
    enabled true
    port pci-b0s3
    port pci-b0s8
    port pci-b0s9
    core-mask
        fast-path 5,9-12
        exception 0-4
        ..
    cp-protection
        budget 15
        ..
    advanced
        mask-irq true
        ipv4-netfilter-cache true
        ipv6-netfilter-cache true
        ipv4-pre-ipsec-fragmentation off
        ipv6-pre-ipsec-fragmentation off
        ipv6-lpm-long-prefix-optimization false
        ..
    limits
        fp-max-vrf 128
        ip4-max-route 1000000
        ..
    linux-sync
        fpm-socket-size 2097152
        nl-socket-size 67108864
        ipset-dump-delay 1
        ..
    ..
jpmtkvmrt99 running fast-path#


データプレーン コアの分離
最後に、データプレーンにてネットワークパケットの処理を​​担当するコアを明示的に指定する。
設定の完了後はopy running startupコマンドを打ち、設定内容を保存する。

jpmtkvmrt99 running fast-path# ..
jpmtkvmrt99 running system# ..
jpmtkvmrt99 running config# system cp-mask 0
jpmtkvmrt99 running config#
jpmtkvmrt99 running config# commit
Configuration committed.
jpmtkvmrt99 running config#
jpmtkvmrt99 running config# copy running startup
Overwrite startup configuration? [y/N] y
jpmtkvmrt99 running config#
jpmtkvmrt99 running config# exit
jpmtkvmrt99>

ちなみに、コントロールプレーンに関わるCPUコアを表示させる際は、以下のコマンドを打つ。

jpmtkvmrt99> show state system cp-mask
cp-mask 0-1
jpmtkvmrt99>


今回はここまで。
6WIND VSRに実装されていFast Pathの設定に触れてみた。本来であればFast Pathの有効前と比較する為に疎通確認をすべきところなのだが、環境が整っていない為に今回は設定のみとした。
また、Fast Pathの設定内容もきちんとした要件定義に基づいたものでなければならない。
Fast Pathは、VMware ESXiやKVMやXEN等のようなハイパーバイザ環境にデプロイされたソフトウェアルータにて実力が発揮される。Virtualbox等とは異なり、ホスト機のハードウェア上で直接動作するソフトウェアルータはFast PathやDPDKの効力を充分に発揮する事が出来るだろう。


参照サイトなど
https://www.6wind.com/ 6WIND
https://www.6wind.com/vrouter-vsr-solutions/ 6WIND VSR
https://doc.6wind.com/new/vsr-3/3.4/vsr-guide/user-guide/index.html 6WIND VSRドキュメント
https://doc.6wind.com/new/vsr-3/3.4/vsr-guide/user-guide/cli/system/fast-path.html Fast path
https://www.6wind.com/6windgate-5-0-versus-vpp-fast-path-benefits-from-linux-integration-and-ebpf/ 6WINDGate
https://www.dpdk.org/ DPDK

6WIND VSR関連の記事
https://debslink.hatenadiary.jp/entry/20230329/1680017202 6WIND VSRを試用してみた
https://debslink.hatenadiary.jp/entry/20230404/1680606122 6WIND VSRでOSPFとBGPの設定
https://debslink.hatenadiary.jp/entry/20230427/1682597891 6WIND VSR評価版レビュー