Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
eBPFをFreeBSDにポーティングしようとしている話
Search
Yutaro Hayakawa
November 05, 2018
Technology
4
2.8k
eBPFをFreeBSDにポーティングしようとしている話
Talk at : OSSセキュリティ技術の会 第四回勉強会 2018年秋のBPFまつり
FreeBSDへのeBPFのポーティングの取り組みとそのユースケース(VALE-BPF)についてです。
Yutaro Hayakawa
November 05, 2018
Tweet
Share
More Decks by Yutaro Hayakawa
See All by Yutaro Hayakawa
NetKit Device
yutarohayakawa
5
730
eBPFは何が嬉しいのか?
yutarohayakawa
3
1.6k
BufferbloatとLinux
yutarohayakawa
4
900
Prism: Proxies without the Pain
yutarohayakawa
0
190
ipftrace: A Linux Function Tracer for Network People
yutarohayakawa
4
5.5k
きっと明日から役立つeBPFのしくみ
yutarohayakawa
9
2.9k
eBPF Implementation for FreeBSD
yutarohayakawa
0
300
Other Decks in Technology
See All in Technology
20分で完全に理解するGrafanaダッシュボード
hamadakoji
3
650
DMM.com アルファ室採用案内資料
hsugita
1
150
推しは推せるときに推せ! プロダクトにフィードバックしていこう
nakasho
0
320
On Your Data を超えていく!
hirotomotaguchi
2
690
生産性向上チームの紹介
cybozuinsideout
PRO
1
870
家族アルバム みてねにおけるGrafana活用術 / Grafana Meetup Japan Vol.1 LT
isaoshimizu
1
750
今年のRubyKaigiはProfiler Year🤘
osyoyu
0
120
サーバー間 GraphQL と webmock-graphql の話 / server-to-server graphql and webmock-graphql
qsona
2
190
Google Cloud Next '24 Recap(Cloud Run/k8s)
mokocm
0
230
いつか使うかも貯金してたらめちゃめちゃ機能が増えてた話
riyaamemiya
0
150
Databricks における 『MLOps』
databricksjapan
2
170
Terraformあれやこれ/terraform-this-and-that
emiki
8
1.4k
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
78
42k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
187
16k
Unsuck your backbone
ammeep
663
57k
Being A Developer After 40
akosma
57
580k
WebSockets: Embracing the real-time Web
robhawkes
59
7k
Reflections from 52 weeks, 52 projects
jeffersonlam
345
19k
A Modern Web Designer's Workflow
chriscoyier
689
190k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
25
2.3k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
501
140k
The Invisible Customer
myddelton
114
12k
Art, The Web, and Tiny UX
lynnandtonic
289
19k
A better future with KSS
kneath
231
16k
Transcript
早川侑太朗 (慶応義塾大学) Mail:
[email protected]
Twitter: @YutaroHayakawa 1 eBPFをFreeBSDにポーティング しようとしている話
自己紹介 名前: 早川侑太朗 (はやかわ ゆうたろう) 職業: 修士学生 (慶應義塾大学・政策メディア研究科 2年) 研究分野
- 高速ソフトウェアパケット処理 - ネットワークプログラマビリティ - SDN・NFV オープンソース活動 - FreeBSD, Netmap, uBPF, LLVM (BPF関係) - Google Summer of Code 2018 (FreeBSD) Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 2
今日のお話 1. FreeBSDへのeBPFのポーティング 2. VALE-BPF: 高速パケット処理への応用 Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話
3
今日のお話 1. FreeBSDへのeBPFのポーティング 2. VALE-BPF: 高速パケット処理への応用 Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話
4
FreeBSDにeBPFは必要? LinuxがeBPFを使ってやっていることはFreeBSDではもう大体できる(?) - プログラミングインターフェース, サンドボックスとしてのeBPFはやはり魅力的 - LinuxのようにもともとあったフレームワークにeBPFを使える機能を足す 個人的にはNetmap/VALEと組み合わせて高速パケット処理に使いたい Yutaro Hayakawa
| eBPFをFreeBSDにポーティングしようとしている話 5 機能 Linux FreeBSD ダイナミックトレーシング eBPF + kprobe / perf DTrace システムコールフィルタリング eBPF + seccomp MAC Framework トンネリング eBPF + LWT Netgraph 高速パケット処理 (eBPF +) AF_XDP / XDP Netmap / VALE
ポーティングにあたって必要なこと ライセンスの問題があるのでコードはスクラッチ 今のeBPFにはLinux依存の機能があるで, 非依存の部分だけ取り出す - sk_buffを操作する命令 - Map (e.g. dev_map
sock_map cpu_map... ) - Verifier FreeBSDのセキュリティ要件との折り合いをつける - 特権の無いユーザに対してeBPFプログラムのロードを許すか - Specture... Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 6
generic-ebpf マルチプラットフォームなeBPFランタイムとサブシステムの実装 - ユーザスペースとカーネル両方で動く - libebpf.so とか ebpf.ko みたいなライブラリとして使える Linux依存の機能を削って汎用的に使えるものをまずは目指す
- インタプリタ・JITコンパイラ - Map - Verifier Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 7 ソース: https://github.com/YutaroHayakawa/generic-ebpf
現在のステータス (1/2) サポートしているプラットフォーム - カーネル: FreeBSD, Linux - ユーザスペース: FreeBSD,
Linux, macOS - 現状各プラットフォームごとに300行程度の小規模なグルーコード - それ以外の約4000行は共有 主な機能 - uBPFベースのインタプリタとx86-64のJITコンパイラ - Array map, Hash mapとそのPer-CPUバリアント - bpf(2)の代替としてキャラクタデバイス + ioctl(2)のインターフェース - Verifierはまだ... Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 8
現在のステータス (2/2) FreeBSD側への働きかけ - LLVMの(e)BPFバックエンドは追加済み (デフォルトではOFF) - BSDCan2018にて講演 (https://youtu.be/4vGZm2qlEBY) -
GSoC2018のプロジェクトとして採択 (https://wiki.freebsd.org/SummerOfCode2018Projects/eBPF ) - マージに向けて現在も開発中 ユースケース案募集中 Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 9
今日のお話 1. FreeBSDへのeBPFのポーティング 2. VALE-BPF: 高速パケット処理への応用 Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話
10
汎用OS上のソフトウェアパケット処理の問題 Ethernetの高速化 (10G, 40G, 100G ...) ワイヤーレートを出すには? (10Gの場合) - 最小フレームサイズ
(64B) で1パケットの処理にかけられる時間は67.2ns - 参考値: システムコール1回: 41.85ns, キャッシュミス1回: 32ns 従来のrawパケットIOフレームワーク(raw-socket, cBPF, tap...)の限界が浮き彫りに - Per Packetのシステムコール (read/write), メモリコピー, 動的メモリ確保 抜本的なOSの仕組みの見直しが必要に Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 11 参考:http://netoptimizer.blogspot.com/2014/05/the-calculations-10gbits-wirespeed.html
Intelの解法: DPDK (Data Plane Development Kit) ポーリング (⇔割り込み駆動) によって高速なパケットIOを実現 -
パケットIOのためにCPUを占有 - CPU使用率は常に100% カーネルの機能を殆ど使わず, デバイスドライバをユーザス ペースで実装 - いわゆる「カーネルバイパス」 とにかく速さを追求した設計 Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 12 App DPDK Library Poll Mode Driver User Kernel NIC Protocol Stack
Linuxの解法: XDP (eXpress Data Path) カーネルバイパスを避け, デバイスドライバでパケットをフック - eBPFを使ってパケット処理を記述 -
他のNICにパケットをリダイレクトできる - プロトコルスタックを使った処理にフォールバック可能 ユーザスペースにパケットをリダイレクトする機能 (AF_XDP) - 次世代Raw Socket XDPのハードウェアオフローディングができる製品も... - Netronome Agilio シリーズ Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 13 App Driver User Kernel NIC eBPF AF_XDP Protocol Stack NIC
FreeBSDの解法は?
FreeBSDの解法1: Netmap NICのパケットバッファをユーザスペースにmmap - バッチング - ゼロコピーパケット転送 - 静的にパケットバッファを確保 FreeBSDには2011年から標準で入っている
LinuxのAF_XDPやDPDKなどと似た機能 Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 15 Kernel User NIC Driver NIC Packet Buffer mmap’ed Shared Memory App /dev/netmap Kick TX/RX ioctl()
FreeBSDの解法2: VALE (Virtual Local Ethernet) Netmapベースの高速カーネル内スイッチ スイッチングロジックをカーネルモジュールで変えられる → パケットバッファやその他メタデータを受け取って出力ポートの番号を返す関数 LinuxのXDPと似た機能
Yutaro Hayakawa | eBPF implementation for FreeBSD 16 Kernel User netmap API netmap API mylookup uint32_t mylookup(struct nm_bdg_fwd *ft, uint8_t *dst_ring, struct netmap_vp_adapter *na, void *private_data) { struct ip *iph; iph = (struct ip)(buf + ETHER_HDR_LEN); if (iph - ft->ft_buf > ft->ft_len) { return NM_BDG_DROP; } return ntohl(iph->ip_dst) & 0xff; } mymodule.ko VALE Physical NIC VALE Port VALE Port
VALEの欠点 VALEモジュールを書くのはしんどい - カーネルの動きを強く意識して書く必要がある - 割り込みコンテキストとシステムコールコンテキストの区別 - ロックの使い分け 自由度が高すぎる -
カーネル内の機能は使い放題 - 逆にカーネルを壊し放題できてしまう Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 17
VALEの欠点 VALEモジュールを書くのはしんどい - カーネルの動きを強く意識して書く必要がある - 割り込みコンテキストとシステムコールコンテキストの区別 - ロックの使い分け 自由度が高すぎる -
カーネル内の機能は使い放題 - 逆にカーネルを壊し放題できてしまう Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 18 ここでeBPFが使えれば素敵なものができるのでは??
VALE-BPF カーネルモジュールを書く代わりに eBPFでVALEのス イッチングロジックが書ける VALEモジュールの中でeBPFのフックを実行 - VALE側に変更を加えずに実装可能 - JITを使えばパフォーマンス低下は少ない FreeBSDでのeBPFのユースケースとして提案中
Yutaro Hayakawa | eBPF implementation for FreeBSD 19 Kernel User netmap API netmap API vale-bpf.ko VALE eBPF lookup logic Physical NIC eBPF Program ソース: https://github.com/YutaroHayakawa/vale-bpf VALE Port VALE Port
パフォーマンス End-to-endのスループットを2つのケースでベンチマーク - Swap MAC: MACアドレスのsrcとdstをスワップしてフォワード - No Logic: パケットには触れずに右から左にフォワード
生のVALEモジュールの場合と比べおよそ9%ほどのパフォーマンスペナルティ XDPに比べて2%ほどのパフォーマンスゲイン Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 20 Swap MAC [Mpps] No Logic [Mpps] VALE 14.88 (wire rate) 14.88 (wire rate) VALE-BPF 13.58 13.62 XDP (redirect_map) 13.33 13.36 pkt-gen TX pkt-gen RX vale vale-bpf xdp 10GbE 10GbE Machine1 Machine2
まとめ 1. FreeBSDにとってもeBPFは魅力的な技術である 2. generic-ebpfというプロジェクトがFreeBSDマージに向けて進行中 3. ユースケースとして高速パケット処理基盤 VALE-BPFを提案中 Yutaro Hayakawa
| eBPFをFreeBSDにポーティングしようとしている話 21