eBPFを使用した学習トレース:ガイドと例

こんにちは、Habr! eBPFに関するBrendan Greggの記事の翻訳に注目してください

Linux Plumbersカンファレンスで少なくとも24のeBPFプレゼンテーションがありました。 それはすぐに貴重な技術であるだけでなく、求められるスキルにもなりました。 おそらく、新しい年のいくつかの目標を設定したいと思うでしょう-eBPFを学んでください!







eBPFという用語は、仮想カーネル命令セット(VKIS)などの実質的なものを意味する必要がありますが、その起源は拡張バークレーパケットフィルターです。 ネットワークパフォーマンス、ファイアウォール、セキュリティ、トレース、デバイスドライバーなど、多くの分野に適用できます。 それらのいくつかについては、インターネット上で多くの自由に入手可能な情報があります-例えば、トレースですが、他のものについてはまだありません。 トレースという用語は、各イベントの情報を生成できるパフォーマンス分析および監視ツールを指します。 既にトレーサーを使用している可能性があります-tcpdumpおよびstraceは特殊なトレーサーです。







この投稿では、初心者、経験者、および上級ユーザー向けのセクションにグループ化された、トレース目的でのeBPFの使用を検討するプロセスについて説明します。 要約すると:









初心者



1. eBPF、bcc、bpftrace、iovisorとは何ですか?



eBPFはLinuxでもJavaScriptがHTMLで行うのと同じことを行います。 そのため、JavaScriptを使用すると、静的なHTMLサイトの代わりに、ブラウザの安全な仮想マシンで実行されるイベント(マウスクリックなど)で実行するミニプログラムを定義できます。 eBPFを使用すると、カーネルを編集する代わりに、カーネル内の安全な仮想マシン上のディスクI / Oなどのイベントで実行されるミニプログラムを作成できます。 実際、eBPFは、JavaScript自体よりもJavaScriptを実行するv8仮想マシンに似ています。 eBPFはLinuxカーネルの一部です。







v8バイトコードのように、eBPFで直接プログラミングすることは非常に困難です。 しかし、v8では誰もコーディングしていません。誰もがJavaScriptで、または多くの場合JavaScript(jQuery、Angular、Reactなど)上のフレームワークで記述します。 eBPFでも同じです。 人々はそれを使用し、フレームワークを介してコードを書きます。 トレースの場合、主なものはbccbpftraceです。 カーネルコードベースではなく、 iovisorというgithubのLinux Foundationプロジェクトに住んでいます。







2. eBPFを使用してサンプルトレースを作成できますか?



このeBPFベースのユーティリティは、プロセスID(PID)、コマンド名(COMM)、送受信バイト(TX_KB、RX_KB)、およびミリ秒単位の持続時間(MS)で完全に確立されたTCPセッションを示します。









#tcplife
 PID COMM LADDR LPORT RADDR RPORT TX_KB RX_KB MS
 22597 recordProg 127.0.0.1 46644 127.0.0.1 28527 0 0 0.23
 3277 redis-serv 127.0.0.1 28527 127.0.0.1 46644 0 0 0.28
 22598カール100.66.3.172 61620 52.205.89.26 80 0 1 91.79
 22604カール100.66.3.172 44400 52.204.43.121 80 0 1 121.38
 22624レコードProg 127.0.0.1 46648 127.0.0.1 28527 0 0 0.22
 3277 redis-serv 127.0.0.1 28527 127.0.0.1 46648 0 0 0.27
 22647 recordProg 127.0.0.1 46650 127.0.0.1 28527 0 0 0.21
 3277 redis-serv 127.0.0.1 28527 127.0.0.1 46650 0 0 0.26
 [...] 




この eBPFが可能にするわけではありません 。古いカーネルテクノロジーを使用するようにtcplifeを書き換えることができます。 しかし、私がそうすれば、パフォーマンスの低下、セキュリティの問題、またはその両方のために、本番環境でこのようなツールを実行することはありません。 eBPFはこのツールを実用的なものにしました。効率的で安全です。 たとえば、以前のアプローチで行われていたように、すべてのパッケージを追跡するわけではないため、パフォーマンスが過度に低下する可能性があります。 代わりに、はるかに少ない頻度で発生するTCPセッションイベントのみを監視します。 これにより、オーバーヘッドが非常に低くなるため、このツールを24時間365日実行できます。







3.これはどのように使用しますか?



初心者はbccの探索を開始する必要があります。 オペレーティングシステムにbccをインストールする手順を参照してください 。 Ubuntuの場合、次のようになります。







#sudo apt-get update

#sudo apt-get install bpfcc-tools

#sudo / usr / share / bcc / tools / opensnoop
 PID COMM FD ERR PATH
 25548 gnome-shell 33 0 / proc / self / stat
 10190 opensnoop -1 2 /usr/lib/python2.7/encodings/ascii.x86_64-linux-gnu.so
 10190 opensnoop -1 2 /usr/lib/python2.7/encodings/ascii.so
 10190 opensnoop -1 2 /usr/lib/python2.7/encodings/asciimodule.so
 10190 opensnoop 18 0 /usr/lib/python2.7/encodings/ascii.py
 10190 opensnoop 19 0 /usr/lib/python2.7/encodings/ascii.pyc
 25548 gnome-shell 33 0 / proc / self / stat
 29588デバイスポーリング4 0 /開発/バス/ USB
 ^ C


ここで、ツールの機能をテストするために、openingnoopを作成しました。 ここまで来たら、間違いなくeBPFを使用しました!







NetflixやFacebookなどの企業の場合、bccはデフォルトですべてのサーバーにインストールされます。 たぶんあなたも同じことをしたいでしょう。







4.初心者向けガイドはありますか?



はい、私はbccのガイドを書きました。これは、初心者がeBPFでトレースするのに適した開始点です。









初心者として、eBPFのコードを記述する必要はありません。 bccには既に70以上のツールが含まれており、すぐに使用できます。 このガイドでは、execsnoop、opensnoop、ext4slower(またはbtrfs *、xfs *、zfs *)、biolatency、biosnoop、cachestat、tcpconnect、tcpaccept、tcpretrans、runqlat、profileの11の手順を説明します。







それらを試した後は、他にももっと多くの手段があることを知る必要があります。













また、マニュアルページツールとサンプルファイルで完全に文書化されています。 サンプルファイル(* bcc / toolsの_example.txt)には、説明付きのスクリーンショットが含まれています(例: biolatency_example.txt) 。 追加の50のブログ投稿のように見えるそれらの多く(manページとツールの両方)を書きました。それらはbccリポジトリにあります。







欠落しているのは実際の生産例です。 このドキュメントは、eBPFが非常に新しく、テスト環境でしか使用できないため、ほとんどの例が人為的なものであるときに作成しました。 時間が経つにつれて、実際の例を追加します。 これは初心者が手助けできる場所です。問題を解決する場合は、記事を書いてスクリーンショットを共有するか、サンプルファイルとして追加することを検討してください。







経験者向け



この時点で、すでにbccを実行してこれらのツールを試してみてください。また、それらを変更して独自のツールを作成することにも関心があります。 最良の方法は、bpftraceにアップグレードすることです。bpftraceには、習得しやすい高水準言語が含まれています。 欠点は、bccほど柔軟ではないため、制限にぶつかってbccに戻りたい場合があることです。







bpftraceのインストール手順を参照してください。 これは新しいプロジェクトなので、この記事の執筆時点では、すべてのシステム用にパッケージがまだコンパイルされていません。 将来的には、apt-get install bpftraceまたは同等のものになるはずです。







1. bpftraceチュートリアル



一連の単一行でbpftraceを使用する方法を教えるチュートリアルを開発しました。









ステップごとにbpftraceを使用する方法を教える12のレッスンがあります。 以下に例を示します。







#bpftrace -e 'tracepoint:syscalls:sys_enter_open {printf( "%d%s \ n"、pid、str(args-> filename)); } '
 1プローブの取り付け...
 181 / proc / cpuinfo
 181 / proc / stat
 1461 / proc / net / dev
 1461 / proc / net / if_inet6
 ^ C


オープンシステムコールをトレースポイントとして使用して、PIDとオープンファイルパスを追跡します。







2. bpftraceリファレンスガイド



bpftraceの詳細については、構文の例、テスト、および組み込みコマンドを含むガイドを作成しました。









これは簡潔にするためです。タイトル、履歴書、スクリーンショットを1ページに配置しようとしています。 これは長すぎると思います-何かを探していて、ページを数回スクロールする必要がある場合。







3.例のbpftrace



bpftraceリポジトリには、例で見ることができる20以上のツールがあります。









例:







猫ツール/ biolatency.bt
 [...]
開始
 {
     printf( "ブロックデバイスのトレースI / O ... Ctrl-Cを押して終了します。\ n");
 }

 kprobe:blk_account_io_start
 {
     @start [arg0] = nsecs;
 }

 kprobe:blk_account_io_completion
 / @ start [arg0] /

 {
     @usecs = hist((nsecs-@start [arg0])/ 1000);
    削除(@start [arg0]);
 }


bccと同様に、これらのユーティリティにはマニュアルページとサンプルファイルがあります。 たとえば、 biolatency_example.txt







上級者向け



1. bccの開発を研究します



次の2つのガイドを作成しました。









bcc / tools / *。Pyにも多くの例があります。 bccツールは、Cで記述されたカーネルのBPFコードと、Python(またはlua、またはC ++)で記述されたユーザー空間レベルのツールの2つの部分で構成されています。 bccツールの開発は非常に進んでおり、カーネルまたは内部アプリケーション要素の小さなコンポーネントが含まれる場合があります。







2.開発への参加



次のヘルプを歓迎します:









bpftraceについては、 bpftrace内部開発ガイドを作成しました。 llvm IRでプログラミングするのは難しいですが、チャレンジを受け入れる準備ができている場合は...







eBPF(別名BPF)のコアもあります。bccおよびbpftraceの問題を見ると、そこにいくつかの改善要求があります。 たとえば、bpftraceカーネルタグ 。 Linuxメインラインとマージする前にnet-nextに追加される最新のBPFカーネル開発については、 netdevメーリングリストもチェックしてください。







コードの記述に加えて、テスト、パッケージの作成、ブログ、ディスカッションにも参加できます。







おわりに



eBPFはさまざまなことを行います。 この投稿では、トレースとパフォーマンス分析のためにeBPFをマスターすることを検討しました。 要約すると:









また、 eBPFトレースツールに関する別のページもあり、これについて詳しく説明しています。 頑張って!
















All Articles