$30 off During Our Annual Pro Sale. View Details »

P4とICTSCにおいての利活用例

 P4とICTSCにおいての利活用例

Takeru Hayasaka

March 07, 2021
Tweet

More Decks by Takeru Hayasaka

Other Decks in Technology

Transcript

  1. P4とICTSCにおいての 利活用例 Takeru Hayasaka(@takemioIO) 2021/03/07 ICTSC2020 LT会 https://unsplash.com/photos/JLkx0lRkXuk 1

  2. アウトライン 1. Overview: P4とは 2. NAVTと実装について 3. まとめと感想 2

  3. Overview https://unsplash.com/photos/ur7BDi9MpXg 3

  4. パケット処理はどこでやる? • パケット処理可能な場所がいくつか存在する • Software?Hardware? • UserLand?KernelLand? • FPGA?ASIC?TPU?こんがり焼いた独自の石? •

    処理技術も手法もいくつかある • LKM/netfliter queue/socket programing.. • XDP/ebpf/DPDK/netmap/PF_RING... • openflow/P4/SR-IOV/SmartNIC/Whitebox... • RSS/RPF/RFS/XPS... 4
  5. ASICスイッチ • 近年ではパケット処理の速度がソフトウェアでは頭打ちへ CPU性能あたりの処理性能からASICを利用しつつ自由度の高い Programmable switchを選ぶようになってきた • CPU: 固定化された汎用チップ(ハーバード、フォンノイマン型など)に加え てGPIO,USBなどのペリフェラルが入ってるやつ

    • FPGA: NANDなどできており、VHDLなどで書くと任意の回路を構築できる チップ • ASIC: 特定分野に特化したチップ. CPU, mem, 特定のパイプライン など従来の構成から肉抜きしたり増したりなどをした専用チップ つまりドメイン特化型のプロセッサの例となる 5
  6. ASICスイッチを動かすOS(NOS) • 商用 • ArcOS (Arrcus) • Cumulus(NVIDIA) ←今年も使ってたNOS •

    OcNOS (IP Infusion) • PicOS(Pica 8) • OSS • SONiC(frr-rpm + driver) • DENT(switchdev) • RARE(P4Runtime + P4)←今日の話はこれ これらを動かすOSひとつとってもかなりの種類があり、 また参画してる会社を見ても大規模データセンターでの 流行が見て取れることがわかる 6
  7. P4: パケット処理特化プログラミング言語 P4: Programming Protocol-Independent Packet Processors ASICなどの専用ハードをターゲットとする プログラミング言語で、アーキテクチャごとのライブラリ とそれをもとにP4でパケット処理系を書くことができる

    以下の図はP4の全体アーキテクチャ 7 cf. https://p4.org/assets/P4_D2_East_2018_01_basics.pdf
  8. P4Switchアーキテクチャ 処理に関してもハードウェアごとにアーキテクチャがある 以下はBMv2と言われるP4で動くSoftwareSwitchだが 実際のハードウェアでも以下のように 「parser」「ingress」「egress」「deparser」でコンポーネント パケットを解析しつつ処理を行い最後に構築するというパイプラインで処理 される 8 cf. https://p4.org/assets/P4_D2_East_2018_01_basics.pdf

  9. NAVTと実装について https://unsplash.com/photos/baII27W6z7k 9

  10. NAVTの歴史 ICTSC6: LKMで実装 ICTSC7: Openflow+Ryu ICTSC8: LKM, ARP動的解決対応 ICTSC9-2018: Openflow+Ryu(7と同じ)

    ICTSC2019: VPP SRv6 Function化(NAVTではなくこれは普通のNAT) 今回は.... P4 で 100GbE Ready!初めてのHW動作化!!!!! 10
  11. NAVT with P4 Switch • NAVT: Network Address VLAN Translation

    ◦ トラコンの問題環境を支える変換プロトコル IP: src=172.16.2.1, dst=10.1.0.1 Ethernet: src=xxx, dst=yyy TCP: src=19485, dst=22 IP: src=172.16.2.1, dst=192.168.0.1 Ethernet: src=xxx, dst=yyy TCP: src=19485, dst=22 VLAN: vid=100 再掲
  12. NAVT with P4 Switch 192.168.4.1 192.168.4.1 10.1.4.1 10.20.4.1 再掲

  13. NAVT with P4 Switch • NAVT: Network Address VLAN Translation

    ◦ トラコンの問題環境を支える変換プロトコル IP: src=10.7.4.1, dst=160.16.73.123 Ethernet: src=xxx, dst=yyy TCP: src=58193, dst=443 IP: src=192.168.4.1, dst=160.16.73.123 Ethernet: src=xxx, dst=yyy TCP: src=58193, dst=443 VLAN: vid=700 再掲
  14. NAVT with P4 Switch • 今年はP4を用いてNAVTの実装を行った ◦ https://github.com/takehaya/p4-navt • ハードウェアのP4スイッチをお借りした

    ◦ Edgecore Wedge 100BF-32X 再掲
  15. 機材と協賛様 実際のP4専用ハードとしては BarefootTofinoと呼ばれる専用ASIC が有名であり今回我々も採用した 機材はAPPRESIA SYSTEMS 様から Edgecore Wedge 100BF-32X

    これを活かすためにコアで利用した 10G NICはさくらインターネット様よりお 借りした。 この場を借りて感謝申し上げる🙇‍♀🙇‍♀ 15 WedgeとMellanox が100Gで接続されている
  16. P4Switchアーキテクチャ 処理に関してもハードウェアごとにアーキテクチャがある 以下はBMv2と言われるP4で動くSoftwareSwitchだが 実際のハードウェアでも以下のように 「parser」「ingress」「egress」「deparser」でコンポーネント パケットを解析しつつ処理を行い最後に構築するというパイプラインで処理 される 16 cf. https://p4.org/assets/P4_D2_East_2018_01_basics.pdf

    再掲
  17. NAVTの実装について NAVT(https://github.com/takehaya/p4-navt )について説明する P4は parser, ingress, egress, deparserというコンポーネントで 作られているので今回はどこでどのような処理をすると実装できるか を説明していく

    Parser: P4においてパケットをどこまで読むかを示すところ。 例えばL3までのパケットしか処理をしないなどはここで示す 17
  18. Parsing Graph 18 IPv4 Ethernet IPv6 dot1q TCP UDP L2

    L3 L4
  19. Parsingのコード 19

  20. NAVTの実装について Ingress: P4においてパケット処理を行う場所。 多くのパイプラインではIngressで処理を行う。 また今回は実装していないがCPU側(つまりコントローラー側) にパケットを一度転送するかはここで判断する またNAVTの処理部分もここで行われる 20

  21. ingressのコードのmain関数的部分 21

  22. ingressのコードのdot1qがあるかの解析 22 ここでは vlanが存在すれば dot1qを変数に保存しておき tagであるとフラグを立てる もしそうでなければethertypeだけ保存 をしておく

  23. ingressのコードのNAVT部分その1 23 二つのテーブルを宣言してる inside: 外側から内側へを司る key: vlanID value: vlan/100の値, dst

    macaddr outside: 内側から外側へを司る key: /16の経路を表現できるlpm value: vlanID, dst macaddr
  24. ingressのコードのNAVT部分その2 24 ←許可されないアドレスなのでdrop ↑皆さんからきたパケットではな いのでdrop ←ちょうどNATしているところ 内部=>外部 ←ちょうどNATしているところ 外部=>内部

  25. Egress: P4において後処理を行うことが多い。 例えばDecapしたdot1q hdrをここで付け直したりどこのポートにルーティン グするかを判断する。 今回はここでdot1q encapを行っている NAVTの実装について 25

  26. egressのコード 26 ingressで保存した値を利用して ここでdot1qをEncapをする

  27. NAVTの実装について Deparser: 処理を行ったパケットのうちどのパケットを外部に構築して出力 するのかを司る。 27

  28. deparserのコード 28 emitした順にパケットが出力される これだけ見るとdot1qもなんとなく 必ずつけられそうに見えるが dot1q hdrが不正であるという フラグを立てておくことで 回避できる(e.g. setInvalid

    )
  29. 動作に関する情報 • 開発においての一週間のsflowのログを見るとピークで7Gbps ほどがパケットが流れていたが本大会ホットステージから 一度たりともハングや再起動がなく動作した 29

  30. 動作に関する情報 30 • 開発においての一週間のsflowのログを見るとピークで7Gbps ほど、合計で180GB程度流れていたが 一度たりともハングや再起動がなく動作した🎉

  31. 測定 • 今回のサーバー的に10GbE x 8本程度なので限界値を出すことは 難しいが、単純なperfだと9Gbpsぐらいは出そう 31

  32. NAVT with P4 Switch 再掲 • 今回のサーバー的に10GbE x 8本程度なので限界値を出すことは 難しいが、単純なperfを同時にしたらこんな感じ

    • おそらくだがバックエンドでcephが動いてるノードなので性能が 出ず...正しく測定する機材がなく....(涙)100GbE NICが欲しい
  33. まとめと感想 • P4+Tofinoを利用したNAVTを実装した • Tofino実機デバッグがしんどい2021 • tcpdumpが使えない • RX,TXのカウンタが回っているか、Tableにつけておいた カウンタが動いているかなどで見るしかなく

    Softwareでパケット処理するのは簡単なんだなと思った • シミュレーターと実機では全く挙動が違くてしんどい • OSS版(BMv2)は表現力が高く便利だがTofinoはつらい • bitshiftとかで表現ができなくて涙が出る • https://github.com/takehaya/p4-navt でBMv2バージョン は公開されているので遊んでみてください • https://github.com/takehaya/p4_vagrant_playground を使うと P4とBMv2で遊ぶ環境を手に入れれて便利 33