[[eBPF]] ## SRE / PlatformとLinuxカーネル KubeCon NA 2020の2021に注目する5つの技術. [https://twitter.com/CloudNativeFdn/status/1329863326428499971?s=20](https://twitter.com/CloudNativeFdn/status/1329863326428499971?s=20) [https://kccnceu20.sched.com/event/ZfCr/keynote-the-beginners-guide-to-the-cncf-toc-liz-rice-vp-open-source-engineering-aqua-security](https://kccnceu20.sched.com/event/ZfCr/keynote-the-beginners-guide-to-the-cncf-toc-liz-rice-vp-open-source-engineering-aqua-security) [Liz Rice: Following the 'Superpower' Promise of eBPF - The New Stack](https://thenewstack.io/liz-rice-following-the-superpower-promise-of-ebpf/) ## eBPF introduction Linux BPF Superpowers by Gregg (2016) [http://www.brendangregg.com/blog/2016-03-05/linux-bpf-superpowers.html](http://www.brendangregg.com/blog/2016-03-05/linux-bpf-superpowers.html) - Linuxカーネルのプログラマビリティを向上させる ### tracing - kprobes - uprobes ### networking - XDP - 自作ロードバランサ - k8s CNI - Telecom ### BCC (BPF Compiler Collection) 2015年開発.tracing framework C言語のプログラミング環境,ユーザレベルのインターフェイス用のPython、Lua、C++の環境を提供. ### bpftrace 2016年開発.[https://github.com/iovisor/kubectl-trace](https://github.com/iovisor/kubectl-trace) ## eBPF history - Berkeley Packet Filter, 1992 パケットキャプチャを改善 - 2013年にFBのソフトウェアエンジニアのAlexei Starovoitov BPFのrewriteを提案 [https://lkml.org/lkml/2013/9/30/627](https://lkml.org/lkml/2013/9/30/627) 2014年に実装 - 汎用の実行エンジンへ - BPFを正確に説明するのは難しい.カーネルとアプリケーションのさまざまなイベントで小さなプログラムを実行する手段を提供する.JavaScriptと似ている.ブラウザ上で発生するイベントに対してミニプログラムを実行する.カーネルの開発者以外がカーネルをプログラム可能とする. - BPFの構成 仮想的命令セット、ストレージオブジェクト、ヘルパー機能.インタプリタとJITコンパイラにより,ネイティブ命令として実行される.不正なメモリアクセスなどは,Verifierがカーネルのクラッシュから守る. - networking, observability(tracing), and security ## BCCとは BCC(BPF Compiler Collection)。フレームワーク。Python、C++、Lua BPFプログラムって、tracing系は、task structみたいなカーネル内部の非公開の構造体。コンパイル時にカーネルヘッダが必要。しかも、これらの構図体は、カーネルバージョンによって構造体の定義が違う。fieldが生えてたり、変数名が変わってたり、変数がいれかわったり。C言語の場合は、コンパイル時にoffsetが決め打ち。 コンパイルと実行を同じホストでやればいいじゃん。ランタイムでコンパイルもやればええやん。 Pythonに、C言語のソースファイルを文字列でもたせておいて、ランタイムで変数うめこんで、コンパイル。 ## ![[BPF CO-RE]] ## eBPFのトレーシングアプリを書けるようになるには - BPF Performance Tools, Chapter 1と2を読む - Linux Observability with BPF, Chapter 1~5までを読む - Program Typeを知る - BPF Mapsを知る - MAPSに対する読み書き方法を知る - [https://nakryiko.com/posts/libbpf-bootstrap/](https://nakryiko.com/posts/libbpf-bootstrap/) - 利用したい言語でBPFのユーザ空間を書く方法を知る - [https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md](https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md) - BPFのCは,Goがわかればだいたい分かる... はず ## eBPF future - BPF will replace Linux [https://twitter.com/srostedt/status/1177147373283418112](https://twitter.com/srostedt/status/1177147373283418112) [https://medium.com/nttlabs/netdev-0x13-から見た-linux-ネットワークの最新動向-6aff2965f5c6](https://medium.com/nttlabs/netdev-0x13-%E3%81%8B%E3%82%89%E8%A6%8B%E3%81%9F-linux-%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E6%9C%80%E6%96%B0%E5%8B%95%E5%90%91-6aff2965f5c6) [https://medium.com/nttlabs/grpc-in-ebpf-10a930d0d329](https://medium.com/nttlabs/grpc-in-ebpf-10a930d0d329) [[1993__USENIX__The BSD Packet Filter - A New Architecture for User-level Packet Capture.]] --- # Main session eBPFとは何か? その歴史と最近の動向,yuuk1tくんの利用例,今後の展望について. ## Agenda - Background - Quick introduction of BPF - History of BPF - Deep dive of BPF - Current use case of BPF - Future of BPF - How to learn BPF ## Details - Introduction - 自己紹介 [https://yuuk.io/](https://yuuk.io/) - ゆううきといいます.idに含まれるeの数は残念ながら0個です.大学院の修士課程を中退して、新卒でWebサービス事業者で,WebオペレーションエンジニアとSREを5年間つとめたのちに,2年前から,さくらインターネット研究所で,SREを専門領域として研究開発をやっています.昨年の春から京都大学大学院情報学研究科の博士後期課程に在籍しています.今日はよろしくお願いします. - Question - [deeeet] 大学生活どうですか? - 入学式。学生証を紛失させる、 - 昨年は1回だけ研究室に行った。授業もすこしとっていたけど、あきらめた。休日の散歩に2,3回。手続き系に2回。 - Background - なぜBPFをe34fmで取り上げようと思ったか - [Systems Performance, 2nd Edition](https://learning.oreilly.com/library/view/systems-performance-2nd/9780136821694/) is written with BPF! - Systems Performance 1st Editionはかなりの名著。BPF Performance Tools。 - BPF quick introduction - Questions - [deeeet] (ざっくりと) BPFってそもそも何? - extended Berckley Packet Filterの略。1口に説明するのは難しい。Blendan gregの著書にも。 - 広義 - カーネルのプログラマビリティを高めるための汎用実行エンジン。似たようなものにブラウザにおけるJavaScript。 - Programmability: Safety, Continous Delivery、Performance(low overhead) - カーネルのコードをかえて、コンパイルしてリブートして、ミスったらkernel panic。 - Linux kernel moduleとかもあった。ユーザ空間とのインタラクションが難しい。 一旦ためておく、データ構造。安全な環境ではない、null参照問題。 - ユーザ空間からカーネル内のサンドボックス環境にプログラムを送り込んで、その隔離環境で実行する。C言語のサブセットとヘルパー関数(pid、nsの取得とか時刻の取得)。 - さらに、ユーザ空間のインタラクションにはeBPF mapというのがある。genericなデータ構造。 HASH、ARRAY、QEUEU。 - カーネルって基本の仕事がブラックボックスになっているところを観測可能にしたり、カーネル内の操作を制御したりできる。 - Linux super powers - ブラウザ内でイベントが起きて、そのイベントを受け取るコールバック関数をひたすら書いていく。BPFでイベント - 狭義 - 安全で動的にロード可能な64ビットプログラム。カーネル関数に対して、contextオブジェクトを入力として与える。 - このプログラムは、直接プロセッサが解釈するわけではなく、独自の命令セットを備えたVirtual Machine。命令 114命令 11レジスタ (x86-64 2000+命令 16レジスタ) - アトミック加算命令 - 外部関数呼び出し命令 - エンディアン変換命令 - [deeeet] (ざっくりと) どのようなところで使われている? - networking、observability(tracing)、security - カーネル空間で、イベントデータを(ヒストグラム)集約して、ユーザ空間にわたすこともできる。 - 分散環境を想定して、Control Planeでルーティングの変更を決定したときに、eBPFでノード上のカーネルをData planeとして、命令を送ることができる。 - Pod、IP addr/32 小さな粒度でのルーティングの変更。 - [deeeet] BPF vs eBPF? - eBPFはclassic BPFとextented BPF - Bleandan GregはBPF。Clliumコミュニケーションは eBPF。 - References - Linux BPF Superpowers by Gregg (2016) [http://www.brendangregg.com/blog/2016-03-05/linux-bpf-superpowers.html](http://www.brendangregg.com/blog/2016-03-05/linux-bpf-superpowers.html) - [http://www.brendangregg.com/bpf-performance-tools-book.html](http://www.brendangregg.com/bpf-performance-tools-book.html) - [https://ebpf.io/what-is-ebpf](https://ebpf.io/what-is-ebpf) - ユースケースは networking, observability(tracing), and security (from BPF Performance Tools Chapter 1) - yuuk1がやってるのはobservability(tracing). - [deeeet] - [https://jvns.ca/blog/2017/06/28/notes-on-bpf---ebpf/](https://jvns.ca/blog/2017/06/28/notes-on-bpf---ebpf/) - BPF usage now - [deeeet] 最近のBPFで気になってる応用例は? - yuuki - Network flow tracing - datadog network performance monitoring [https://docs.datadoghq.com/network_monitoring/performance/](https://docs.datadoghq.com/network_monitoring/performance/) - Sysdig topology map [https://docs.sysdig.com/en/visualize-metrics-using-the-topology-view.html](https://docs.sysdig.com/en/visualize-metrics-using-the-topology-view.html) - Weave Scope [https://github.com/weaveworks/scope](https://github.com/weaveworks/scope) - deeeet - [Cilium - Linux Native, API-Aware Networking and Security for Containers](https://cilium.io/) - [Bringing eBPF and Cilium to Google Kubernetes Engine](https://cloud.google.com/blog/products/containers-kubernetes/bringing-ebpf-and-cilium-to-google-kubernetes-engine) - [https://www.youtube.com/watch?v=oLS25ztnlMk](https://www.youtube.com/watch?v=oLS25ztnlMk) - [Falco.org](https://falco.org/) - - rrreeeyyy - - References - [https://ebpf.io/summit-2020/](https://ebpf.io/summit-2020/) - BPF history - Questions - [deeeet] BPF以前はどのようなツールが存在した? - classic BPFの存在。packet captureの話。filteringをインカーネルでやったほうがいいよね。 - データソース kprobe / uprobe / tracepoint / perf_event - SystemTap [https://www.slideshare.net/linecorp/multitenancy-kafka-cluster-for-line-services-with-250-billion-daily-messages](https://www.slideshare.net/linecorp/multitenancy-kafka-cluster-for-line-services-with-250-billion-daily-messages) - [https://logmi.jp/tech/articles/320330](https://logmi.jp/tech/articles/320330) - イベントループがブロック - perf-tool - ftrace - Dtrace - [deeeet] BPFはなぜ開発された? - 実は出典を見つけられていない。 - [deeeet] BPFの開発の歴史は? 今はどのような状態? - References Linux Observability with BPF - 1992 Berkeley Packet Filter, カーネルにfilter evaluatorをいれて,既存のパケットキャプチャを改善 20倍はやくなった。[https://www.usenix.org/legacy/publications/library/proceedings/sd93/mccanne.pdf](https://www.usenix.org/legacy/publications/library/proceedings/sd93/mccanne.pdf) - 2013年にFBのソフトウェアエンジニアのAlexei Starovoitov BPFのrewriteを提案 [https://lkml.org/lkml/2013/9/30/627](https://lkml.org/lkml/2013/9/30/627) - 2014年に実装 - 2015年 BCC(BPF Compiler Collection)開発 - Python C++ Luaで、書けるやつ。 - 2016年 bpftrace開発 - 2016年 Ciliumプロジェクトアナウンス - BPF deep dive - Questions - [deeeet] BPFはどのようなアーキテクチャーで動いている? - 安全なサンドボックス。 (メモリレイアウト) - VMの話。 - BPFコードがロードされて実際に動くまでの大まかな流れ - [https://ebpf.io/what-is-ebpf#loader--verification-architecture](https://ebpf.io/what-is-ebpf#loader--verification-architecture) 1. clangでBPFプログラムがビルドされる。 2. bpf(2) system call でビルドしたbytecodeを送る。 3. bytecodeがverifierにより検査される。ex. JAMP命令で番地を戻ることができない。 メモリアクセスの範囲チェック、プログラムの停止性、ループ、spin_lockがデッドロックしない、No use after free、No object leaks。 4. JIT compilerで native codeとして動作する。 - C言語 - eBPF Program - Load - Verifier - JIT Compiler - Maps - Helper Calls - [deeeet] BPFプログラムを書きたいと思ったとき使えるツールセットに関して - BCC - BPFtrace... - CO-RE - [deeeet] BPFをプログラミング言語,例えばGo言語から使いたいときはどうすれば良い? - ユーザ空間 - cilium - カーネル空間 - C言語。bytecodeにしてしまえばいいので、原理的にはGoからbytecodeでもできる。GCがあるけどどうだろう。 - - [deeeet] BPFプログラミングで気をつけることは? - ユーザ空間とカーネル空間の並行プログラミング。カーネル空間の関数は複数のスレッドから同時に呼び出されうる。 - Map でatomicなオペレーションに対応。 - Map から値を取り出して、書き換えて戻す。 clangでサポートされている、atomic_fetch_addみたいな命令を使う。 - kprobeとkprobe_retで値を渡す。 - サンプルコードが少ない。iovisor/bcc をみる。Linuxカーネル内のテストコードを読む。 - C言語だから気をつけるところはそんなに少ない。Verifyerがチェックしてくれる。 - デバッグがprint debug。 (gdbでもできるらしいが...) - カーネル関数の引数にどんな値がわたってくるかわからない。unstableな領域にアタッチするって大変。system call。 - カーネルバージョンごとの機能の差異 - 細かくハマったところがたくさんある。cgo、makefile、verifierのログ、カーネル関数の引数の値。 - cgo: void * genericで、実引数として渡した型が意図していたものと違って、出力がおかしくなる。 - bpftraceで変数の値をprintできる。 - bpftraceでstacktraceよべたりする。 - References - [https://ebpf.io/what-is-ebpf#loader--verification-architecture](https://ebpf.io/what-is-ebpf#loader--verification-architecture) - [A Beginner’s Guide to eBPF Programming - Liz Rice - Full Keynote](https://www.youtube.com/watch?v=lrSExTfS-iQ) - [https://networkop.co.uk/post/2021-03-ebpf-intro/](https://networkop.co.uk/post/2021-03-ebpf-intro/) - BPF future - Questions - [deeeet] BPF自体は今後どのような変化が起こっていくのか? - [deeeet] BPFの利用として今後面白そうなプロジェクトは? - References - Microkernel化 [https://docs.google.com/presentation/d/1AcB4x7JCWET0ysDr0gsX-EIdQSTyBtmi6OAW7bE0jm0/edit?usp=sharing](https://docs.google.com/presentation/d/1AcB4x7JCWET0ysDr0gsX-EIdQSTyBtmi6OAW7bE0jm0/edit?usp=sharing) - TCPの輻輳制御 - ebpf-based service mesh Cilium - In kernel Machine Learning - A flow-based IDS using Machine Learning in eBPF [https://arxiv.org/pdf/2102.09980.pdf](https://arxiv.org/pdf/2102.09980.pdf) - [deeeet] - [[2102.12922] BPF for storage: an exokernel-inspired approach](https://arxiv.org/abs/2102.12922) - How to learn BPF? - Question - [deeeet] これからBPFを学びたい人におすすめのリソースは? みんなどうやった学んだ? - Reference - eBPFのはじめかた [http://www.brendangregg.com/blog/2019-01-01/learn-ebpf-tracing.html](http://www.brendangregg.com/blog/2019-01-01/learn-ebpf-tracing.html) - 初心者: bccのツールを使ってみる [https://github.com/iovisor/bcc](https://github.com/iovisor/bcc) - 中級者: bpftraceのツール(スクリプト)を作ってみる - 上級者: bccのツールを開発する、bccやbpftraceにcontributeする - (最上級: bpfのコア機能を開発.カーネルとかLLVM) - [deeeet] - [https://twitter.com/deeeet/status/1326698920278335489](https://twitter.com/deeeet/status/1326698920278335489) - Yuukiくんから宣伝したいこと(あれば) - [https://wsa.connpass.com/event/207143/](https://wsa.connpass.com/event/207143/) [e34.fm](http://e34.fm) と分野はだいたい同じ。インフラ、SRE、プラットフォーム、クラウド。全員発表型でディスカッション重視。枠が2つある。 --- BPFはnetworkingとtracing,securityへの適用事例がほとんどなのだけど,storageにアプローチすることはないのかなと思ってたら,それらしい論文がでてきた.arXivなので査読に通っているわけではない. [Cilium & eBPFのSlackワークスペースでも話題になっていた.](https://cilium.slack.com/archives/C01EPDZD88P/p1616854214001900)タイミングと論文のページ数からみてHostOSに投稿していたのかもしれないとコメントがあった.どうでもいいけど,アブストの下にソロモン王の有名な箴言が引用されてておもしろい. - カーネルのストレージパスのオーバーヘッドが、新しいNVMeストレージデバイスのアクセスレイテンシの半分を占める。 - カーネルのI/O処理スタックの奥深くにユーザー定義関数を組み込むことで、BPFを使ってこのオーバーヘッドを削減することを検討した。 - 一連の依存性のあるI/Oリクエストを発行する場合、このアプローチは、カーネルレイヤーをバイパスし、ユーザーとカーネルの境界を越えないようにすることで、IOPSを2.5倍以上に向上させ、レイテンシーを半分にすることができる。 - しかし、ファイルシステムの安全性の保証や、物理ブロックのアドレスとファイルのオフセットとの間の変換など、ファイルシステムやブロック層をバイパスする際に重要な特性が失われることは避けなければならない。 - ここでは、90年代後半に登場したexokernelファイルシステムにヒントを得て、これらの問題に対する潜在的なソリューションを紹介する。 引用文献である次の,eBPFでネットワークごしにストレージにアクセスする論文もおもしろそう. - <https://ebpf.io/blog>: eBPF Foundationがホストするブログ。eBPFに関する最新のニュースのリストを不定期に提供してくれる。ここ半年ほど、更新されていない。 - <https://mmi.hatenablog.com/>: OS・システムソフトウェア分野の研究をされており、bpftraceのコミッタでもあるmm_iさんのブログ。。 - <https://udzura.hatenablog.jp/>: うづらさんのブログ。 - id:udzura さんが調査している。 [BPFバイナリはどのようなELF形式か(1) - 最低限の情報とは? - ローファイ日記](https://udzura.hatenablog.jp/entry/2021/07/01/235448)