オリジナルソング宝華Linuxリーディングフィールド2019-12-25
bccはeBPFのフロントエンドです。もちろん、このフロントエンドは特にシンプルで使いやすいです。C言語で記述されたBPFプログラムをPythonに直接埋め込み、BPFバイトコードを生成してカーネルにロードし、kprobeやトレースポイントなどをマウントして実行することができます。その後、PythonからC関数からエクスポートされたマップデータとイベントごとのデータを取り出して印刷することもできます。
詳細な原則については、
http://www.brendangregg.com/ebpf.htmlを参照してください
。非常に簡単なチュートリアルは、https://github.com/iovisor/bcc/blob/master/docs/tutorial_bcc_python_developer.mdから提供されています
。
bitehist.pyの例を特別に見てみましょう。
上記のプログラムは、kprobeを介してカーネルのblk_account_io_completion()関数をインターセプトし、各リクエストのdata_lenを単位KBytesに変換してから、対数を取り、HISTOGRAM(のマップに属する)を追加します。 1)、その後、pythonは呼び出します
b["dist"].print_log2_hist("kbytes")
この履歴マップを印刷します。これにより、要求ディスク要求のサイズ分布をユーザーに示すことができます。
もう1つの典型的な例は、kprobeを介して関数のエントリポイントとリターンポイントをインターセプトして、関数の呼び出し遅延を取得することです。
上記のBPF Cプログラムは、現在の時刻を開始HASHに追加します(キーは、関数が入力されたときのプロセス(kprobe)です) pid、valueは関数の開始時間です。関数の終了時(kretprobe)、関数の開始時間はstart.loopup(&pid)を介して取得され、関数の終了時に、終了時間から開始時間を引いた値が対数の後に計算されます。 HISTOGRAMに入れます。その後、pythonはこのHISTを取得して印刷できます。
これにより、遅延ホットスポットの分布が表示されます。
とにかく、BPF cとpythonの構文を理解した後、そのようなプログラムを書くのは難しくありません。ただし、多くの場合、実際に自分でコードを作成する必要はありません。優れた人々がすでに多くの既製のツールを作成しているからです。
たとえば、バイオの遅延を分析します。
多数の遅延が512-1023と1024-2047の間に集中しています。さらに、4096-8191は、このマルチモーダル遅延のもう1つのホットスポットです。
iostatコマンドは単に平均遅延を表示し、遅延の分布を表示しないため、このことはiostatコマンドよりも詳細で信頼性があります。たとえば、maniostatは次のことを知ることができます。
await-デバイスに発行されたI / O要求が処理されるまでの平均時間(ミリ秒単位)。これには、キュー内のリクエストに費やされた時間とそれらのサービスに費やされた時間が含まれます。
ただし、多くの場合、遅延はマルチモーダル機能として表示され、複数のピーク領域があります。
平均、それは、時にはそれほど正確ではないようです。たとえば、クラスの生徒の平均スコアは70ですが、このクラスの子供用シューズの次の特徴を示すことはできません。
- 約30ポイントの貧しい学生がたくさんいます
- スコア60の中学生がたくさんいます
- 約90ポイントのトップクラスの学生がたくさんい
ます。HISTグラフの場合、その分布は似
ています。より正確に見えます。
次に、既製のツールであるfunclatencyを使用して、コードで実際に遅延しているusleep(100)の量を分析し、最も単純なアプリケーションを作成して、それをa.outにコンパイルします。
実行後、usleep(100)を取得してカーネルdo_nanosleepを呼び出します。実際の遅延:
実際、usleep(100)は256-511usの広い領域に集中しています。したがって、このusleep(100)がどれほど正確であるか、神は知っています。
平湖の10マイルは霜でいっぱいで、緑の絹の隅々までが悲しいです。
月の形でお互いを見ると、マンダリンのアヒルだけが不死者を羨ましがりません。
(終了)