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
3.2k
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
Ciliumはどうテストされているのか
yutarohayakawa
1
140
How is Cilium Tested?
yutarohayakawa
5
470
eBPFのこれまでとこれから
yutarohayakawa
22
6.7k
NetKit Device
yutarohayakawa
4
1.1k
eBPFは何が嬉しいのか?
yutarohayakawa
3
2k
BufferbloatとLinux
yutarohayakawa
4
1.4k
Prism: Proxies without the Pain
yutarohayakawa
0
240
ipftrace: A Linux Function Tracer for Network People
yutarohayakawa
4
5.9k
きっと明日から役立つeBPFのしくみ
yutarohayakawa
9
4.4k
Other Decks in Technology
See All in Technology
白金鉱業Meetup_Vol.19_PoCはデモで語れ!顧客の本音とインサイトを引き出すソリューション構築
brainpadpr
2
320
New Cache Hierarchy for Container Images and OCI Artifacts in Kubernetes Clusters using Containerd / KubeCon + CloudNativeCon Japan
pfn
PRO
0
150
脅威をモデリングしてMCPのセキュリティ対策を考えよう
flatt_security
4
1.6k
DB 醬,嗨!哪泥嘎斯基?
line_developers_tw
PRO
0
150
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
3
17k
AWS と定理証明 〜ポリシー言語 Cedar 開発の舞台裏〜 #fp_matsuri / FP Matsuri 2025
ytaka23
9
2.4k
比起獨自升級 我更喜歡 DevOps 文化 <3
line_developers_tw
PRO
0
160
Nonaka Sensei
kawaguti
PRO
3
660
AI技術トレンド勉強会 #1MCPの基礎と実務での応用
nisei_k
1
190
Copilot Agentを普段使いしてわかった、バックエンド開発で使えるTips
ykagano
1
980
TODAY 看世界(?) 是我們在看扣啦!
line_developers_tw
PRO
0
160
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
6.4k
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
228
22k
Building a Modern Day E-commerce SEO Strategy
aleyda
41
7.3k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
43
2.4k
Being A Developer After 40
akosma
90
590k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.3k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
53k
Agile that works and the tools we love
rasmusluckow
329
21k
Reflections from 52 weeks, 52 projects
jeffersonlam
350
20k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
Rails Girls Zürich Keynote
gr2m
94
14k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
52
2.8k
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