Slide 1

Slide 1 text

P4 ちょっと調べてみた Mar 20, 2018 Masaru OKI @masaru0714

Slide 2

Slide 2 text

P4の前にASICの話 ● ASIC - Application Specific Integrated Circuit 特定用途向け集積回路。 ● ネットワーク機器向けのASICは、ハードウェアでパケット処理する LSI。 ● パケット転送やVLAN処理などはASICで。BGPなど複雑な処理はCPUで。 ● CPUを使わずASICだけで処理すると高速。CPUを介すると低速。 CPU ASIC メモリ ストレージ PHY PHY PHY PHY 管理用NIC 設定、運用 ・ユーザートラフィック ・BGP, OSPF等

Slide 3

Slide 3 text

ASICは万能ではない ● 集積回路を設計して試作、テスト、修正、試作、テストの繰り返し。 ● 完成までに相当の時間とコストがかかる。数年、数億円。 ● かかわる人数も大きい。数人でできるものではない。 ● 大量に長期供給することによってコストを回収する。 ● 設計変更は簡単ではない。ソフトウェアのような感覚では変更できない。 ● つまり設計段階で盛り込んだ機能以外のことはできない。 カスタムデータプレーンを実現するには通常の ASICでは力不足

Slide 4

Slide 4 text

プログラマブルなパケット処理ハードウェア ● FPGA - Field Programmable Gate Array ○ 外部から回路情報を流し込んで回路を作れる LSI。試作や少量生産向け。 ○ FPGA自体はとくにネットワーク向けに特化というわけではない。 ○ FPGAを搭載したNICがある。 ● Smart NIC ○ 定義があいまい だが、ここではCPUを介さず複雑な処理ができる NICの総称とする。 ○ FPGA内蔵NIC、ARM内蔵NIC、NPU搭載NIC、あるいは単に多機能な NIC。 ○ 基本的にPCやサーバに取り付けて使う。 ○ 価格はピンキリ。 ● プログラマブルASIC ○ ネットワーク向け ASICであるが、機能を外部からプログラミングできる製品。 ○ パケット処理ロジック (ヘッダフィールドの値が xxだったら書き換る、等 )を記述可能。 ○ ソフトウェア開発のように設計変更が可能。 ○ プログラマブルASICを採用したネットワークスイッチ製品がある。

Slide 5

Slide 5 text

プログラマブル、何が嬉しい? ● 典型的なパケット処理(L2,L3,ACL,QoS)でいいなら、従来の製品でいい。 ● 多機能なものは高価格になるし使わない機能もあってコスト効率が悪い。 ○ ある特殊な機能だけ使いたいときに、他の機能を含めたお金を払うことに。 →従来のASICでは、処理できないパケットはどうやったって処理できない。 ● 新しいトンネルプロトコルに対応できない (数年前のVXLANのような状況)。 ○ 最近で言えば、例えば SRv6 ● CPU回しにすれば、一応、処理できるが、遅くて実用にならない。 ● 特殊なアクションは実行できない。 CPU回しにすれば(以下同文) プログラマブルなら、処理を書き足せば、すぐ対応できる!

Slide 6

Slide 6 text

どうやってプログラムを入れる? ● それぞれの製品ごとに用意されている手段で書き込む。 互換性はない。 ○ ツールで書き込む、アプリケーション起動時に書き込む、等。 ○ 書き込み専用の USB接続が別途必要なハードウェアもある。 ● エンドユーザができるのは、 (できたとして)何を書き込むかを選ぶ程度。 CPU ASIC メモリ ストレージ PHY PHY PHY PHY 管理用NIC

Slide 7

Slide 7 text

プログラム開発の手段 ● FPGA: OpenCL等で記述して(HDL中間出力を介して)回路データに変換 ● FPGA: VerilogなどのHDL(ハードウェア記述言語)を直接書いて変換 ● Smart NIC: 製品ごとのSDKを用いて(主にC/C++言語で記述して)コンパイル ● プログラマブルASIC: 製品ごとのSDKを用いて(同上)コンパイル 問題点 ● ターゲットが変わるたびに一から学習する必要がある ● 成果物の、ターゲット間の再利用ができない ● 特定ベンダーの特定製品に依存することになる ● 技術情報を共有できない(SDKがNDAベースで提供されるため) ● 成果物をオープンにできない

Slide 8

Slide 8 text

ターゲット非依存の開発手段: P4 https://p4.org/ ● P4 is a high-level language for programming network switches. ● 命名由来: Programming Protocol-Independent Packet Processors ● ネットワークスイッチをプログラムするための高級言語。 ● プロトコル非依存、ターゲット非依存。 ● FPGA、Smart NIC、プログラマブルASIC、ソフトウェアの実装がある。 ● 代表的な対応製品はBarefoot Tofino (プログラマブルASIC)。 ● https://github.com/p4lang で仕様書やサンプルコードなど公開中。 ● P4 Language Consosiumは2018年3月、ONFとLinux Foundationに加入。

Slide 9

Slide 9 text

P4を使ったデータプレーン開発と、その設定 P4で定義できるもの ● parser ● match field ● action ● table ● pipeline テーブルへのエントリ設定方法は各自で用意。 OpenFlowのmatchやaction, pipelineの仕様を自分で定義 できる(自分で作らないといけ ない) OpenFlow Protocolのような標 準の設定プロトコルはないので 製品ごとに違う

Slide 10

Slide 10 text

P4でデータプレーンをプログラムする ● ソースは共通(例外あり)。 ● コンパイラはターゲット別。 ● バイナリも。 ● ASICへの投入も別(でした)。 ● 設定も別。 CPU ASIC メモリ ストレージ PHY PHY PHY PHY 管理用NIC P4ソースコー ド P4 コンパイラ ターゲット用 バイナリ

Slide 11

Slide 11 text

P4でデータプレーンをプログラムする(PIを使用) ● ソースは共通(例外あり)。 ● コンパイラはターゲット別。 ● バイナリも。 ● ASICへの投入は共通! ● 設定も共通! CPU ASIC メモリ ストレージ PHY PHY PHY PHY 管理用NIC P4ソースコー ド P4 コンパイラ ターゲット用 バイナリ

Slide 12

Slide 12 text

● P4Runtime Protocolを使い設定を投入する ● バイナリ投入も ● CLIも用意される ● https://github.com/p4lang/PI ○ Protocol Independent APIの略 ● 普及はこれから? switch PI (P4Runtime) ASIC OS (driver) P4Runtime gRPC server P4Runtime Controller C言語で用意されたライブラリ を呼び出して作成する (あるいはベンダが提供する ) P4Runtime Protocol アプリケーション フロントエンド P4ソー スコー ド P4 コンパイ ラ ターゲット用 バイナリ

Slide 13

Slide 13 text

すぐ試せるソフトウェア実装: bmv2 https://github.com/p4lang/behavioral-model ● bmはBehaviorial Modelの略。 ● bmをターゲットにしたP4コンパイラはP4を入力とし、JSONを出力する。 ● bmv2はJSONを読み込んで、P4で書かれたとおりの振る舞いを実行する。 ● 実用的な速度では動作しないので機能検証用。 他のソフトウェア実装 ● P4@ELTE/p4c DPDKを使うバイナリを出力する P4コンパイラ ● BMAcc (リンク先はPDF) DPDKを使ってBMv2を高速化したという発表 ● PISCES P4によるカスタマイズが可能な OVSベースのソフトウェアスイッチ

Slide 14

Slide 14 text

P4-14とP4-16の二つの仕様 P4-14 header_type ethernet_t { fields { dstAddr : 48; srcAddr : 48; etherType : 16; } } add_to_field(ipv4.ttl, -1) P4-16 typedef bit<48> macAddr_t; header ethernet_t { macAddr_t dstAddr; macAddr_t srcAddr; bit<16> etherType; } modify_field(ipv4.ttl, ipv4.ttl - 1) 書式が全然違っていて互換性がない! P4対応を謳っている製品の多くが対応しているのは P4-14

Slide 15

Slide 15 text

Portable Switch Architecture (PSA) ● https://p4.org/p4-spec/docs/PSA-v1.0.0.html ● P4における標準ライブラリの仕様。 ○ C言語に例えるとlibcに相当するもの。 ● リファレンス実装まで提供されているわけではない模様。 ● 各ベンダーが? PSAのpackageを提供すると、開発が楽になる。 ● P4-16用。 ● 2018年3月に仕様が1.0になったばかりなので今すぐには使えない。

Slide 16

Slide 16 text

P4も万能ではない? ● QoSはデバイスにより機能やパラメータが様々で、P4で標準化されていない ○ meterとしてcolorをつけることまではできる。 ● パケットのfragmentationやreassembleはできず、パケット生成機能はない ● fast path, slow pathといった帯域の割り当てはできない ● テーブルサイズ(最大エントリ数)の指定はターゲット依存パラメータ ● タイマーは用意されていない ベンダーによって違うが、独自パッケージとして提供していて(あるいは他の言語を使ってユーザが開発可能)、そのパッ ケージをP4を介して呼び出せるようにすることで解決できることがある。 ● 例1 Netronome: C/C++で作成した機能とP4をSmartNIC内で接続できる ● 例2 Mellanox: L2/L3機能は従来のASICのロジックが提供され利用可能

Slide 17

Slide 17 text

まとめ ● P4を使うとベンダ非依存のデータプレーンのプログラミングができる ● P4Runtimeが使えるようになると、設定なども標準化できる ● PSAが普及すると開発がよりいっそう楽になる ● 現在普及しているのはP4-14 ● P4-16への対応が今後の普及の鍵 ● bmv2(ソフトウェア実装)を使えば、手元で試せる 誰もがカスタムデータプレーンを作れる時代がやってくる! (かもしれない)

Slide 18

Slide 18 text

参考資料 ● プログラマブル・データプレーン時代に向けた ネットワーク・オペレーションスタック ● P4のはなし ● Announcing P4Runtime ● P4-based Dataplane with DPDK ● P4/CによるSmartNICファームウェア開発の取組み