Song Baohua:eBPF / bccを使用してシステムパフォーマンスを分析する簡単なケース

オリジナルソング宝華Linuxリーディングフィールド2019-12-25


bccはeBPFのフロントエンドです。もちろん、このフロントエンドは特にシンプルで使いやすいです。C言語で記述されたBPFプログラムをPythonに直接埋め込み、BPFバイトコードを生成してカーネルにロードし、kprobeやトレースポイントなどをマウントして実行することができます。その後、PythonからC関数からエクスポートされたマップデータとイベントごとのデータを取り出して印刷することもできます。
Song Baohua:eBPF / bccを使用してシステムパフォーマンスを分析する簡単なケース
詳細な原則については、
http//www.brendangregg.com/ebpf.htmlを参照してください
。非常に簡単なチュートリアルは、https//github.com/iovisor/bcc/blob/master/docs/tutorial_bcc_python_developer.mdから提供されています

bitehist.pyの例を特別に見てみましょう。
Song Baohua:eBPF / bccを使用してシステムパフォーマンスを分析する簡単なケース
上記のプログラムは、kprobeを介してカーネルのblk_account_io_completion()関数をインターセプトし、各リクエストのdata_lenを単位KBytesに変換してから、対数を取り、HISTOGRAM(のマップに属する)を追加します。 1)、その後、pythonは呼び出します

b["dist"].print_log2_hist("kbytes")

この履歴マップを印刷します。これにより、要求ディスク要求のサイズ分布をユーザーに示すことができます。
Song Baohua:eBPF / bccを使用してシステムパフォーマンスを分析する簡単なケース

もう1つの典型的な例は、kprobeを介して関数のエントリポイントとリターンポイントをインターセプトして、関数の呼び出し遅延を取得することです。
Song Baohua:eBPF / bccを使用してシステムパフォーマンスを分析する簡単なケース
上記のBPF Cプログラムは、現在の時刻を開始HASHに追加します(キーは、関数が入力されたときのプロセス(kprobe)です) pid、valueは関数の開始時間です。関数の終了時(kretprobe)、関数の開始時間はstart.loopup(&pid)を介して取得され、関数の終了時に、終了時間から開始時間を引いた値が対数の後に計算されます。 HISTOGRAMに入れます。その後、pythonはこのHISTを取得して印刷できます。
Song Baohua:eBPF / bccを使用してシステムパフォーマンスを分析する簡単なケース
これにより、遅延ホットスポットの分布が表示されます。

とにかく、BPF cとpythonの構文を理解した後、そのようなプログラムを書くのは難しくありません。ただし、多くの場合、実際に自分でコードを作成する必要はありません。優れた人々がすでに多くの既製のツールを作成しているからです。
たとえば、バイオの遅延を分析します。
Song Baohua:eBPF / bccを使用してシステムパフォーマンスを分析する簡単なケース
多数の遅延が512-1023と1024-2047の間に集中しています。さらに、4096-8191は、このマルチモーダル遅延のもう1つのホットスポットです。
iostatコマンドは単に平均遅延を表示し、遅延の分布を表示しないため、このことはiostatコマンドよりも詳細で信頼性があります。たとえば、maniostatは次のことを知ることができます。

await-デバイスに発行されたI / O要求が処理されるまでの平均時間(ミリ秒単位)。これには、キュー内のリクエストに費やされた時間とそれらのサービスに費やされた時間が含まれます。

ただし、多くの場合、遅延はマルチモーダル機能として表示され、複数のピーク領域があります。
Song Baohua:eBPF / bccを使用してシステムパフォーマンスを分析する簡単なケース
平均、それは、時にはそれほど正確ではないようです。たとえば、クラスの生徒の平均スコアは70ですが、このクラスの子供用シューズの次の特徴を示すことはできません。

  1. 約30ポイントの貧しい学生がたくさんいます
  2. スコア60の中学生がたくさんいます
  3. 約90ポイントのトップクラスの学生がたくさんい
    ます。HISTグラフの場合、その分布は似
    Song Baohua:eBPF / bccを使用してシステムパフォーマンスを分析する簡単なケース
    ています。より正確に見えます。
    次に、既製のツールであるfunclatencyを使用して、コードで実際に遅延しているusleep(100)の量を分析し、最も単純なアプリケーションを作成して、それをa.outにコンパイルします。
    Song Baohua:eBPF / bccを使用してシステムパフォーマンスを分析する簡単なケース
    実行後、usleep(100)を取得してカーネルdo_nanosleepを呼び出します。実際の遅延:
    Song Baohua:eBPF / bccを使用してシステムパフォーマンスを分析する簡単なケース
    実際、usleep(100)は256-511usの広い領域に集中しています。したがって、このusleep(100)がどれほど正確であるか、神は知っています。

平湖の10マイルは霜でいっぱいで、緑の絹の隅々までが悲しいです。
月の形でお互いを見ると、マンダリンのアヒルだけが不死者を羨ましがりません。


(終了)

おすすめ

転載: blog.51cto.com/15015138/2555492