perfのまとめ(1) Linuxの基礎知識(09)
著者: Onceday 日付: 2023 年 1 月 31 日
長い道のりはまだ始まったばかりです…
参照文書:
1。概要
この図は、Brendan Gregg 氏が提供する Linux 分析ツールの適用シナリオからのもので、システムのあらゆる部分を分析するためにどのようなツールを使用する必要があるかがほぼ含まれていることがわかります。
ここでは、perf をツールとしてのみ考慮し、このツールを使用して Linux システム上のプログラムのパフォーマンス消費を理解することに焦点を当てます。
1.1 パフォーマンスのバックグラウンド履歴
Perf
正式名は Performance Event で、主に Linux オペレーティング システムでのソフトウェア パフォーマンスの測定と分析に使用される強力なパフォーマンス分析ツールです。perf
これは、Linux カーネルのパフォーマンス監視機能に基づいて実装されており、開発者がプログラムのパフォーマンスのボトルネックを発見し、コードを最適化し、システム全体のパフォーマンスを向上させるのに役立ちます。
perf
このツールの誕生は 2008 年に遡ります。このとき、Linux カーネル コミュニティは、カーネル パフォーマンス分析のエクスペリエンスを向上させるために、カーネル ベースのパフォーマンス監視サブシステムであるパフォーマンス監視ユニット (PMU) の開発を開始しました。時間の経過とともに、perf
カーネル コミュニティの継続的な貢献と改善により、このツールはますます完璧になり、徐々に Linux プラットフォームで必要なパフォーマンス分析ツールになってきました。
perf
ツールには次のような幅広い機能がありますが、これらに限定されません。
-
CPU パフォーマンス監視:
perf
キャッシュ ヒット率、分岐予測エラーなどのさまざまな CPU パフォーマンス イベントを収集してレポートできるため、開発者はプログラムの動作効率を把握できます。 -
メモリ パフォーマンスの監視:
perf
メモリの割り当てや解放など、プログラムのメモリ アクセス パターンを分析して、開発者がメモリ使用量を最適化できるようにします。 -
システム コールの追跡:
perf
プログラムのシステム コールを追跡して、開発者が潜在的なパフォーマンスの問題を発見できるようにします。 -
ホット関数分析: プログラム実行中に関数呼び出しをサンプリングすることにより、
perf
プログラム内で実行時間が最も長い関数を見つけることができ、開発者に最適化の方向性を提供します。 -
ハードウェア イベント統計:
perf
CPU キャッシュ、分岐予測などのハードウェア イベントをカウントして、プログラムのハードウェア使用効率を評価することもできます。
perf
このツールは 2008 年に誕生して以来、多くの重要なアップデートが行われてきました。
-
カーネル 2.6.31:
perf
基本的なパフォーマンス監視機能をサポートする初期バージョンがリリースされました。 -
カーネル 2.6.35: このコマンドは、
perf trace
システム コール トレースをサポートするために導入されました。 -
カーネル 3.0: 動的追跡テクノロジーをサポートし、
perf
システムの柔軟性を向上させます。 -
カーネル 4.1: このコマンドは、
perf c2c
キャッシュラインレベルの分析をサポートするために導入されました。
Linux カーネルの継続的なアップグレードに伴い、perf
ツールは継続的に機能を拡張および改善し、より多くのパフォーマンス分析のニーズに応えています。
Linux オペレーティング システム用に設計されていますがperf
、FreeBSD、macOS などの他の Unix 系システムでも実行できます。ただし、これらのプラットフォームのカーネル実装とハードウェア アーキテクチャの違いにより、perf
機能とパフォーマンスはプラットフォームによって異なる場合があります。したがって、perf
パフォーマンス分析に使用する場合は、ターゲット プラットフォームの特性と制限を考慮する必要があります。
1.2 PMU (パフォーマンス監視ユニット)
PMU (パフォーマンス監視ユニット、パフォーマンス監視ユニット) は、最新の CPU の重要な部分であり、プロセッサのパフォーマンスに関連するハードウェア イベントを監視および収集するために使用されます。PMU は、開発者が特定のプロセッサ上でプログラムがどのように実行されるかを理解し、目的を絞った最適化を実行できるようにするのに役立ちます。
PMU は通常、複数のハードウェア パフォーマンス カウンター (ハードウェア パフォーマンス カウンター、HPC) で構成されます。これらのカウンターは、次のような特定のハードウェア イベントが発生した回数をカウントするために使用されます。
- CPU サイクル (サイクル)
- 手順
- キャッシュ ヒット/ミス (キャッシュ ヒット/ミス)
- 分岐予測の正解/不正解
PMU を使用してプロファイリングを行う場合、監視するイベントを選択する必要があります。次に、PMU は、イベントが発生した回数を対応するパフォーマンス カウンターに記録します。このデータを収集して分析することで、プログラムのボトルネックを特定できます。
Linux システムでは、Perf ツールは PMU にアクセスし、PMU が提供するパフォーマンス データを利用できます。Perf は、PMU データを構成および分析するためのさまざまなコマンドとオプションを提供します。これまでの Perf チュートリアルでは、パフォーマンス分析に Perf を使用する方法について説明しました。
異なるプロセッサの PMU は異なる場合があり、サポートされるイベントのタイプやパフォーマンス カウンタの数も異なる場合があることに注意してください。ただし、Perf ツールは一般的なプロセッサのほとんどを抽象化しているため、さまざまなプロセッサのパフォーマンス分析に統一インターフェイスを使用できます。
1.3 パフォーマンスの原理
perf は強力です。CPU パフォーマンス カウンター、トレースポイント、kprobes、および uprobes (動的トレース) を測定します。軽量なプロファイリングが可能です。これは Linux カーネルの tools/perf の下にも含まれており、頻繁に更新および拡張されます。
perf は、Linux のパフォーマンス カウンター サブシステムを操作するためのツールとして始まり、トレース機能を追加するためにさまざまに拡張されました。パフォーマンス カウンターは、実行された命令、キャッシュ ミス、分岐予測ミスなどのハードウェア イベントをカウントする CPU ハードウェア レジスタです。これらは、アプリケーションを分析して動的な制御フローを追跡し、ホット スポットを特定するための基礎を形成します。Perf は、ハードウェア固有の機能に豊富な汎用抽象化を提供します。とりわけ、タスクごと、CPU ごと、ワークロードごとのカウンターと、これらのカウンターとソース コード イベント アノテーションに基づくサンプルが提供されます。
**トレースポイント(トレースポイント)** は、システム コール、TCP/IP イベント、ファイル システム操作など、コード内の論理的な位置に配置されるインスツルメンテーション ポイントです。使用しないときはオーバーヘッドが無視できるため、perf コマンドを使用して有効にして、タイムスタンプやスタック トレースなどの情報を収集できます。Perf は、kprobes および uprobes フレームワークを使用して、カーネルおよびユーザー空間での動的トレース用のトレースポイントを動的に作成することもできます。彼らの可能性は無限大です。
-
kprobes
(カーネル プローブ) は、カーネル コードの実行をトレースするために使用される動的トレース手法です。これをカーネルに挿入することでkprobes
、開発者はカーネル関数の呼び出しと戻りを監視し、パラメータ値や戻り値などの主要なイベントに関する情報を収集できます。kprobes
動作原理は、カーネルのブレークポイント メカニズムに基づいています。挿入時にkprobes
、カーネルはターゲット アドレスにブレークポイント命令を挿入します。プログラムがこの命令を実行すると、カーネルは例外をトリガーし、 のkprobes
処理関数に制御を移します。処理関数は、現在の CPU レジスタとメモリにアクセスし、イベント情報を取得できます。処理関数の実行後、プログラムはターゲットアドレスから実行を続けます。kprobes
の利点は、カーネルを変更したり再コンパイルしたりせずに、実行時にカーネル コードを動的にトレースできることです。また、kprobes
重大なイベントが発生した場合にのみトリガーされるため、システムのパフォーマンスへの影響は少なくなります。 -
uprobes
(ユーザー プローブ) は、ユーザー空間コードの実行をトレースするために使用される動的トレース手法です。と同様kprobes
に、uprobes
実行時にプローブを挿入して、ユーザー プログラムからの関数呼び出しと戻りを監視することもできます。uprobes
kprobes
はブレークポイント メカニズムと同様に機能し、ブレークポイント メカニズムにも基づいています。違いは、uprobes
挿入されたブレークポイントがユーザー空間コード内に配置されるため、カーネルとユーザー空間の共同処理が必要になることです。ユーザー プログラムがブレークポイントに到達すると、カーネルは例外をトリガーし、uprobes
の処理関数に制御を移します。処理関数は、現在の CPU レジスタとメモリにアクセスし、イベント情報を取得できます。処理関数の実行後、プログラムはターゲットアドレスから実行を続けます。uprobes
利点は、プログラムを変更したり再コンパイルしたりすることなく、実行時にユーザー空間のコードを動的にトレースできることです。同様にkprobes
、uprobes
システムパフォーマンスへの影響もわずかです。
Perf には 2 つの動作モードがあります。
- カウンティング モード (Couting Mode)、カウンティング モードは、一定期間内の CPU 関連のハードウェア カウンタ値の変化を正確にカウントします。ユーザーが関心のあるイベントをカウントするために、Perf Tool はパフォーマンス制御に関連するレジスタを設定します。これらのレジスタの値は監視期間終了後に読み出されます。
- サンプリングモード(Sampling Mode)サンプリングモードは定期的なサンプリングにより演奏データを取得します。PMU カウンタは、いくつかの特定のイベントのオーバーフロー期間を構成します。カウンタがオーバーフローすると、IP、汎用レジスタ、EFLAG などの関連データがキャプチャされます。
1.4 パフォーマンス パフォーマンス イベント
Perf イベントは、次のカテゴリに大別されます。
- ハードウェア イベント: これらのイベントは、プロセッサ ハードウェア自体によって生成されます。例えば:
- 命令: 実行された命令の数
- サイクル: プロセッサーのサイクル数
- キャッシュ参照: キャッシュ参照
- キャッシュミス: キャッシュミスの数
- 分岐命令: 分岐命令の数
- 分岐ミス: 予測を誤った分岐命令の数
- ハードウェア キャッシュ イベント: これらのイベントは、次のようなプロセッサのキャッシュに関連します。
L1-dcache-loads
: L1 データ キャッシュのロード時間L1-dcache-load-misses
: L1データキャッシュのロードミス数L1-dcache-stores
: L1 データ キャッシュの保存時間L1-dcache-store-misses
: L1 データ キャッシュ ストア ミス数L1-dcache-prefetches
: L1 データ キャッシュのプリフェッチ時間L1-dcache-prefetch-misses
: L1データキャッシュのプリフェッチミス数
- ソフトウェア イベント (ソフトウェア イベント) : これらのイベントは、次のようなオペレーティング システムによって生成されます。
context-switches
: コンテキストスイッチの数cpu-migrations
: CPU移行数page-faults
: ページフォールトの数minor-faults
: マイナーページフォールトの数major-faults
: メジャー ページ フォールトの数
- トレースポイント イベント (トレースポイント イベント) : これらのイベントはカーネル内のトレースポイントによって生成され、
perf list
トレースポイント イベントの完全なリストはコマンドを通じて取得できます。トレースポイント イベントを使用して、スケジューラの動作、メモリ管理などのカーネル サブシステムのパフォーマンスを監視できます。 - 調査イベント (プローブ イベント) : カーネルに動的に挿入されるユーザー定義のイベント。
1.5 Perf パフォーマンス イベントのプロパティ
次の原文については、perf 学習の概要を参照してください- Zhihu (zhihu.com) 。
ハードウェア パフォーマンス イベントは、プロセッサ内の PMU によってサポートされます。最新のプロセッサのメイン周波数は非常に高く、深いパイプライン メカニズムと相まって、パフォーマンス イベントがトリガーされてからプロセッサが PMI 割り込みに応答するまで、数百の命令がパイプライン上で処理される可能性があります。この場合、PMI 割り込みによってキャプチャされた命令のアドレスは、パフォーマンス イベントをトリガーした命令のアドレスではなくなり、非常に重大な逸脱が発生する可能性があります。この問題を解決するために、Intel プロセッサは PEBS メカニズムを通じて高精度のイベント サンプリングを実装しています。PEBS は、カウンタがハードウェアを介してオーバーフローしたときに (割り込みに応答するときにレジスタ シーンを保存するのではなく) プロセッサ シーンをメモリに直接保存するため、perf は実際にパフォーマンス イベントをトリガーする命令のアドレスを収集でき、サンプリング精度が向上します。 。デフォルトでは、perf は PEBS メカニズムを使用しません。
高精度サンプリングを使用したい場合は、演奏イベントを指定する際にイベント名の後ろに「:p」または「:pp」を付ける必要があります。Perf は、以下の表に示すように、サンプリング精度の 4 つのレベルを定義します。
- 0: 精度保証なし
- 1: サンプリングされた命令とパフォーマンス イベントをトリガーした命令の間の偏差は一定です (:p)
- 2: サンプリング命令とパフォーマンスイベントをトリガーする命令との偏差が 0 になるように努める必要があります (:pp)
- 3: サンプリング命令とパフォーマンス イベントをトリガーした命令との偏差が 0 であることを保証します (:ppp)
パフォーマンス イベントの精度レベル Intel プロセッサや AMD プロセッサを含む現在の X86 プロセッサは、最初の 3 つの精度レベルのみを達成できます。
パフォーマンス イベントには、精度レベルに加えて、「event:X」で指定できる他の属性もいくつかあります。
- u: ユーザー空間プログラムによってトリガーされたパフォーマンス イベントのみをカウントします。
- k: カーネルによってトリガーされたパフォーマンス イベントのみをカウントします。
- h: ハイパーバイザーによってトリガーされたパフォーマンス イベントのみをカウントします。
- G: KVM 仮想マシンでは、ゲスト システムによってトリガーされたパフォーマンス イベントのみがカウントされます。
- H: ホスト システムによってトリガーされたパフォーマンス イベントのみをカウントします。
- p: 精度レベル
2. Perf 実際のコマンド
2.1 perf コマンド
このコマンドでサポートされるパラメータは次のとおりです。
# perf命令的一般形式
perf [--version] [--help] [OPTIONS] COMMAND [ARGS]
# 目前支持的选项参数:
--help, Run perf help command. 运行perf help命令.
--version, 显示perf的版本信息
-vv, 打印库的编译状态。
--exec-path, Display or set exec path. 显示或者设置执行路径
--html-path, Display html documentation path. 显示html文档的路径
--paginate, Set up pager.
--no-pager, Do not set pager.
--debugfs-dir, Set debugfs directory or set environment variable PERF_DEBUGFS_DIR.
--buildid-dir, Setup buildid cache directory. It has higher priority than buildid.dir config file option.
--list-cmds, List the most commonly used perf commands.
--list-opts, List available perf options.
--debug, Setup debug variable (see list below) in value range (0, 10).
デバッグ モードの場合は、次の方法で設定できます。
--debug verbose # 表示设置verbose = 1
--debug verbose=2 # 表示设置verbose = 2
# 如verbose这样被允许设置的变量如下:
verbose - general debug messages
ordered-events - ordered events object debug messages
data-convert - data convert command debug messages
stderr - write debug output (option -v) to stderr in browser mode
perf-event-open - Print perf_event_open() arguments and return value
Perf Tool は、複数のサブツール セットを含むユーザー モード ツール セットであり、各ツールの基本機能を次の表に具体的に紹介します。
名前 | 機能説明 |
---|---|
注釈を付ける | perf.data を読み取り、特定の関数の詳細な分析を実行し、ソース コードまたはアセンブリ レベルの情報を表示します。 |
アーカイブ | プロファイリングに必要なバイナリ、デバッグ情報、ビルド ID を含むアーカイブを作成します。このアーカイブは、他のシステム、特に元のバイナリとデバッグ情報を持たないシステムでコマンドを使用して分析できますperf report 。 |
ベンチ | 組み込みのマイクロベンチマーク (マイクロベンチマーク) を実行して、さまざまなシステムおよびカーネル構成でのパフォーマンスを評価および比較するために使用されます。スケジューラ/メモリ サブシステム/ロック操作/NUMA アクセス パフォーマンスなどを含む、事前定義された一連のベンチマークを提供します。 |
ビルドIDキャッシュ | perf ツールでビルド ID キャッシュを管理するために使用されます。ビルド ID は、実行可能ファイル、共有ライブラリ、またはカーネル モジュールを対応するデバッグ情報と関連付けるために使用される一意の識別子です。perf buildid-cache ビルド ID キャッシュ内の項目は追加、削除、または一覧表示できます。 |
ビルドIDリスト | ファイルに関連付けられたビルド IDをリストするために使用されますperf.data 。ビルド ID は、実行可能ファイル、共有ライブラリ、またはカーネル モジュールを対応するデバッグ情報と関連付けるために使用される一意の識別子です。これらのビルド ID は、を使用してパフォーマンス データを収集するときにファイルperf record に保存されますperf.data 。 |
c2c | (cache-to-cache) コマンドは、メモリ アクセスとキャッシュ ラインのヒット/ミスのパフォーマンスを分析するためのツールです。マルチコア システムにおけるキャッシュ ラインの競合とフォールス シェアリングの問題の分析に重点を置いています。フォールス シェアリングとは、複数のコアが同じキャッシュ ライン上の異なるデータにアクセスすることを意味し、キャッシュ ラインがコア間で頻繁に移動するため、全体的なパフォーマンスが低下します。 |
構成 | perf ツールの構成オプションを照会および変更するために使用されます。これらの構成オプションはperf 、デフォルトのイベント タイプ、表示スタイル、配色など、ツールのさまざまな動作を制御します。perf の構成情報は、 という名前のファイルに保存されますperfconfig 。通常はユーザーのホーム ディレクトリ ( ~/.perfconfig ) またはシステム全体の構成ファイル ( /etc/perfconfig ) に保存されます。 |
デーモン | 録音セッションをバックグラウンドで実行し、サンプリング プログラムをバックグラウンドで実行します。 |
データ | perf ツール (通常は ) によって生成されたパフォーマンス データ ファイルの処理と管理に使用されますperf.data 。これらのファイルには、perf record コマンドによって収集されたパフォーマンス イベントのサンプルが含まれており、さらなるパフォーマンス分析とレポートに使用できます。 |
差分 | 2 つ以上のperf.data ファイルを比較してパフォーマンスの変化を見つけるために使用されます。これは、コードを最適化するときやシステム構成を調整するときに、パフォーマンスの変化の原因を迅速に特定するのに役立ちます。perf diff これは、イベント カウンターとその他のパフォーマンス メトリックの差を計算することで実現されます。 |
結婚 | 設定されたパフォーマンス イベントのリストを表示するために使用されます。これらのイベントは、コマンドを使用してパフォーマンス データを収集するときにperf record 記録されます。イベントは、ハードウェア カウンター イベント (CPU サイクル、キャッシュ ヒット/ミスなど) またはソフトウェア イベント (コンテキスト スイッチ、ページ フォールトなど) です。 |
ftrace | カーネルの ftrace 機能の単純なラッパー、カーネルの ftrace 機能の単純なラッパー。 |
注入する | 既存のファイルperf.data にパフォーマンス イベント レコードを挿入または変更するために使用されます。これにより、パフォーマンス データを再収集することなく、既存のパフォーマンス データ ファイルを変更してさらに分析することができます。perf inject 新しいイベントの追加、既存のイベントの変更、または不要なイベントの削除に使用できます。 |
イオスタット | システムの I/O (入出力) パフォーマンスを監視するために使用されます。システムのディスク I/O 操作をリアルタイムで表示し、考えられる I/O ボトルネックを特定するのに役立ちます。は、 によって収集されたデータに基づいて従来のコマンドと同様のレポートを生成するツールによって提供される追加コマンドperf iostat です。perf perf iostat |
冷たい水泳 | カーネル シンボル テーブル情報を表示するために使用されます。カーネル シンボル テーブルには、カーネル関数、変数、その他のカーネル オブジェクトの名前と、メモリ内のそれらのアドレスが含まれています。カーネル シンボル テーブルを見ると、カーネルの構造と実行時の動作をよりよく理解できます。 |
kmem | カーネル メモリ アロケータの動作を分析するために使用されます。カーネル メモリ アロケータは、カーネル空間のメモリ リソースを管理します。perf kmem これは、パフォーマンスのボトルネックやカーネル メモリ アロケータのメモリ リークなどの問題を特定するのに役立ち、それによってシステムのパフォーマンスと安定性が向上します。 |
kvm | KVM (カーネルベースの仮想マシン) 仮想化環境のパフォーマンスを分析およびレポートするために使用されます。KVM は、Linux 上のオープンソース仮想化テクノロジであり、同じ物理ホスト上で複数の仮想マシン (ゲストとも呼ばれます) を実行できるようにします。perf kvm これは、仮想環境のパフォーマンスのボトルネックを特定するのに役立ち、それによって仮想マシンのパフォーマンスとリソース使用率が向上します。 |
リスト | perf record および他のサブコマンドによるプロファイリングに使用できる、利用可能なパフォーマンス イベントをリストするために使用されますperf 。パフォーマンス イベントには、ハードウェア イベント (CPU サイクル、キャッシュ ミスなど)、ソフトウェア イベント (コンテキスト スイッチ、ページ フォールトなど)、およびトレースポイント イベント (カーネル関数呼び出し、ユーザー空間アプリケーションのトレース、等。) |
ロック | ロック競合およびロック関連のパフォーマンス問題を分析するために使用されます。マルチスレッド プログラミングでは、ロックは、複数のスレッドが共有リソースにアクセスするときに一貫性を維持できるようにするために使用される同期プリミティブです。ただし、ロックを使用すると、競合やパフォーマンスのボトルネックが発生する可能性があります。 |
私 | メモリ アクセスのレイテンシ、帯域幅、キャッシュ ラインのヒット率など、メモリ アクセスのパフォーマンスを分析するために使用されます。メモリ アクセスのパフォーマンスは、アプリケーションとシステム全体のパフォーマンスにとって重要です。 |
記録 | パフォーマンス イベントを記録する場合、ユーザー指定のイベント タイプ、サンプリング周波数、ターゲット アプリケーション/プロセスに基づいてパフォーマンス データを収集します。 |
報告 | perf record コマンドで収集したパフォーマンスデータを分析および表示するために使用されます。ファイルperf report からデータを読み取り (デフォルト)、さまざまな統計とメトリックを含むパフォーマンス レポートを生成します。perf.data |
予定された | Linux スケジューラのパフォーマンスの分析とデバッグに使用されます。スケジューラはプロセスとスレッドの実行を管理し、CPU 使用率とシステム応答時間を最適化します。 |
脚本 | perf record コマンドによって収集されたパフォーマンス イベント データを処理および表示するために使用されます。とは異なりperf report 、perf script はパフォーマンス データを生の形式で表示する方法を提供します。これは、カスタム分析、タイムラインの生成、および他のツールとの統合に特に役立ちます。 |
ステータス | 指定したプログラムまたはシステムのパフォーマンス統計を収集して表示するために使用されます。さまざまなハードウェア パフォーマンス イベント (CPU サイクル、キャッシュ ヒット/ミスなど) だけでなく、ソフトウェア パフォーマンス イベント (コンテキスト スイッチ、プロセス移行など) も監視できます。 |
テスト | ツールの機能と正確性をチェックするために使用されますperf 。一連の組み込み自己テストを実行して、perf 現在のシステムで正しく動作することを確認します。 |
タイムチャート | システムレベルのパフォーマンスデータを視覚化するために使用されます。perf 記録されたパフォーマンス イベント データから、時間の経過に伴うシステム アクティビティとリソース使用率を示す対話型の時間グラフを生成します。 |
上 | これは、システム内で最も CPU 時間を占有する関数をリアルタイムで表示し、プログラム実行時の CPU 使用率を監視し、システム内のどの関数またはコード フラグメントがパフォーマンスに最も大きな影響を与えているかを理解するために使用されます。 |
バージョン | perf 実行可能ファイルのバージョン情報を表示する |
調査 | プローブ ポイントを動的に追加して、特定の関数またはコードの場所でパフォーマンス データを収集するために使用されます。 |
痕跡 | システム コール、シグナル、およびその他のカーネル イベントを追跡および記録するために使用されます。プログラムとオペレーティング システム間の相互作用を分析し、カーネル イベントがプログラムのパフォーマンスに与える影響を理解し、システム コールのエラーと例外を診断して、問題の特定を支援します。 |
2.2 パフォーマンス リスト サポートされているパフォーマンス イベントを表示する
perf ツールは、一連の測定可能なイベントをサポートします。このツールと基礎となるカーネル インターフェイスは、さまざまなソースからのイベントを測定できます。たとえば、一部のイベントは純粋なカーネル カウンターであり、その場合はソフトウェア イベントと呼ばれます。例: コンテキストの切り替え、グリッチ。
もう 1 つのイベント ソースは、プロセッサ自体とそのパフォーマンス監視ユニット (PMU) です。サイクル カウント、命令リタイアメント、L1 キャッシュ ミスなどのマイクロアーキテクチャ イベントを測定するためのイベント リストを提供します。これらのイベントは、PMU ハードウェア イベント、または単にハードウェア イベントと呼ばれます。これらはプロセッサの種類とモデルによって異なります。
perf_events接口还提供了一组常用的硬件事件名称。在每个处理器上,如果这些事件存在,则将它们映射到CPU提供的实际事件上,否则无法使用事件。有些令人困惑的是,这些事件也称为硬件事件(hardware event)和硬件缓存事件(hardware cache event)。
最后,还有由内核ftrace基础设施实现的tracepoint事件。这些仅在2.6.3 3x和更新的内核中可用。
命令帮助信息如下:
onceday->~:# perf list -h
Usage: perf list [<options>] [hw|sw|cache|tracepoint|pmu|sdt|metric|metricgroup|event_glob]
-d, --desc Print extra event descriptions. --no-desc to not print.
-v, --long-desc Print longer event descriptions.
--debug Enable debugging output
--deprecated Print deprecated events.
--details Print information on the perf event names and expressions used internally by events.
下面是一个实际输出,该命令显示可在使用-e选项的各种perf命令中选择的符号事件类型:
onceday->~:# perf list
List of pre-defined events (to be used in -e):
branch-misses [Hardware event]
bus-cycles [Hardware event]
cache-misses [Hardware event]
cache-references [Hardware event]
cpu-cycles OR cycles [Hardware event]
instructions [Hardware event]
alignment-faults [Software event]
bpf-output [Software event]
context-switches OR cs [Software event]
cpu-clock [Software event]
cpu-migrations OR migrations [Software event]
dummy [Software event]
emulation-faults [Software event]
major-faults [Software event]
minor-faults [Software event]
page-faults OR faults [Software event]
task-clock [Software event]
L1-dcache-load-misses [Hardware cache event]
L1-dcache-loads [Hardware cache event]
L1-dcache-store-misses [Hardware cache event]
L1-dcache-stores [Hardware cache event]
L1-icache-load-misses [Hardware cache event]
L1-icache-loads [Hardware cache event]
branch-load-misses [Hardware cache event]
branch-loads [Hardware cache event]
dTLB-load-misses [Hardware cache event]
dTLB-store-misses [Hardware cache event]
iTLB-load-misses [Hardware cache event]
node-loads [Hardware cache event]
node-stores [Hardware cache event]
armv8_cortex_a72/br_mis_pred/ [Kernel PMU event]
armv8_cortex_a72/br_pred/ [Kernel PMU event]
...(省略大量其他输出内容)...
PMU硬件事件是特定于CPU的,并由CPU供应商记录。如果链接到libpfm4, perf工具库会提供一些事件的简短描述。有关Intel和AMD处理器的PMU硬件事件列表,请参见:
- Intel® 64 and IA-32 Architectures Developer’s Manual: Vol. 3B
- BIOS and Kernel Developer’s Guide (BKDG) For AMD Family 10h Processors
perf list列出来的这些事件就是本机设备上受支持性能事件,后面中括号里面就是具体的事件类型,这些事件可能会非常多,不同的账户权限执行的结果也会有些不同。
对于非root用户,通常只有上下文切换的PMU事件可用。这通常只是cpu PMU中的事件、预定义的事件(如周期和指令)以及一些软件事件。其他pmu和全局测量通常仅为root
可用。一些事件限定符,如“any”,也是root
限定符。这可以通过设置kernel.perf_event_paranoid
为-1
来修改(使用sysctl),允许非root用户使用这些事件。为了访问跟踪点事件,perf
需要对/sys/kernel/debug/tracing具有读访问权限,即使perf_event_paranoid
处于宽松设置中也是如此。
2.3 perf 性能事件修饰符
对于任何受支持的事件,perf可以在流程执行期间保持运行计数。在计数模式中,事件的发生只是聚合在一起,并在应用程序运行结束时显示在标准输出上。要生成这些统计信息,可以使用perf的stat命令。例如:
onceday->~:# perf stat -B dd if=/dev/zero of=/dev/null count=1000000
1000000+0 records in
1000000+0 records out
512000000 bytes (512 MB, 488 MiB) copied, 4.01987 s, 127 MB/s
Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':
2239.106840 task-clock (msec) # 0.556 CPUs utilized
10041 context-switches # 0.004 M/sec
0 cpu-migrations # 0.000 K/sec
145 page-faults # 0.065 K/sec
2665504250 cycles # 1.190 GHz
2338072047 instructions # 0.88 insn per cycle
<not supported> branches
6692430 branch-misses
4.027916520 seconds time elapsed
在没有指定事件的情况下,perf stat收集上面列出的常见事件。有些是软件事件,如上下文切换,有些是一般的硬件事件,如循环。
可以在每次运行perftool时测量一个或多个事件。事件是用它们的符号名和可选的单位掩码和修饰符来指定的。事件名称(Event names)、单元掩码(unit masks)和修饰符(modifiers)不区分大小写。
默认情况下,事件是在用户和内核级别度量的:
perf stat -e cycles dd if=/dev/zero of=/dev/null count=100000
若要仅在用户级别进行度量,则需要传递一个修饰符(u):
perf stat -e cycles:u dd if=/dev/zero of=/dev/null count=100000
要测量用户和内核(显式地):
perf stat -e cycles:uk dd if=/dev/zero of=/dev/null count=100000
事件可以通过附加冒号和一个或多个修饰符来选择具有修饰符。修饰符允许用户限制何时对事件进行计数。修饰符如下:
名称标识 | 描述 |
---|---|
u | user-space counting,用户空间 |
k | kernel counting,内核空间 |
h | hypervisor counting,虚拟机 |
I | non idle counting,非空闲时 |
G | guest counting (in KVM guests),KVM虚拟机 |
H | host counting (not in KVM guests),KVM主机 |
p | precise level,硬件事件精度级别 |
P | use maximum detected precise level,使用最大检测精度水平 |
S | read sample value (PERF_SAMPLE_READ)读取样本值 |
D | pin the event to the PMU,将事件绑定到PMU上 |
W | 组是弱的,如果不可调度,将退回到非组 |
e | 群组或事件是排他性的,不共享PMU |
p修饰符可用于指定指令地址的精确程度。p修饰符可以被指定多次:
- 0 - SAMPLE_IP可以任意滑动
- 1 - SAMPLE_IP必须有恒定的滑动
- 2 - SAMPLE_IP要求有O滑块
- 3 - SAMPLE_IP必须有0滑块,或者使用随机化来避免样本副作用效果。
对于英特尔系统,精确事件采样是用PEBS实现的,它支持精确级别2,在某些特殊情况下支持精确级别3。
在AMD系统上,它是使用IBS实现的(最高精确级别到2)。精确修饰符与事件类型0x76 (cpu-cycles,CPU时钟未停止)和0xC1(micro-ops retired)一起工作。
2.4 测量特定硬件上的PMU事件
即使现在在perf中没有符号形式的事件,也可以用特定于每个处理器的方式对其进行编码。
比如对于X86CPUs,要测量CPU硬件供应商文档中提供的实际PMU,可以传递十六进制参数代码:
perf stat -e r1a8 -a sleep 1
perf record -e r1a8 ...
有些处理器,比如AMD的处理器,支持大于一个字节的事件代码和单元掩码。在这种情况下,与事件配置参数对应的位可以参考下面命令的结果:
cat /sys/bus/event_source/devices/cpu/format/event
比如可能的命令如下:
perf record -e r20000038f -a sleep 1
perf record -e cpu/r20000038f/ ...
perf record -e cpu/r0x20000038f/ ...
有关于特定硬件上的PMU事件,需要参考处理器的说明文档来确定使用方法。
在下面的路径可以查看可用的PMUs和它们的原始参数:
ls /sys/devices/*/format
一些pmu不与核心相关联,而是与整个CPU socket
相关联。这些pmu上的事件通常不能采样,只能使用perf stat -a
进行全局计数。它们可以绑定到一个逻辑CPU,但是会测量同一个插槽中的所有CPU。
本例在Intel Xeon系统的socket 0
上的第一个内存控制器上每秒测量内存带宽:
perf stat -C 0 -a uncore_imc_0/cas_count_read/,uncore_imc_0/cas_count_write/ -I 1000 ...
每个内存控制器都有自己的PMU。测量整个系统带宽需要指定所有imc pmu(请参阅perf list output),并将这些值相加。为了简化多个事件的创建,在PMU名称中支持前缀和全局匹配,并且在执行匹配时也忽略前缀uncore_。因此,上面的命令可以通过使用以下语法扩展到所有内存控制器:
perf stat -C 0 -a imc/cas_count_read/,imc/cas_count_write/ -I 1000 ...
perf stat -C 0 -a *imc*/cas_count_read/,*imc*/cas_count_write/ -I 1000 ...
2.5 参数化的性能事件
有一些pmu事件列出来的时候,其显示字符中带有?
号。如下:
hv_gpci/dtbp_ptitc,phys_processor_idx=?/
这意味着当作为事件提供时,?
所指示的内容必须也可提供。
perf stat -C 0 -e 'hv_gpci/dtbp_ptitc,phys_processor_idx=0x2/' ...
此外还有可能指定额外的事件修饰符(percore):
perf stat -e cpu/event=0,umask=0x3,percore=1/
上面命令即汇总一个核心中所有硬件线程的事件计数。
2.6 事件组测量
当活动事件的数量超过硬件性能计数器的数量时,Perf支持基于时间的事件复用。当工作负载更改其执行配置文件时,多路复用可能导致测量错误。
当使用来自事件计数的公式计算度量时,确保始终将一些事件作为一个组一起测量以最小化多路错误是很有用的。事件组可以使用{}
指定。
perf stat -e '{instructions,cycles}' ...
可用性能计数器的数量取决于CPU。一个组不能包含比可用计数器更多的事件。例如,Intel Core cpu通常有四个通用的核心性能计数器,加上三个固定的instructions
、cycles
和ref-cycles
计数器。一些特殊事件对它们可以调度的计数器有限制,并且可能不支持单个组中的多个实例。当组中指定的事件太多时,其中一些事件将无法测量。
全局固定事件可以限制其他组可用的计数器数量。在x86系统上,NMI看门狗默认固定一个计数器。NMI看门狗可以在root用户下禁用:
echo 0 > /proc/sys/kernel/nmi_watchdog
来自多个不同pmu的事件不能混合在一个组中,软件事件除外。
perf还支持使用:S
说明符进行组领导抽样(group leader sampling
)。
perf record -e '{cycles,instructions}:S' ...
perf report --group
通常情况下,所有事件都在一个事件组样本中,但是使用:S
时,只有第一个事件(leader)进行采样,它只读取组中其他事件的值。然而,在AUX区域事件(例如Intel PT或CoreSight)的情况下,AUX区域事件必须是先导事件,因此第二个事件采样,而不是第一个事件。
2.7 perf list性能事件分类
默认情况下,perf list列出所有的已知事件。也可以通过下面的类别来列出其中某一类事件:
事件类名称 | 描述 |
---|---|
hw or hardware | 列出硬件事件,如cache-misses |
sw or software | 列出软件事件,例如上下文切换(context switches) |
cache or hwcache | 列出硬件缓存事件,如L1-dcache-loads |
tracepoint | 列出所有的tracepoint事件,也可使用subsys_glob:event_glob去过滤子系统追踪点事件,如sched、block等。 |
pmu | 打印内核提供的PMU事件 |
sdt | 列出所有静态定义的跟踪点事件(Statically Defined Tracepoint) |
metric | 指标列表(度量事件) |
metricgroup | メトリックを含むメトリック グループを一覧表示する |
–生ダンプ | すべてのイベントの元の形式情報を表示します。このオプションの後に [hw|sw|cache|tracepoint|pmu|event_glob] を続けることができます。 |
(この記事はシリーズ記事です、続きます)