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
KONDO Uchio
September 08, 2020
Technology
250
1
Share
BCC Developer Tutorial 副読本
KONDO Uchio
September 08, 2020
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
300
Narrative of Ruby & Rust
udzura
0
260
開発者生産性指標の可視化 / pepabo-four-keys
udzura
3
1.8k
Talk of RBS
udzura
0
490
Re: みなさん最近どうですか? / FGN tech meetup in 2021
udzura
0
850
Dockerとやわらかい仮想化 - ProSec-IT/SECKUN 2021 edition -
udzura
2
810
Device access filtering in cgroup v2
udzura
1
1k
"Story of Rucy" on RubyKaigi takeout 2021
udzura
0
910
Other Decks in Technology
See All in Technology
「責任あるAIエージェント」こそ自社で開発しよう!
minorun365
9
2.2k
Do Ruby::Box dream of Modular Monolith?
joker1007
1
350
AIを共同作業者にして書籍を執筆する方法 / How to Write a Book with AI as a Co-Creator
ama_ch
2
150
クラウドネイティブな開発 ~ 認知負荷に立ち向かうためのコンテナ活用
literalice
0
150
扱える不確実性を増やしていく - スタートアップEMが考える「任せ方」
kadoppe
0
320
社内エンジニア勉強会の醍醐味と苦しみ/tamadev
nishiuma
0
230
20260423_執筆の工夫と裏側 技術書の企画から刊行まで / From the planning to the publication of technical book
nash_efp
3
430
20260428_Product Management Summit_tadokoroyoshiro
tadokoro_yoshiro
13
14k
The Journey of Box Building
tagomoris
4
3.4k
バイブコーディングで3倍早く⚪⚪を作ってみた
samakada
0
120
レビューしきれない?それは「全て人力でのレビュー」だからではないでしょうか
amixedcolor
0
350
AIでAIをテストする - 音声AIエージェントの品質保証戦略
morix1500
1
140
Featured
See All Featured
KATA
mclloyd
PRO
35
15k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
99
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
740
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Art, The Web, and Tiny UX
lynnandtonic
304
21k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Practical Orchestrator
shlominoach
191
11k
Between Models and Reality
mayunak
3
270
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
Test your architecture with Archunit
thirion
1
2.2k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
170
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略)