GNU/Linux >> Linux の 問題 >  >> Linux

Linux用のbpftraceの紹介

Bpftraceは、本番環境のパフォーマンスの問題を分析し、ソフトウェアのトラブルシューティングを行うためのLinux用の新しいオープンソーストレーサーです。そのユーザーと貢献者には、Netflix、Facebook、Red Hat、Shopifyなどが含まれ、さまざまなコーディングコンテストで優勝した才能のある英国を拠点とする開発者であるAlastairRobertsonによって作成されました。

Linuxにはすでに多くのパフォーマンスツールがありますが、それらは多くの場合カウンターベースであり、可視性が制限されています。たとえば、iostat(1)または監視エージェントは、平均ディスクレイテンシを通知しますが、このレイテンシの分布は通知しません。分布は、複数のモードまたは外れ値を明らかにする可能性があり、どちらもパフォーマンスの問題の本当の原因である可能性があります。 Bpftraceは、この種の分析に適しています。メトリックを分布またはイベントごとのログに分解し、死角を可視化するための新しいメトリックを作成します。

ワンライナーまたはスクリプトを介してbpftraceを使用でき、多くの事前に作成されたツールが付属しています。これは、PID 181の読み取りレイテンシーの分布をトレースし、それを2の累乗のヒストグラムとして表示する例です。

# bpftrace -e 'kprobe:vfs_read /pid == 30153/ { @start[tid] = nsecs; }
kretprobe:vfs_read /@start[tid]/ { @ns = hist(nsecs - @start[tid]); delete(@start[tid]); }'
Attaching 2 probes...
^C

@ns:
[256, 512)         10900 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                      |
[512, 1k)          18291 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|
[1k, 2k)            4998 |@@@@@@@@@@@@@@                                      |
[2k, 4k)              57 |                                                    |
[4k, 8k)             117 |                                                    |
[8k, 16k)             48 |                                                    |
[16k, 32k)           109 |                                                    |
[32k, 64k)             3 |                                                    |

この例では、利用可能な数千のうち1つのイベントを計測します。奇妙なパフォーマンスの問題がある場合は、おそらくそれに光を当てることができるいくつかのbpftraceワンライナーがあります。大規模な環境では、この機能により数百万ドルを節約できます。小規模な環境では、レイテンシの外れ値を排除するのに役立つ可能性があります。

Linuxターミナル

  • Linux用の上位7つのターミナルエミュレータ
  • Linuxでのデータ分析のための10個のコマンドラインツール
  • 今すぐダウンロード:SSHチートシート
  • 高度なLinuxコマンドのチートシート
  • Linuxコマンドラインチュートリアル

以前、bpftraceとBCC(BPFコンパイラコレクション)を含む他のトレーサーについて書きました。 BCCは、複雑なツールやエージェントの缶詰に最適です。 Bpftraceは、短いスクリプトや臨時の調査に最適です。この記事では、bpftrace言語、変数タイプ、プローブ、およびツールを要約します。

Bpftraceは、仮想命令セットを処理するカーネル内実行エンジンであるBPF(Berkeley Packet Filter)を使用します。 BPFは、カーネル機能を拡張するための安全な方法を提供するために、近年拡張されました(別名eBPF)。また、前回のLinux Plumber's ConferenceでBPFについて少なくとも24回の講演があり、システムエンジニアリングでも話題になっています。 BPFはLinuxカーネルに含まれており、bpftraceは、可観測性のためにBPFの使用を開始するための最良の方法です。

インストール方法については、bpftrace INSTALLガイドを参照し、最新バージョンを入手してください。 0.9.2がリリースされました。 Kubernetesクラスタの場合、それを実行するためのkubectl-traceもあります。

構文
probe[,probe,...] /filter/ { action }

プローブは、計測するイベントを指定します。フィルタはオプションであり、ブール式に基づいてイベントをフィルタリングできます。アクションは実行されるミニプログラムです。

これがHelloWorldです:

# bpftrace -e 'BEGIN { printf("Hello eBPF!\n"); }'

プローブはBEGIN 、プログラムの開始時に実行される特別なプローブ(awkなど)。フィルタはありません。アクションはprintf() ステートメント。

実例:

# bpftrace -e 'kretprobe:sys_read /pid == 181/ { @bytes = hist(retval); }'

これはkretprobeを使用します sys_read()の戻り値を計測します カーネル関数。 PIDが181の場合、特別なマップ変数 @bytes 戻り値がretvalのlog2ヒストグラム関数が入力されます sys_read()の 。これにより、PID 181に対して返される読み取りサイズのヒストグラムが生成されます。アプリは1バイトの読み取りを大量に実行していますか?多分それは最適化することができます。

プローブタイプ

これらは関連するプローブのライブラリです。現在サポートされているタイプは次のとおりです(さらに追加されます):

タイプ 説明
トレースポイント カーネル静的インストルメンテーションポイント
usdt ユーザーレベルの静的に定義されたトレース
kprobe カーネル動的関数インストルメンテーション
kretprobe カーネル動的関数リターンインストルメンテーション
アップローブ ユーザーレベルの動的関数インストルメンテーション
uretprobe ユーザーレベルの動的関数リターンインストルメンテーション
ソフトウェア カーネルソフトウェアベースのイベント
ハードウェア ハードウェアカウンターベースのインストルメンテーション
ウォッチポイント メモリウォッチポイントイベント(開発中)
プロファイル すべてのCPUにわたる時限サンプリング
間隔 時限レポート(1つのCPUから)
BEGIN bpftraceの開始
終了 bpftraceの終わり

動的インストルメンテーション(別名動的トレース)は、実行中のバイナリ内のソフトウェア機能を再起動せずにトレースできる超大国です。これにより、ほぼすべての問題の根底にたどり着くことができます。ただし、公開する関数は、ソフトウェアバージョンごとに変更される可能性があるため、安定したAPIとは見なされません。したがって、静的インストルメンテーションでは、イベントポイントがハードコーディングされ、安定したAPIになります。 bpftraceプログラムを作成するときは、動的タイプの前に静的タイプを最初に使用して、プログラムがより安定するようにしてください。

変数タイプ
変数 説明
@name グローバル
@name [key] ハッシュ
@name [tid] スレッドローカル
$ name スクラッチ

@の変数 プレフィックスは、連想配列のように動作できるBPFマップを使用します。次の2つの方法のいずれかでデータを入力できます。

  • 変数の割り当て: @name =x;
  • 関数の割り当て: @name =hist(x);

データをすばやく要約する方法を提供するために、さまざまなマップ入力機能が組み込まれています。

組み込みの変数と関数

組み込みの変数と関数の一部を次に示しますが、さらに多くの機能があります。

組み込み変数:

変数 説明
pid プロセスID
comm プロセス名またはコマンド名
nsecs 現在の時刻(ナノ秒)
kstack カーネルスタックトレース
ustack ユーザーレベルのスタックトレース
arg0 ... argN 関数の引数
args トレースポイント引数
retval 関数の戻り値
名前 完全なプローブ名

組み込み関数:

関数 説明
printf( "...") フォーマットされた文字列を印刷する
time( "...") フォーマットされた時刻を印刷
system( "...") シェルコマンドを実行
@ =count() イベントのカウント
@ =hist(x) xの2乗ヒストグラム
@ =lhist(x、min、max、step) xの線形ヒストグラム

詳細については、リファレンスガイドを参照してください。

ワンライナーチュートリアル

bpftraceを学ぶための優れた方法は、ワンライナーを使用することです。これをワンライナーのチュートリアルに変えて、以下をカバーします。

プローブの一覧表示 bpftrace -l'tracepoint:syscalls:sys_enter _ *'
Hello world bpftrace -e'BEGIN {printf( "hello world \ n")}'
ファイルが開きます bpftrace -e'tracepoint:syscalls:sys_enter_open {printf( "%s%s \ n"、comm、str(args-> filename))}'
プロセスごとのシステムコール数 bpftrace -e'tracepoint:raw_syscalls:sys_enter {@ [comm] =count()}'
read()バイトの配布 bpftrace -e'tracepoint:syscalls:sys_exit_read / pid ==18644 / {@bytes =hist(args-> retval)}'
read()バイトのカーネル動的トレース bpftrace -e'kretprobe:vfs_read {@bytes =lhist(retval、0、2000、200)}'
タイミングread()s bpftrace -e'kprobe:vfs_read {@start [tid] =nsecs} kretprobe:vfs_read / @start [tid] / {@ns [comm] =hist(nsecs-@start [tid]); delete(@start [tid])}'
プロセスレベルのイベントをカウントする bpftrace -e'tracepoint:sched:sched * {@ [name] =count()} interval:s:5 {exit()}'
プロファイルオンCPUカーネルスタック bpftrace -e'profile:hz:99 {@ [stack] =count()}'
スケジューラトレース bpftrace -e'tracepoint:sched:sched_switch {@ [stack] =count()}'
ブロックI/Oトレース bpftrace -e'tracepoint:block:block_rq_issue {@ =hist(args-> bytes); }
カーネル構造体トレース(ワンライナーではなくスクリプト) コマンド: bpftrace path.bt 、path.btファイルは次のとおりです。



#include

#include




kprobe:vfs_open {printf( "open path:%s \ n"、str(((path *)arg0)-> dentry-> d_name 。名前)); }

それぞれの説明については、チュートリアルを参照してください。

提供されているツール

ワンライナーとは別に、bpftraceプログラムは複数行のスクリプトにすることができます。 Bpftraceには、そのうち28個がツールとして付属しています:

これらは/toolsにあります ディレクトリ:

tools# ls *.bt
bashreadline.bt  dcsnoop.bt         oomkill.bt    syncsnoop.bt   vfscount.bt
biolatency.bt    execsnoop.bt       opensnoop.bt  syscount.bt    vfsstat.bt
biosnoop.bt      gethostlatency.bt  pidpersec.bt  tcpaccept.bt   writeback.bt
bitesize.bt      killsnoop.bt       runqlat.bt    tcpconnect.bt  xfsdist.bt
capable.bt       loads.bt           runqlen.bt    tcpdrop.bt
cpuwalk.bt       mdflush.bt         statsnoop.bt  tcpretrans.bt

パフォーマンスの問題の診断や一般的なトラブルシューティングでの使用とは別に、bpftraceを学習する別の方法も提供します。ここにいくつかの例があります。

ソース

biolatency.btのコードは次のとおりです :

tools# cat -n biolatency.bt
     1  /*
     2   * biolatency.bt    Block I/O latency as a histogram.
     3   *                  For Linux, uses bpftrace, eBPF.
     4   *
     5   * This is a bpftrace version of the bcc tool of the same name.
     6   *
     7   * Copyright 2018 Netflix, Inc.
     8   * Licensed under the Apache License, Version 2.0 (the "License")
     9   *
    10   * 13-Sep-2018  Brendan Gregg   Created this.
    11   */
    12
    13  BEGIN
    14  {
    15          printf("Tracing block device I/O... Hit Ctrl-C to end.\n");
    16  }
    17
    18  kprobe:blk_account_io_start
    19  {
    20          @start[arg0] = nsecs;
    21  }
    22
    23  kprobe:blk_account_io_done
    24  /@start[arg0]/
    25
    26  {
    27          @usecs = hist((nsecs - @start[arg0]) / 1000);
    28          delete(@start[arg0]);
    29  }
    30 
    31  END
    32  {
    33          clear(@start);
    34  }

わかりやすく、読みやすく、スライドに含めるのに十分な長さです。このバージョンでは、カーネル動的トレースを使用して、 blk_account_io_start()を計測します。 およびblk_account_io_done() 関数、および arg0でキー設定されたそれらの間のタイムスタンプを渡します それぞれに。 arg0 kprobe その関数の最初の引数である構造体リクエスト* 、およびそのメモリアドレスは一意の識別子として使用されます。

サンプルファイル

これらのツールのスクリーンショットと説明は、GitHubリポジトリで * _ example.txtとして表示されます。 ファイル。例:

tools# more biolatency_example.txt
Demonstrations of biolatency, the Linux BPF/bpftrace version.


This traces block I/O, and shows latency as a power-of-2 histogram. For example:

# biolatency.bt
Attaching 3 probes...
Tracing block device I/O... Hit Ctrl-C to end.
^C

@usecs:
[256, 512)             2 |                                                    |
[512, 1K)             10 |@                                                   |
[1K, 2K)             426 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|
[2K, 4K)             230 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@                        |
[4K, 8K)               9 |@                                                   |
[8K, 16K)            128 |@@@@@@@@@@@@@@@                                     |
[16K, 32K)            68 |@@@@@@@@                                            |
[32K, 64K)             0 |                                                    |
[64K, 128K)            0 |                                                    |
[128K, 256K)          10 |@                                                   |

While tracing, this shows that 426 block I/O had a latency of between 1K and 2K
usecs (1024 and 2048 microseconds), which is between 1 and 2 milliseconds.
There are also two modes visible, one between 1 and 2 milliseconds, and another
between 8 and 16 milliseconds: this sounds like cache hits and cache misses.
There were also 10 I/O with latency 128 to 256 ms: outliers. Other tools and
instrumentation, like biosnoop.bt, can shed more light on those outliers.
[...]

これらのツールを理解しようとするときは、出力が(設計上)自明である可能性があるため、サンプルファイルに直接切り替えることが最も効果的な場合があります。

マニュアルページ

/ man/man8の下のGitHubレポジトリにはすべてのツールのマニュアルページもあります。出力フィールドとツールの予想されるオーバーヘッドに関するセクションが含まれています。

# nroff -man man/man8/biolatency.8
biolatency(8)               System Manager's Manual              biolatency(8)



NAME
       biolatency.bt - Block I/O latency as a histogram. Uses bpftrace/eBPF.

SYNOPSIS
       biolatency.bt

DESCRIPTION
       This  tool  summarizes  time  (latency) spent in block device I/O (disk
       I/O) as a power-of-2 histogram. This  allows  the  distribution  to  be
       studied,  including  modes and outliers. There are often two modes, one
       for device cache hits and one for cache misses, which can be  shown  by
       this tool. Latency outliers will also be shown.
[...]

これらすべてのマニュアルページを書くことは、これらのツールを開発する上で最も面白くなかった部分であり、ツールの開発よりも書くのに時間がかかったものもありましたが、最終結果を見るのは素晴らしいことです。

bpftraceとBCC

eBPFがカーネルにマージされているため、プログラムを作成するためのBPFライブラリとPython、C ++、およびLuaインターフェイスを提供するBCCフロントエンドにほとんどの努力が注がれています。私はBCC/Pythonで多くのツールを開発しました。 BCCでのコーディングは冗長ですが、うまく機能します。パフォーマンスの問題をハッキングしている場合は、bpftraceが1回限りのカスタムクエリに適しています。多くのコマンドラインオプションを備えたツールやPythonライブラリを使用するエージェントを作成している場合は、BCCの使用を検討することをお勧めします。

Netflixパフォーマンスチームでは、次の両方を使用しています。他の人が簡単に使用できる既定のツールの開発とエージェントの開発にBCCを使用します。アドホック分析用のbpftrace。ネットワークエンジニアリングチームは、BCCを使用してそのニーズに対応するエージェントを開発してきました。セキュリティチームは、ゼロデイ脆弱性を検出するための迅速なアドホックインストルメンテーションのためのbpftraceに最も関心があります。また、開発者チームは、私たちが構築しているセルフサービスGUI(Vector)を介して、知らないうちに両方を使用し、インスタンスにSSHで接続して、既定のツールまたはアドホックbpftraceワンライナーを実行する場合があります。

詳細
  • GitHubのbpftraceリポジトリ
  • bpftraceワンライナーチュートリアル
  • bpftraceリファレンスガイド
  • より複雑なBPFベースのツール用のBCCリポジトリ

また、今年はbpftraceを取り上げた本が出ています: BPFパフォーマンスツール:Linuxシステムとアプリケーションの可観測性 、Addison Wesleyによって公開され、多くの新しいbpftraceツールが含まれています。


bpftraceを作成してくれたAlastairRobertsonと、過去5年間のすべての作業を行ってくれたbpftrace、BCC、およびBPFコミュニティに感謝します。


Linux
  1. KaliLinuxでのNmapの概要

  2. ネットワーク診断用の10のLinuxコマンド

  3. Linuxシステム管理のためのAnsibleの役割の簡単な紹介

  1. LinuxファンのためのFreeDOSコマンド

  2. ゲーム用の4つのLinuxディストリビューション

  3. Linuxシステム管理者向けのWebアプリケーションファイアウォールの概要

  1. Linux用の5つの生産性アプリ

  2. Linux用のプリンターの選択

  3. Linux用のDomTermターミナルエミュレータの概要