BPF コンパイラ コレクション (BCC)
BCC は、効率的なカーネル トレースおよび操作プログラムを作成するためのツールキットであり、いくつかの便利なツールと例が含まれています。これは、Linux 3.15 に最初に追加された新機能である、正式には eBPF として知られる拡張 BPF (Berkeley Packet Filters) を利用します。 BCC が使用するものの多くには、Linux 4.1 以降が必要です。
eBPF は、Ingo Molnár によって次のように説明されました。
このサイクルのさらに興味深い機能の 1 つは、eBPF プログラム (カーネルによって実行されるユーザー定義のサンドボックス化されたバイトコード) を kprobe にアタッチできる機能です。これにより、クラッシュしたり、ハングしたり、カーネルに悪影響を及ぼすことがない、ライブ カーネル イメージ上でのユーザー定義のインストルメンテーションが可能になります。
BCC を使用すると、C のカーネル インストルメンテーション (LLVM の C ラッパーが含まれます)、および Python と lua のフロントエンドを使用して、BPF プログラムの作成が容易になります。パフォーマンス分析やネットワーク トラフィック制御などの多くのタスクに適しています。
スクリーンショット
この例では、ディスク I/O カーネル関数をトレースし、カーネル内の I/O サイズの 2 のべき乗ヒストグラムを作成します。効率性を高めるため、ヒストグラムの概要のみがユーザーレベルに返されます。
# ./bitehist.py
Tracing... Hit Ctrl-C to end.
^C
kbytes : count distribution
0 - > 1 : 3 | |
2 - > 3 : 0 | |
4 - > 7 : 211 | ********** |
8 - > 15 : 0 | |
16 - > 31 : 0 | |
32 - > 63 : 0 | |
64 - > 127 : 1 | |
128 - > 255 : 800 | ************************************** |
上記の出力は二峰性分布を示しており、800 I/O の最大モードのサイズは 128 ~ 255 KB でした。
ソースを参照してください:bithist.py。これが何をトレースし、何を保存し、データをどのように表示するかは完全にカスタマイズできます。これは、考えられる多くの機能のうちの一部のみを示しています。
インストール中
プラットフォームでのインストール手順については、INSTALL.md を参照してください。
よくある質問
トラブルシューティングの最も一般的な質問については、FAQ.txt を参照してください。
リファレンスガイド
bcc および bcc/BPF API のリファレンス ガイドについては、docs/reference_guide.md を参照してください。
コンテンツ
これらの中には、C と Python の両方を含む単一のファイルもあれば、.c ファイルと .py ファイルのペアが含まれるもの、ファイルのディレクトリであるものもあります。
トレース
例
- Examples/tracing/bitehist.py: ブロック I/O サイズのヒストグラム。例。
- Examples/tracing/disksnoop.py: ブロック デバイスの I/O 遅延をトレースします。例。
- Examples/hello_world.py: 「Hello, World!」を出力します。新しいプロセスのために。
- example/tracing/mysqld_query.py: USDT プローブを使用して MySQL サーバー クエリをトレースします。例。
- example/tracing/nodejs_http_server.py: USDT プローブを使用して Node.js HTTP サーバー リクエストをトレースします。例。
- Examples/tracing/stacksnoop: カーネル関数をトレースし、すべてのカーネル スタック トレースを出力します。例。
- tools/statsnoop: stat() システムコールをトレースします。例。
- Examples/tracing/task_switch.py: PID 間のタスク スイッチをカウントします。
- example/tracing/tcpv4connect.py: TCP IPv4 アクティブ接続をトレースします。例。
- Examples/tracing/trace_fields.py: トレースされたイベントからフィールドを出力する簡単な例。
- example/tracing/undump.py: UNIX ソケット パケットをダンプします。例
- Examples/tracing/urandomread.py:random:urandom_read をトレースするカーネル トレースポイントの例。例。
- 例/tracing/vfsreadlat.py 例/tracing/vfsreadlat.c: VFS 読み取りレイテンシの分布。例。
- Examples/tracing/kvm_hypercall.py: KVM のエントリ、終了、およびハイパーコールの例の条件付き静的カーネル トレースポイント。
ツール
- tools/argdist: 関数パラメータ値をヒストグラムまたは頻度カウントとして表示します。例。
- tools/bashreadline: 入力された bash コマンドをシステム全体に出力します。例。
- tools/bpflist: アクティブな BPF プログラムとマップを含むプロセスを表示します。例。
- tools/capable: セキュリティ機能チェックをトレースします。例。
- tools/compactsnoop: PID とレイテンシーを使用してコンパクト ゾーン イベントをトレースします。例。
- tools/criticalstat: カーネル内の長いアトミック クリティカル セクションをトレースしてレポートします。例
- tools/deadlock: 実行中のプロセス上の潜在的なデッドロックを検出します。例。
- tools/drsnoop: PID とレイテンシを使用して直接回収イベントをトレースします。例。
- tools/funccount: カーネル関数呼び出しをカウントします。例。
- tools/inject: 呼び出しチェーンと述語を使用したターゲットを絞ったエラー挿入の例。
- tools/klockstat: カーネル ミューテックス ロック イベントをトレースし、ロック統計を表示します。例。
- tools/opensnoop: open() システムコールをトレースします。例。
- tools/readahead: 先読みキャッシュのパフォーマンスを表示する例。
- tools/reset-trace: トレースの状態をリセットします。メンテナンスツールのみ。例。
- tools/stackcount: カーネル関数呼び出しとそのスタック トレースをカウントします。例。
- tools/syncsnoop: sync() システムコールをトレースします。例。
- tools/threadsnoop: 新しいスレッドの作成をリストします。例。
- tools/tplist: カーネル トレースポイントまたは USDT プローブとその形式を表示します。例。
- tools/trace: フィルターを使用して任意の関数をトレースします。例。
- tools/ttysnoop: tty または pts デバイスからのライブ出力を監視します。例。
- tools/ucalls: メソッド呼び出しまたは Linux システムコールを高級言語で要約します。例。
- tools/uflow: 高級言語でメソッド フロー グラフを出力します。例。
- tools/ugc: 高級言語でガベージ コレクション イベントをトレースします。例。
- tools/uobjnew: オブジェクト割り当てイベントをオブジェクト タイプと割り当てられたバイト数ごとに要約します。例。
- tools/usat: GC、スレッド作成、オブジェクト割り当て、例外などのイベントを高級言語で収集します。例。
- tools/uthreads: Java および生の pthread でのスレッド作成イベントをトレースします。例。
メモリおよびプロセスツール
- tools/execsnoop: exec() システムコールを介して新しいプロセスをトレースします。例。
- tools/exitsnoop: プロセスの終了 (終了および致命的なシグナル) をトレースします。例。
- tools/killsnoop: kill() システムコールによって発行されたシグナルをトレースします。例。
- tools/kvmexit: 各 VM exit の exit_reason とその統計を表示します。例。
- tools/memleak: メモリ リークを見つけるために未処理のメモリ割り当てを表示します。例。
- tools/oomkill: メモリ不足 (OOM) キラーを追跡します。例。
- tools/pidpersec: 新しいプロセスをカウントします (フォーク経由)。例。
- tools/rdmaucma: RDMA ユーザースペース接続マネージャー アクセス イベントをトレースします。例。
- tools/shmsnoop: System V 共有メモリのシステムコールをトレースします。例。
- tools/slabratetop: カーネル SLAB/SLUB メモリ キャッシュ割り当て率のトップ。例。
パフォーマンスと時間のツール
- tools/dbs lower: しきい値より遅い MySQL/PostgreSQL クエリをトレースします。例。
- tools/dbstat: MySQL/PostgreSQL クエリのレイテンシーをヒストグラムとして要約します。例。
- tools/funcinterval: ヒストグラムと同じ関数間の時間間隔。例。
- tools/funclatency: 関数を時間計測し、そのレイテンシの分布を表示します。例。
- tools/funcs lower: 遅いカーネルまたはユーザー関数の呼び出しをトレースします。例。
- tools/hardirqs: ハード IRQ (ハード割り込み) イベント時間を測定します。例。
- tools/mysqld_qs lower: しきい値よりも遅い MySQL サーバー クエリをトレースします。例。
- tools/ppchcalls: ppc hcall カウントとレイテンシを要約します。例。
- tools/softirqs: ソフト IRQ (ソフト割り込み) イベント時間を測定します。例。
- tools/syscount: システムコール数とレイテンシーを要約します。例。
CPU およびスケジューラ ツール
- tools/cpudist: タスクごとのオン CPU 時間とオフ CPU 時間をヒストグラムとして要約します。例
- tools/cpuunclaimed: CPU 実行キューをサンプルし、要求されていないアイドル CPU を計算します。例
- tools/llcstat: CPU キャッシュの参照とミスをプロセスごとに要約します。例。
- tools/offcputime: カーネル スタック トレースによるオフ CPU 時間を要約します。例。
- tools/offwaketime: カーネルのオフ CPU スタックとウェイカー スタックごとにブロックされた時間を要約します。例。
- tools/profile: 一定の間隔でスタック トレースをサンプリングすることにより、CPU 使用率をプロファイリングします。例。
- tools/runqlat: 実行キュー (スケジューラー) のレイテンシーをヒストグラムとして表示します。例。
- tools/runqlen: 実行キューの長さをヒストグラムとして表示します。例。
- tools/runqswer: 長いプロセスのスケジュール遅延をトレースします。例。
- tools/wakeuptime:waker カーネル スタックごとにスリープからウェイクアップまでの時間をまとめます。例。
- tools/wqlat: ワークキュー上の作業待機レイテンシーを要約します。例。
ネットワークとソケットのツール
- tools/gethostlatency: getaddrinfo/gethostbyname[2] 呼び出しのレイテンシを表示します。例。
- tools/bindsnoop: IPv4 および IPv6 の binding() システム コール (bind()) をトレースします。例。
- tools/netqtop tools/netqtop.c: NIC キュー上のパケット分散をトレースおよび表示します。例。
- tools/sofdsnoop: UNIX ソケットを介して渡された FD をトレースします。例。
- tools/solisten: TCP ソケットリッスンをトレースします。例。
- tools/sslsniff: OpenSSL の書き込みおよび読み取りデータをスニッフィングします。例。
- tools/tcpaccept: TCP パッシブ接続をトレースします (accept())。例。
- tools/tcpconnect: TCP アクティブな接続をトレースします (connect())。例。
- tools/tcpconnlat: TCP アクティブ接続遅延 (connect()) をトレースします。例。
- tools/tcpdrop: カーネルベースの TCP パケット ドロップを詳細とともにトレースします。例。
- tools/tcplife: TCP セッションをトレースし、存続期間を要約します。例。
- tools/tcpretrans: TCP 再送信と TLP をトレースします。例。
- tools/tcprtt: TCP 往復時間をトレースします。例。
- tools/tcpstates: TCP セッション状態の変化を期間とともにトレースします。例。
- tools/tcpsubnet: サブネットごとに送信された TCP を要約して集計します。例。
- tools/tcpsynbl: TCP SYN バックログを表示します。例。
- tools/tcptop: ホストごとの TCP 送信/受信スループットを要約します。 TCPのトップ。例。
- tools/tcptracer: TCP で確立された接続 (connect()、accept()、close()) をトレースします。例。
- tools/tcpcong: TCP ソケットの輻輳制御ステータスの期間をトレースします。例。
ストレージおよびファイルシステムのツール
- tools/bitesize: プロセスごとの I/O サイズのヒストグラムを表示します。例。
- tools/cachestat: ページ キャッシュのヒット/ミス率をトレースします。例。
- tools/cachetop: プロセスごとのページ キャッシュのヒット/ミス率をトレースします。例。
- tools/dcsnoop: ディレクトリ エントリ キャッシュ (dcache) ルックアップをトレースします。例。
- tools/dcstat: ディレクトリ エントリ キャッシュ (dcache) の統計。例。
- tools/biolatency: ブロック デバイスの I/O レイテンシーをヒストグラムとして要約します。例。
- tools/biotop: ディスクのトップ: ブロック デバイス I/O をプロセスごとにまとめます。例。
- tools/biopattern: ランダム/シーケンシャル ディスク アクセス パターンを特定します。例。
- tools/biosnoop: PID とレイテンシを使用してブロック デバイス I/O をトレースします。例。
- tools/dirtop: ファイルはディレクトリごとに読み書きされます。ディレクトリのトップ。例。
- tools/filelife: 寿命の短いファイルの寿命をトレースします。例。
- tools/filegone: ファイルがなくなった理由 (削除または名前変更) をトレースします。例。
- tools/files lower: 遅い同期ファイルの読み取りと書き込みをトレースします。例。
- tools/filetop: ファイル名とプロセスによってファイルの読み取りと書き込みが行われます。ファイルの上部。例。
- tools/mdflush: md フラッシュ イベントをトレースします。例。
- tools/mountsnoop: システム全体のマウントおよびアンマウント システムコールをトレースします。例。
- tools/virtiostat: VIRTIO デバイスの IO 統計を表示します。例。
ファイルシステムツール
- tools/btrfsdist: btrfs 操作のレイテンシー分布をヒストグラムとして要約します。例。
- tools/btrfsswer: 遅い btrfs 操作をトレースします。例。
- tools/ext4dist: ext4 操作のレイテンシー分布をヒストグラムとして要約します。例。
- tools/ext4swer: 遅い ext4 操作をトレースします。例。
- tools/nfsslower: 遅い NFS 操作をトレースします。例。
- tools/nfsdist: NFS 操作のレイテンシー分布をヒストグラムとして要約します。例。
- tools/vfscount: VFS 呼び出しをカウントします。例。
- tools/vfsstat: いくつかの VFS 呼び出しをカウントし、列出力を表示します。例。
- tools/xfsdist: XFS 操作のレイテンシー分布をヒストグラムとして要約します。例。
- tools/xfsswer: 遅い XFS 操作をトレースします。例。
- tools/zfsdist: ZFS 操作のレイテンシー分布をヒストグラムとして要約します。例。
- tools/zfsslower: 遅い ZFS 操作をトレースします。例。
ネットワーキング
例:
- Examples/networking/distributed_bridge/: 分散ブリッジの例。
- Examples/networking/http_filter/: 単純な HTTP フィルターの例。
- example/networking/simple_tc.py: 単純なトラフィック制御の例。
- Examples/networking/simulation.py: シミュレーション ヘルパー。
- Examples/networking/neighbor_sharing/tc_neighbor_sharing.py example/networking/neighbor_sharing/tc_neighbor_sharing.c: IP ごとの分類とレート制限。
- example/networking/tunnel_monitor/: トラフィック フローを効率的に監視します。
- Examples/networking/vlan_learning/vlan_learning.py example/vlan_learning.c: イーサネット トラフィックをワーカー veth+namespace に分離します。
BPF イントロスペクション
BPF プログラムのイントロスペクションに役立つツール。
- introspection/bps.c: カーネルにロードされたすべての BPF プログラムをリストします。 BPF プログラムの場合は「ps」。例。
モチベーション
BPF は、カーネルにロードされたプログラムがクラッシュしないこと、および永久に実行できないことを保証しますが、それでも BPF は多くの任意の種類の計算を実行するのに十分な汎用性があります。現在、有効な BPF プログラムにコンパイルされるプログラムを C で作成することは可能ですが、無効な BPF にコンパイルされる C プログラムを作成する方がはるかに簡単です (C も同様です)。ユーザーは、プログラムを実行してみるまで、それが有効かどうかわかりません。
BPF 固有のフロントエンドを使用すると、言語で記述し、BPF バックエンドに関連する妥当性についてコンパイラーからフィードバックを受け取ることができる必要があります。このツールキットは、その柔軟性を最大限に活用しながら、有効な BPF プログラムのみを作成できるフロントエンドを提供することを目的としています。
さらに、現在の BPF との統合はワークフローが複雑で、場合によっては Linux カーネル ソース ツリーで直接コンパイルする必要があります。このツールチェーンは、開発者が BPF のコンパイルに費やす時間を最小限に抑え、代わりに作成できるアプリケーションと BPF で解決できる問題に重点を置くことを目的としています。
このツールキットの機能は次のとおりです。
- 共有ライブラリでのエンドツーエンドの BPF ワークフロー
- BPF バックエンド用に変更された C 言語
- JIT 用の llvm-bpf バックエンドとの統合
- JIT化されたプログラムの動的(アン)ロード
- BPF カーネル フックのサポート: ソケット フィルター、TC 分類子、TC アクション、および Kprobe
- Python のバインディング
- ソケット フィルター、tc 分類子、および kprobe の例
- 実行中のシステムをトレースするための自己完結型ツール
将来的には、Python 以外のバインディングもサポートされる可能性があります。ご希望の言語のサポートを自由に追加し、プル リクエストを送信してください。
チュートリアル
- docs/tutorial.md: bcc ツールを使用してパフォーマンス、トラブルシューティング、およびネットワークの問題を解決します。
- docs/tutorial_bcc_python_developer.md: Python インターフェイスを使用した新しい bcc プログラムの開発。
ネットワーキング
Red Hat Summit 2015 では、BPF に関するセッションの一部として BCC が紹介されました。マルチホスト vxlan 環境がシミュレートされ、BPF プログラムを使用して物理インターフェイスの 1 つが監視されます。 BPF プログラムは、インターフェイスを通過する内部および外部 IP アドレスに関する統計を保持し、ユーザー空間コンポーネントはそれらの統計を複数の粒度でトラフィック分布を示すグラフに変換します。ここのコードを参照してください。
貢献する
コードをコミットする準備はもうできていますか? IOVisor コミュニティのディスカッションに参加して、取り組みたい内容を確認するためのリソースをいくつか紹介します。
- メーリングリスト: https://lists.iovisor.org/mailman/listinfo/iovisor-dev
- IRC: #iovisor (irc.oftc.net)
- BCC 問題トラッカー: Github の問題
- スクリプトを提供するためのガイド: COTRIBUTING-SCRIPTS.md
外部リンク
BCC とその使用方法に関する詳細情報をお探しですか? Web 上の他の BCC コンテンツへのリンクは、LINKS.md にあります。