こんにちは、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でも同じです。 人々はそれを使用し、フレームワークを介してコードを書きます。 トレースの場合、主なものはbccとbpftraceです。 カーネルコードベースではなく、 iovisorというgithubのLinux Foundationプロジェクトに住んでいます。
2. eBPFを使用してサンプルトレースを作成できますか?
このeBPFベースのユーティリティは、プロセスID(PID)、コマンド名(COMM)、送受信バイト(TX_KB、RX_KB)、およびミリ秒単位の持続時間(MS)で完全に確立されたTCPセッションを示します。
#tcplifePID 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 / opensnoopPID 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トレースツールに関する別のページもあり、これについて詳しく説明しています。 頑張って!