Agenda
u 概説
u eBPFとは
uBpftraceとは
u Dtrace, Systemtap
u Dtrace, Systemtap
u Dtraceとは
u Systemtapとは
u そしてBpftraceへ
u Bpftrace
u インストール要件
u トレースの種別
u Bpftraceを使ってみる
u bcc-tools
2
3.
誰︖
u 名前: 穎川和弘 (えがわ かずひろ)
u 業務: IaaSのバックエンドで動作するアプリケーションの開発 (golang)
u 趣味: 分散システムや並⾏処理、⾔語処理系に興味
u アニメも⼤好き (特にまんがタイムきらら枠)
u 実は登壇系は初めてで、めっっっっちゃ緊張してます (><)
3
4.
本スライドの⽬標
u dtrace やsystemtapを簡単に説明し、eBPFを⽤いたトレーシングの嬉しいとこ
ろを伝える
u Bpftrace, bcc-toolsといったツールの簡単な使い⽅を紹介し、細かいツールを
調べる上での⾜がかりになるようにする
u GithubのIOvisor org の資料がかなり充実していることを伝える
u このスライドで使ってる画像はまさにそこから使わせていただいております
4
eBPFとは
u Linuxカーネル 3.15から、BPFの拡張仕様としてeBPFが導⼊されました
uより詳細な話は少しづつお話ししていきます
u BPFはこれまでにも、パケットフィルタやシステムコールフィルタなど強⼒な
機能を有していましたが、eBPFの導⼊によって、⾼速なネットワーク処理、よ
り詳細なLinuxでのメトリクス取得に活⽤の幅が広がってきています
u eBPFを取り巻くOSSプロダクトでは、開発も盛んに⾏われており、本スライド
では特にbpftrace (+ちょっとbcc) を取り上げ、その⼀⾯を覗こうと思います。
6
DTraceとは
u DTraceは元々、Solaris 10,OpenSolarisに対して⾼度なトレーシングを⾏うため
に開発されました
u D⾔語というプログラミング⾔語を⽤います
u ただ、書き味はpure Dよりも⾼級なDSLです
u Dtraceはいくつかのプロバイダーを提供しており、これらによってプローブが
設置されます
u プローブの先頭にはどのプロバイダを利⽤するのか指定する必要があり、これに
よってどのようにトレースされるのかが決定されます
u プロバイダはカーネルモジュールとして実装され、ユーザランドから ioctl(2)
を⽤いてやり取りが⾏われることで、トレーシングが実現されます
10
Bpftrace 概観
u 参考:https://github.com/iovisor/bpftrace/blob/master/docs/internals_development.md
19
20.
トレースの種別
u Kprobe
u Uprobe
uTracepoint
u USDT (User Statically-Defined Tracing)
u Kprobe, uprobe には、関数呼び出しプローブポイントを⽰すkprobe, uprobe,
関数終了プローブポイントを⽰すkretprobe, uretprobeがあります
u これらの中でも、特に安定して使えるトレース種別は Tracepointですので、
Tracepointを使って情報を取得する例について話します
u http://www.brendangregg.com/blog/2018-03-22/tcp-tracepoints.html 20
使う環境
u OS
u Ubuntu18.04.4 LTS (bionic)
u Uname –a
u Linux kazu-desktop 5.3.0-51-generic #44~18.04.2-Ubuntu SMP Thu Apr 23 14:27:18
UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
u CPU4コア 、メモリ16GB
22
Bcc-tools は何で書かれているか
u 多くがPythonスクリプトで⽤意されています
uBcc-tools は、 iovisor/bcc リポジトリに同梱されており、toolsディレクトリ配
下に置いてあります
u https://github.com/iovisor/bcc/tree/master/tools
u Iovisor/bcc リポジトリには、Pythonのbccライブラリ実装が配置されており、
bcc-tools がこのライブラリをimportする形で利⽤されています
41
42.
bccライブラリを使った実⾏の⼤まかな
流れ (execsnoop.pyの場合)
u bccライブラリをimport
uCのソースを bcc.BPFクラス に渡して初期化
u Cのソースは、⽂字列で定義して渡しても良し、別ファイル読み込んでも良し、ヘッダ
ファイルを読み込んでも良しです
u 初期化されたbcc.BPF の attach_xxx メソッドを呼び出します
u xxxは、kprobeとかtracepointとか
u perf_event_open(2) が呼び出されることを契機にカーネル空間でパフォーマンスカウンタ
が収集されるようになります
u bcc.BPF の open_perf_bufferを呼び出し、コールバック関数を登録します
u bcc.BPFの perf_buffer_poll を呼び出し、イベントの発⽣を監視します
u 内部的には、poll(2) が呼び出されることでperf ring bufferのイベント監視が⾏われます
u 以上により、イベントがコールバック関数にわたり、適切に加⼯されて出⼒されま
す
42
より詳しく知りたい⽅向けに
u 「BPF PerformanceTools」がおすすめです
u eBPFのトレーシングについては、おそらくこの書籍が⼀番詳しいかと思います
u https://www.amazon.co.jp/Performance-Tools-Addison-Wesley-Professional-
Computing/dp/0136554822/
u ネットワーク処理、XDP周りにも興味があるよ︕と⾔う⽅には 「Linux
Observability with BPF」がおすすめです
u 導⼊に必要な知識が少ないページ数でキッチリ説明されてます
u Githubリポジトリのコードも参照しながら読み進めることをお勧めします
u https://www.amazon.co.jp/Linux-Observability-Bpf-Programming-
Performance/dp/1492050202/
45
その他の参考記事
u [1] SystemtapHomePage
u https://sourceware.org/systemtap/wiki
u [2] Github opendtrace/opendtrace
u https://github.com/opendtrace/opendtrace
u [3] Dtrace is open 2005/01/25
u https://blogs.oracle.com/ahl/dtrace-is-open
u [4] bcc-tools README.md
u https://github.com/iovisor/bcc
u [5] bpftrace README.md
u https://github.com/iovisor/bpftrace
47