GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

iovisor

bcc – BCC – BPFベースのLinux IO分析、ネットワーク、監視などのためのツール

投稿日:

BCC – BPFベースのLinux IO分析、ネットワーク、監視などのためのツール

BPFコンパイラコレクション(BCC)

BCCは、効率的なカーネルトレースと操作プログラムを作成するためのツールキットであり、いくつかの便利なツールと例が含まれています。 正式にはeBPFと呼ばれる、拡張されたBPF(Berkeley Packet Filters)を使用します。これは、Linux 3.15に初めて追加された新機能です。 BCCが使用するものの多くは、Linux 4.1以上が必要です。

eBPFはIngoMolnárによって次のように記述されました:

このサイクルでもっと興味深い機能の1つは、eBPFプログラム(カーネルによって実行されるユーザー定義のサンドボックス化バイトコード)をkprobesに付加する機能です。 これにより、ライブ・カーネル・イメージ上でユーザーが定義した計測を可能にします。このイメージは、カーネルに負の影響を与えたり、ハングしたり、干渉したりすることはありません。

BCCは、カーネルインスツルメンテーションをC言語で(そしてLLVMの周りにCラッパーを含む)、Pythonとluaでフロントエンドを作成することで、BPFプログラムをより簡単に書くことができます。 パフォーマンス分析やネットワークトラフィック制御など、多くのタスクに適しています。

スクリーンショット

この例では、ディスクI / Oカーネル関数をトレースし、I / Oサイズのヒストグラムのカーネル内ヒストグラムを読み込みます。 効率を上げるため、ヒストグラムサマリーのみがユーザーレベルに戻されます。

# ./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 Kバイトのサイズであったバイモーダル分布を示しています。

ソース: bitehist.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!”を表示します。 新しいプロセスのために。
  • examples / tracing / mysqld_query.py:USDTプローブを使用してMySQLサーバのクエリをトレースします。
  • examples / tracing / nodejs_http_server.py:USDTプローブを使用してNode.js HTTPサーバー要求をトレースします。
  • examples / tracing / stacksnoop :カーネル関数をトレースし、すべてのカーネルスタックトレースを出力します。
  • tools / statsnoop :トレースstat()のシステムコール。
  • examples / tracing / task_switch.py​​:PIDとの間でタスクスイッチを数えます。
  • 例/トレース/ tcpv4connect.py:TCP IPv4アクティブな接続をトレースします。
  • examples / tracing / trace_fields.py :トレースされたイベントからフィールドを出力する簡単な例。
  • examples / tracing / urandomread.py :カーネルトレースポイントの例で、ランダム:urandom_readをトレースします。
  • examples / tracing / vfsreadlat.py examples / tracing / vfsreadlat.c :VFS読み取りレイテンシ分布。
  • examples / tracing / kvm_hypercall.py:KVMエントリ、終了、ハイパーコールのための条件付き静的カーネルトレースポイント

ツール:

  • tools / argdist :関数のパラメータ値をヒストグラムまたは頻度カウントとして表示します。
  • tools / bashreadline :システム全体で入力されたbashコマンドを出力します。
  • tools / biolatency :ブロックデバイスのI / Oレイテンシをヒストグラムとして要約します。
  • tools / biotop :ディスクのトップ:ブロックデバイスのI / Oをプロセス別に要約します。
  • tools / biosnoop :PIDとレイテンシを持つブロックデバイスI / Oをトレースします。
  • tools / bitesize :プロセスごとのI / Oサイズのヒストグラムを表示します。
  • tools / bpflist :アクティブなBPFプログラムとマップを持つプロセスを表示します。
  • tools / btrfsdist :btrfs操作のレイテンシ分布をヒストグラムとして要約します。
  • tools / btrfsslower :低速なbtrfs操作をトレースします。
  • tools / capable :セキュリティ機能のチェックを追跡します。
  • tools / cachestat :ページキャッシュのヒット/ミス率をトレースします。
  • tools / cachetop :プロセスごとのページキャッシュヒット/ミス率をトレースします。
  • tools / cpudist :ヒストグラムとしてのタスク当たりのCPU時間とオフCPU時間を要約します。
  • tools / cpuunclaimed :サンプルCPUがキューを実行し、未請求アイドルCPUを計算します。
  • tools / dbslower :MySQL / PostgreSQLのクエリをしきい値より遅くトレースします。
  • tools / dbstat :MySQL / PostgreSQLのクエリ待ち時間をヒストグラムとして要約します。
  • tools / dcsnoop :ディレクトリエントリキャッシュ(dcache)検索をトレースします。
  • tools / dcstat :ディレクトリエントリキャッシュ(dcache)の統計情報。
  • tools / deadlock_detector :実行中のプロセスで潜在的なデッドロックを検出します。
  • tools / execsnoop :exec() syscallsを介して新しいプロセスをトレースします。
  • tools / ext4dist :ext4操作待ち時間分布をヒストグラムとして要約します。
  • tools / ext4slower :遅いext4操作を追跡します。
  • tools / filelife :短命ファイルの寿命を追跡します。
  • tools / fileslower :遅い同期ファイルの読み取りと書き込みをトレースします。
  • tools / filetop :ファイルはファイル名とプロセスによって読み書きされます。 ファイルのトップ
  • tools / funccount :カーネル関数呼び出しをカウントする。
  • tools / funclatency :時間関数とその待ち時間分布を表示します。
  • tools / funcslower :遅いカーネル関数やユーザー関数呼び出しをトレースします。
  • tools / gethostlatency :getaddrinfo / gethostbyname [2]呼び出しの待ち時間を表示します。
  • tools / hardirqs :ハードIRQ(ハード割り込み)イベントの時間を測定します。
  • tools / killsnoop :kill()システムコールによって発行されたシグナルをトレースします。
  • tools / llcstat :プロセスごとに CPUキャッシュ参照とミスを要約します。
  • tools / mdflush :md flushイベントをトレースします。
  • tools / mysqld_qslower :MySQLサーバーのクエリをしきい値よりも遅くトレースします。
  • tools / memleak :未処理のメモリ割り当てを表示してメモリリークを検出します。
  • tools / nfsslower :遅いNFS操作をトレースします。
  • tools / nfsdist :NFS操作のレイテンシ分布をヒストグラムとして要約します。
  • tools / offcputime :オフCPU時間をカーネルスタックトレースで要約します。
  • tools / offwaketime :カーネルオフCPUスタックとウォーカースタックによるブロック時間を要約します。
  • tools / oomkill :メモリ不足(OOM)のキラーを追跡します。
  • tools / opensnoop :open()システムコールをトレースします。
  • tools / pidpersec :新しいプロセスをカウントする(forkを介して)。
  • tools / profile :時間間隔でスタックトレースをサンプリングしてCPU使用率をプロファイルします。
  • tools / reset-trace :トレースの状態をリセットします。 メンテナンスツールのみ。
  • tools / runqlat :キュー(スケジューラ)の待ち時間をヒストグラムとして実行します。
  • tools / runqlen :キューの長さをヒストグラムとして実行します。
  • tools / slabratetop :カーネルSLAB / SLUBメモリキャッシュの割り振り速度の上限。
  • tools / softirqs :ソフトIRQ(ソフト割り込み)イベント時間を測定します。
  • tools / solisten :TCPソケットをトレースします。
  • tools / sslsniff :OpenSSLで書かれたデータと読み込まれたデータをスニッフィングします。
  • tools / stackcount :カーネル関数呼び出しとそれらのスタックトレースをカウントします。
  • tools / syncsnoop :トレースsync()システムコール。
  • tools / syscount :システムコール数と待ち時間を要約します。
  • tools / tcpaccept :TCPパッシブ接続をトレースします(accept())。
  • tools / tcpconnect :TCPアクティブな接続をトレースします(connect())。
  • tools / tcpconnlat :TCPアクティブな接続待ち時間をトレースします(connect())。
  • tools / tcplife :TCPセッションを追跡し 、寿命を要約します。
  • tools / tcpretrans :TCP再送信とTLPをトレースします。
  • tools / tcpstates :TCPセッションの状態変化を継続時間とともにトレースします。
  • tools / tcpsubnet :サブネット別にTCP送信を要約して集計します。
  • tools / tcptop :ホストによるTCP send / recvスループットを要約します。 TCPのトップ
  • tools / tcptracer :TCP接続の確立をトレースします(connect()、accept()、close())。
  • tools / tplist :カーネルトレースポイントまたはUSDTプローブとそのフォーマットを表示します。
  • tools / trace :フィルタを使って任意の関数をトレースします。
  • tools / ttysnoop :ttyまたはptsデバイスからのライブ出力を監視します。
  • tools / ucalls :高水準言語のメソッド呼び出しまたはLinuxシステムコールを要約します。
  • tools / uflow :高水準言語でメソッドフローグラフを出力します。
  • tools / ugc :ガベージコレクションイベントを高水準言語でトレースします。
  • tools / uobjnew :オブジェクトの割り当てイベントを、オブジェクトの種類と割り当てられたバイト数で要約します。
  • tools / ustat :GC、スレッド作成、オブジェクト割り当て、例外などのイベントを高水準言語で収集します。
  • tools / uthreads :Javaでのスレッド作成イベントと未処理のpthreadをトレースします。
  • tools / vfscount tools / vfscount.c :VFS呼び出しをカウントします。
  • tools / vfsstat tools / vfsstat.c :列出力を使ってVFS呼び出しを数えます。
  • tools / wakeuptime :wakerカーネルスタックによってスリープ解除時刻をまとめてウェイクアップする。
  • tools / xfsdist :XFS操作のレイテンシ分布をヒストグラムとして要約します。
  • tools / xfsslower :遅いXFS操作をトレースします。
  • tools / zfsdist :ZFS操作のレイテンシ分布をヒストグラムとして要約します。
  • tools / zfsslower :遅いZFS操作を追跡します。

ネットワーキング

例:

BPFイントロスペクション:

BPFプログラムのイントロスペクションに役立つツール。

  • introspection / bps.c :カーネルにロードされたすべてのBPFプログラムを一覧表示します。 BPFプログラムのための ‘ps’

動機

BPFは、カーネルにロードされたプログラムがクラッシュせず、永遠に実行できないことを保証しますが、BPFは多くの任意のタイプの計算を実行するのに十分な一般目的です。 現在、有効なBPFプログラムにコンパイルするプログラムをC言語で作成することは可能ですが、無効なBPFにコンパイルするCプログラムを作成する方がはるかに簡単です(Cはそうです)。 ユーザーは、プログラムが有効であるかどうかに関係なく、プログラムを実行しようとするまで知らないでしょう。

BPF固有のフロントエンドでは、BPFバックエンドに関係するように、言語で記述し、コンパイラからの妥当性に関するフィードバックを受け取ることができます。 このツールキットは、有効なBPFプログラムを作成できるフロントエンドを提供することを目的としていますが、柔軟性を最大限発揮します。

さらに、現在のBPFとの統合では、kludgyワークフローがあり、時にはLinuxカーネルのソースツリーでコンパイルすることもあります。 このツールチェインは、開発者がBPFをコンパイルするのにかかる時間を最小限に抑えることを目的としており、書き込めるアプリケーションやBPFで解決できる問題に焦点を当てています。

このツールキットの機能は次のとおりです。

  • 共有ライブラリのエンドツーエンドBPFワークフロー
    • BPFバックエンド用の修正されたC言語
    • JITのためのllvm-bpfバックエンドとの統合
    • JITedプログラムの動的(un)ローディング
    • BPFカーネルフックのサポート:ソケットフィルタ、tcクラシファイア、tcアクション、およびkprobes
  • Pythonのバインディング
  • ソケットフィルタ、tcクラシファイア、およびkprobesの例
  • 実行中のシステムをトレースするための自己完結型のツール

将来は、Python以外のバインディングもサポートされる可能性があります。 希望の言語のサポートを追加してプルリクエストを送信してください!

チュートリアル

ネットワーキング

Red Hat Summit 2015では、BPCC に関するセッションの一環としてBCCが発表されました マルチホストvxlan環境がシミュレートされ、BPFプログラムが物理インタフェースの1つを監視するために使用されます。 BPFプログラムは、インターフェイスを通過する内部および外部IPアドレスの統計情報を保持し、ユーザー空間コンポーネントは、これらの統計情報を、複数の細かさでトラフィック分布を示すグラフに変換します。 ここのコードを見てください

貢献する

既にいくつかのコードをコミットするためにポンプアップ? IOVisorコミュニティのディスカッションに参加し、あなたが何をしたいのかを見るためのいくつかのリソースがあります。

外部リンク

BCCとそれがどのように使用されているかの詳細をお探しですか? ウェブ上の他のBCCコンテンツへのリンクはLINKS.mdにあります。







-iovisor

執筆者: