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
BCC Developer Tutorial 副読本
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
KONDO Uchio
September 08, 2020
Technology
1
240
BCC Developer Tutorial 副読本
KONDO Uchio
September 08, 2020
Tweet
Share
More Decks by KONDO Uchio
See All by KONDO Uchio
大規模レガシーテストを 倒すための CI基盤の作り方 / #CICD2023
udzura
5
2.5k
Ruby x BPF in Action / RubyKaigi 2022
udzura
0
280
Narrative of Ruby & Rust
udzura
0
250
開発者生産性指標の可視化 / pepabo-four-keys
udzura
3
1.8k
Talk of RBS
udzura
0
480
Re: みなさん最近どうですか? / FGN tech meetup in 2021
udzura
0
830
Dockerとやわらかい仮想化 - ProSec-IT/SECKUN 2021 edition -
udzura
2
780
Device access filtering in cgroup v2
udzura
1
980
"Story of Rucy" on RubyKaigi takeout 2021
udzura
0
880
Other Decks in Technology
See All in Technology
Embedded SREの終わりを設計する 「なんとなく」から計画的な自立支援へ
sansantech
PRO
3
2.4k
Frontier Agents (Kiro autonomous agent / AWS Security Agent / AWS DevOps Agent) の紹介
msysh
3
170
FinTech SREのAWSサービス活用/Leveraging AWS Services in FinTech SRE
maaaato
0
130
15 years with Rails and DDD (AI Edition)
andrzejkrzywda
0
190
レガシー共有バッチ基盤への挑戦 - SREドリブンなリアーキテクチャリングの取り組み
tatsukoni
0
210
OpenShiftでllm-dを動かそう!
jpishikawa
0
100
【Oracle Cloud ウェビナー】[Oracle AI Database + AWS] Oracle Database@AWSで広がるクラウドの新たな選択肢とAI時代のデータ戦略
oracle4engineer
PRO
2
140
茨城の思い出を振り返る ~CDKのセキュリティを添えて~ / 20260201 Mitsutoshi Matsuo
shift_evolve
PRO
1
250
会社紹介資料 / Sansan Company Profile
sansan33
PRO
15
400k
外部キー制約の知っておいて欲しいこと - RDBMSを正しく使うために必要なこと / FOREIGN KEY Night
soudai
PRO
12
5.4k
AI駆動PjMの理想像 と現在地 -実践例を添えて-
masahiro_okamura
1
110
MCPでつなぐElasticsearchとLLM - 深夜の障害対応を楽にしたい / Bridging Elasticsearch and LLMs with MCP
sashimimochi
0
160
Featured
See All Featured
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
320
Documentation Writing (for coders)
carmenintech
77
5.2k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
210
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.2k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
71k
GraphQLとの向き合い方2022年版
quramy
50
14k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
1
1.4k
So, you think you're a good person
axbom
PRO
2
1.9k
Speed Design
sergeychernyshev
33
1.5k
4 Signs Your Business is Dying
shpigford
187
22k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
9.9k
How GitHub (no longer) Works
holman
316
140k
Transcript
PEPABO SUMMER INTERN VERSION 近藤うちお / GMO Pepabo, Inc. 2020.09.08
bcc Python Developer Tutorial 徹 底 解 説 !
この資料は何 •Python版「bcc Python Developer Tutorial」を通しでやってみる 際に参考になるかもしれない解説スライドです •@udzura の独断と偏見が含まれます •@udzura はRuby版BCCポート(*)を開発した人で、TutorialもRuby
に移植した経験がありますが、それでも間違ったことを言っている可 能性はあります。 IUUQTHJUIVCDPNVE[VSBSCCDD
全体の攻略方針 •三分割できる •Lesson 1〜6: 第一章 BCCプログラミングの基本 •Lesson 7〜11: 第二章 収集したデータの出力方法
•Lesson 12〜16: 第三章 様々なるProbe •とにかく第一章が重要で難しい。 •ここさえ乗り切れば後はAPIを覚えていくフェーズになる。 •インターンの半分でLesson 6までやり切れば、ツールは何とか作れるはず?
環境について •Ubuntu Bionic で大丈夫 •カーネル 5.3 あたりを明示的に入れたければどうぞ。 その場合、linux-libc-dev パッケージを先のバージョンから ダウンロードして入れても良いかも。
•Focal はなんか不安定な印象がまだあるが、挑戦はいいんでは •Vagrant を使えば十分、むしろコンテナでは如何ともし難い •Linux の人も、いちおうVMを挟んでおきましょう
第一章 BCCプログラミングの基本
1. Hello World
BCCの動作確認 •やってることは: clone(2) のトレース •clone(2) は要するにfork()で、プロセスを作ったら呼ばれるsyscall •fork() -> exec() ->
exit() の流れを復習しよう
2. sys_sync()
対象システムコールの変更 •kprobe__sys_BAR(...) という関数名をBCCで定義すると、 自動でkprobeにアタッチされる。 •sys_BAR kprobe はシステムコール BAR(2) に対応する ※
hello_world.py を改修する ※kprobe = カーネルのシンボルに紐づくフック
3. hello_fields.py
プログラムの基本形を覚える ※ printk() したら msg で取れる
4. sync_timing.py
BPF Mapの基本的な使い方
BPF Mapの基本的な使い方
BPF Mapの基本的な使い方
5. sync_count.py
前のコードを改修しよう • ヒントなど: • key に 0 以外を指定すればストアする 値を増やせるよ(不要か?) •
lookup()してNULLなら初期値、 そうでなければ +1 した値を保存すれ ばカウンターになるのでは? • もう差を取る必要は実はない • outputの手段は今のとこprintk()しか ありませんね...
6. disksnoop.py
ブロックデバイスI/Oのトレース例 •押さえるべきこと: •trace_start()からtrace_completion()までの差分を計測している •struct request * のアドレスをキーがわりにする •一回一回のリクエスト構造体はカーネルのメモリ上では別々の位置 にあるはず(アドレスの使い回しはあるが、同時にはない) •printk()
で無理やり3つの値を送っている
自力でゆっくり 読んでみましょう
第二章 収集したデータの出力方法
7. hello_perf_output.py
Perf buffer の使い方 •コツ: •trace_fields() 系はtracefsの一つのファイルをtailしてるだけで、 複数同時にアウトプットできなくて混ざる •Perf bufferにデータを送り込む専用のデータ構造 BPF_PERF_OUTPUT()
•open_perf_buffer() はデータが来たときのコールバックの登録 •perf_buffer_poll() で待つ
8. sync_perf_output.py
4. の書き換え。 •コツ: •7. のコード構造を頭に叩き込んで落ち着いて頑張る。
9. bitehist.py
ヒストグラムの出し方 •コツ: •ヒストグラム専用のデータ構造とヘルパーがあって便利ですね •struct request のメンバの確認の仕方などを押さえとくといい
10. disklatency.py
disksnoop.py のリライト •コツ: •レイテンシ計測のパターンを思い出す •あとはレイテンシをヒストグラムに登録するだけ
11. vfsreadlat.py
定期表示系のトレーサの実装 •コツ: •CとPythonのファイル分割、b["dist"].clear() の2つの方法を 覚えるためのレッスン。 •他は新しいことはないので復習。
第三章 様々なるProbe、そして伝説へ...
12. urandomread.py
tracepoint の利用 •コツ: •普通にtracepointを使う場合専用のマクロがある •マクロ経由の場合明示的なアタッチは不要 •tracepoint のフォーマット確認の仕方を押さえる
ちなみに •@udzura が雑に書いたtracepoint補完確認コマンドがある。 • https://gist.github.com/udzura/6d40a3f010aff2a4a58f632627ab7f89
13. disksnoop.py fixed
kprobe → tracepoint の書き換え •コツというか...: •trepo() を使って当該tracepointの確認を... •してもよくわからんとなった場合は、 @udzura のRuby実装を眺め
てもいいと思います。 •トレースポイント、ドキュメントがないよね...。
14. strlen_count.py
uprobe の利用 •コツ: •地味に初めて「文字列をキーとしたハッシュ」を扱うので注意 •その他は既存のProbeと扱いは変わらない •get_table() で取れるテーブルはdict風のインタフェースがある
uprobe の確認方法 •1) readelf -s •2) bpftrace (ただし、snap版は使えない)
15. nodejs_http_server.py
USDTの利用... •コツというか...: •node.jsをUSDT有効で用意するのが大変。頑張って •ヒント: “同じディレクトリにあるnode.jsのサーバプログラムを、 USDTを有効にした(--enable-dtrace)ビルドのnode.jsバイナリ で実行して計測する必要があります” •nodebrew はビルドオプションを渡せる。もしくは自分でbuild •USDT有効になっても、さらにusdt系の関数は癖があって大変。
USDTの確認方法 •1) readelf -n
USDTの確認方法 •2) bpftrace
16. task_switch.c
ここまでの総集編 •コツというか...: •finish_task_switch() の定義をちゃんとカーネルソースコードを見て 確認するといいと思う •eBPF C側の関数の第2引数以降は、元の関数の引数がスライドする •後は、今までの知識で!
17. Further Study
登り始めた ばかりだからな...(AA略)