Linux ftrace および perf_events (別名「perf」コマンド) 用の開発中およびサポートされていないパフォーマンス分析ツールのさまざまなコレクション。 ftrace と perf は両方ともコア Linux トレース ツールであり、カーネル ソースに含まれています。おそらくシステムにはすでに ftrace があり、perf は単なるパッケージの追加であることがよくあります (「前提条件」を参照)。
これらのツールは、インストールが簡単 (依存関係が最小限)、高度なパフォーマンスの観察可能性を提供し、使いやすいように設計されています。つまり、1 つのことを実行すれば、それをうまく実行できます。このコレクションは、Brendan Gregg (DTraceToolkit の作成者) によって作成されました。
これらのツールの多くは、既存の Linux カーネルで機能を実行できるようにする回避策を採用しています。このため、多くのツールには注意事項があり (マニュアル ページを参照)、それらの実装は、将来のカーネル機能または新しいトレース サブシステムが追加されるまで、プレースホルダーとして考慮する必要があります。
これらは Linux 3.2 以降のカーネルを対象としています。 Linux 2.6.x については、「警告」を参照してください。
これらのツールは、USENIX LISA 2014 のプレゼンテーション「Linux パフォーマンス分析: 新しいツールと古い秘密」で紹介されました。
ftrace の使用:
perf_events の使用:
eBPF の使用:
新しいプロセスと引数を表示します。
# ./execsnoop exec() をトレースします。 Ctrl+C で終了します。 PID PPID ARGS 22898 22004 男 ls 22905 22898 preconv -e UTF-8 22908 22898 ポケベル -s 22907 22898 nroff -mandoc -rLL=164n -rLT=164n -Tutf8 22906 22898 テーブル 22911 22910 ロケール チャームマップ 22912 22907 グロフ -mtty-char -Tutf8 -mandoc -rLL=164n -rLT=164n 22913 22912 troff -mtty-char -mandoc -rLL=164n -rLT=164n -Tutf8 22914 22912 ひどい
キューの挿入から完了までのブロックデバイスの I/O 遅延の測定:
# ./iolatency -Q ブロック I/O をトレースします。 1秒ごとに出力します。 Ctrl+C で終了します。 >=(ミリ秒) .. <(ミリ秒) : I/O |ディストリビューション | 0 -> 1 : 1913 |######################################| 1 -> 2 : 438 |######### | 2 -> 4 : 100 |## | 4 -> 8 : 145 |### | 8 -> 16 : 43 |# | 16 -> 32 : 43 |# | 32 -> 64 : 1 |# | [...]
block:block_rq_insert トレースポイントをカーネル スタック トレースを使用して読み取り専用でトレースします。
# ./tpoint -s block:block_rq_insert 'rwbs ~ "*R*"' cksum-11908 [000] d... 7269839.919098: block_rq_insert: 202,1 R 0 () 736560 + 136 [cksum] cksum-11908 [000] d... 7269839.919107: => __elv_add_request => blk_flush_plug_list => blk_finish_plug => __do_page_cache_readahead => オンデマンド_先読み => page_cache_async_readahead => generic_file_read_iter => new_sync_read => vfs_read => SyS_read => system_call_fastpath [...]
「bio_」で始まるカーネル関数呼び出しをカウントし、1 秒ごとに要約します。
# ./funccount -i 1 'bio_*' 「bio_*」をトレース中... Ctrl-C を押して終了します。 ファンクションカウント bio_attempt_back_merge 26 バイオゲット_nr_vecs 361 バイオアロック 536 bio_alloc_bioset 536 バイオエンディオ 536 バイオフリー 536 バイオ_fs_デストラクター 536 バイオ初期化 536 バイオインテグリティ有効化536 バイオプット 729 バイオ追加ページ 1004 [...]
サンプル ディレクトリにはさらに多くのサンプルがあります。マニュアルページも参照してください。
意図はできるだけ少ないです。たとえば、debuginfo のない Linux 3.2 サーバーなどです。詳細については、ツールのマニュアル ページを参照してください。
FTRACE はカーネル内で構成されます。 FTRACE は 2.6.27 で最初に追加されたため、カーネル バージョンですでにこれが設定され、利用可能になっている可能性があります。これには、ツールに応じて CONFIG_FTRACE およびその他の FTRACE オプションが必要です。一部のツール (funccount など) には CONFIG_FUNCTION_PROFILER が必要です。
「perf」コマンドをインストールする必要があります。これは linux-tools-common パッケージに含まれています。それをインストールした後、perf は追加の linux-tools パッケージ (linux-tools -kernel_version ) をインストールするように指示する場合があります。 perf は、カーネル ソースの tools/perf の下にビルドすることもできます。 perf_events を完全に動作させる方法の詳細については、「perf_events の前提条件」を参照してください。
CONFIG_DEBUG_FS オプションが有効になっているカーネルが必要です。 FTRACE と同様、これはすでに有効になっている場合があります (debugfs は 2.6.10-rc3 で追加されました)。 debugfs もマウントする必要があります。
# mount -t debugfs none /sys/kernel/debug
スクリプトの多くは awk を使用しており、目的の動作に応じて mawk または gawk のいずれかを使用しようとします。バッファリングされた出力には mawk (その速度のため)、同期出力には gawk (fflush() が機能するため、より効率的にグループ化できるため) が使用されます。と書いています)。
これらは単なるスクリプトです。すべてを取得するか、次のようにします。
git clone --depth 1 https://github.com/brendangregg/perf-tools
または、github の生のリンクを使用して、個々のスクリプトをダウンロードします。例えば:
wget https://raw.githubusercontent.com/brendangregg/perf-tools/master/iosnoop
これによりタブが保持されます (コピーアンドペーストすると混乱する可能性があります)。
Ftrace は Linux 2.6.27 に最初に追加され、perf_events は Linux 2.6.31 に追加されました。これらの初期のバージョンにはカーネルのバグがあり、2.6.32 シリーズのカーネルではロックアップとパニックが報告されています。これには CentOS 6.x が含まれます。古いカーネルを分析する必要がある場合、これらのツールは、問題がシミュレートされているラボなどのフォールト トレラント環境でのみ役立ちます。これらのツールは主に Linux 3.2 以降のカーネルで開発されました。
ツールによっては、オーバーヘッドが発生する場合もあります。次のセクションを参照してください。
perf_events は進化しています。このコレクションは、perf_events に特定のプログラム機能 (カスタムのカーネル内集計など) が欠けていた当時、Linux 3.2 サーバーを主なターゲットとして、Linux 3.16 頃に開発を開始しました。これらは今後のカーネル リリースで追加される可能性があります。それまでは、これらのツールの多くは、機能するために回避策、トリック、ハックを採用しています。これらのツールの一部は、後処理のためにイベント データをユーザー空間に渡しますが、これにはカーネル内の集計よりもはるかに高いオーバーヘッドがかかります。各ツールのオーバーヘッドについては、そのマニュアル ページで説明されています。
警告:極端な場合、これらのツールを使用すると、ターゲット アプリケーションの実行が 5 倍遅くなる可能性があります。ツールとカーネルのバージョンによっては、カーネル パニックが発生する危険性もあります。プログラムヘッダーの警告を読み、使用前にテストしてください。
オーバーヘッドが問題になる場合は、これらのツールを改善することができます。ツールがまだ使用していない場合は、トレース バッファーに perf_events_open() および mmap() を使用するように C で書き直すことができます。また、頻度カウントを C で実装し、awk/Perl/Python を使用せずに mmap() を直接操作することもできます。 ftrace ベースのツールでは、スナップショットやインスタンスごとのバッファーの使用など、追加の改善が可能です。
これらのツールの一部は、より多くのカーネル機能が存在し、その時点で大幅に書き換えられるようになるまでの短期的な回避策として意図されています。古いカーネル バージョンの場合、これらのツールの古いバージョンはこのリポジトリに保存されます。
私の主なターゲットは debuginfo を持たない Linux 3.2 サーバー群であるため、これらのツールは debuginfo を必要としないようにします。 debuginfo 情報 (一般的なものである可能性があります) を使用する代わりに回避策 (カーネル バージョンとプラットフォーム固有の可能性があります) を採用しているため、これによりツールが必要以上に脆弱になることがあります。各ツールの詳細な前提条件については、マニュアル ページを参照してください。
perf_events (「perf」) インターフェイスはマルチユーザー向けに開発されているため、可能な場合は perf_events (「perf」) を使用するようにしました。さまざまな理由から、代わりに ftrace を使用する必要があることがよくあります。 ftrace は驚くほど強力であり (Steven Rostedt に感謝!)、そのすべての機能が perf や一般的な使用方法で公開されているわけではありません。このツール コレクションは、ある意味、ftrace を使用した Linux の隠れた機能のデモンストレーションです。
状況は変化しているため、お使いの Linux カーネル バージョンでは一部のツールが動作しない可能性があります。それらを修正するには、ある程度の専門知識と組み立てが必要です。
ケーススタディと概要:
関連記事: