Perf はプロセッサに搭載された性能監視ユニット (PMU) にアクセスするためのインターフェイスで、ページフォルトなどのソフトウエア全てを記録し、表示することができます。また、システム全体やスレッド単位、そして KVM の仮想化ゲストの監視にも対応しています。
収集された情報はレポート内に保存することができます。このレポートにはインストラクションポインタに関する情報のほか、その時点でスレッドが実行していたコードの内容などが含まれています。
Perf は下記の 2 種類の部品から構成されています:
ハードウエアに対して指示を与える、 Linux カーネル内に統合されたコード。
カーネルコードを使用することができ、収集したデータの分析を支援するための perf
ユーザスペースユーティリティ。
性能監視とは、アプリケーションやシステムがどのような処理を行ったのかについて、関連する情報を収集することを意味します。この情報はソフトウエアベースの手段のほか、 CPU やチップセットなどを介して取得することができます。 Perf では、これらの方式の両方を統合する仕組みです。
多くの新しいプロセッサには、性能監視ユニット (Performance Monitoring Unit (PMU)) が搭載されています。 PMU の設計と機能は CPU ごとに異なります。たとえばレジスタの数や対応するカウンタ、機能などは CPU 側の実装によって異なります。
それぞれの PMU のレジスタを分類すると、性能監視設定 (Performance Monitor Configuration; PMC) と性能監視データ (Performance Monitor Data (PMD)) に分けられます。どちらのレジスタとも読み込みは可能ですが、書き込みに関しては PMC にのみ行うことができます。これらのレジスタには、設定情報とデータが記憶されています。
Perf にはいくつかのプロファイルモードが用意されています:
カウンティング: イベントの発生回数を数えるモードです。
イベントベースのサンプリング: あまり正確ではない計数方法です。ある一定回数のイベント発生が起こるたびにサンプルを記録するモードです。
時間ベースのサンプリング: あまり正確ではない計数方法です。一定の時間間隔でサンプルを記録するモードです。
インストラクションベースのサンプリング (AMD64 のみ): プロセッサは、指定された間隔で現れるインストラクションに従い、生成されるイベントを採取します。これにより、個別のインストラクションをたどることができますので、性能面で何が問題なのかを確認することができるようになります。
Perf のカーネルコードは既定のカーネル内に含まれています。ユーザスペース側のユーティリティを使用するには、 perf パッケージをインストールしてください。
必要な情報を収集する目的で、 perf
ツールにはいくつかのサブコマンドが用意されています。本章では、最もよく使用するサブコマンドについて、概要を説明しています。
サブコマンドに対するヘルプを表示したい場合は、perf help
サブコマンド もしくは man perf-
サブコマンド のように入力して実行してください。
perf stat
プログラムを起動し、終了時に統計情報の概要を生成します。 perf stat
はイベントの発生回数を数えるために使用します。
perf record
プログラムを起動し、パフォーマンスカウンタ情報のレポートを作成します。レポートはカレントディレクトリ内の perf.data
ファイルに保存されます。 perf record
はイベントのサンプリングで使用します。
perf report
perf record
で作成したレポートを表示します。
perf annotate
レポートファイルを表示するとともに、実行されていたコードの注釈付きバージョンを表示します。デバッグシンボルがインストールされていれば、ソースコードも表示されます。
perf list
現在のカーネルと CPU で Perf がレポートすることのできる、イベントの種類を一覧表示します。イベントの種類は分類でフィルタリングすることができます。たとえばハードウエアイベントのみを表示したい場合は、 perf list hw
のように入力して実行します。
perf_event_open
に対するマニュアルページには、最も重要なイベントに関する短い説明が書かれています。たとえば branch-misses
というイベントに対する説明を読むには、 BRANCH_MISSES
を検索してください (大文字で、ハイフンをアンダースコアにしていることに注意してください):
>
man
perf_event_open |grep
-A5 BRANCH_MISSES
イベントによっては名前がわかりにくいものもあります。ハードウエアイベント名のうち、小文字のものはハードウエアイベントを直接指し示すものではなく、 Perf が独自に別名として作成したものであることに注意してください。このような別名定義により、対応する様々なプロセッサで名前の異なる似通ったイベントを統一的に収集できるようになっています。
たとえば cpu-cycles
というイベントは、 Intel プロセッサでは UNHALTED_CORE_CYCLES
というハードウエアイベントにマップされていますが、 AMD プロセッサでは CPU_CLK_UNHALTED
というハードウエアイベントにマップされています。
Perf では、ハードウエア固有のイベントの計数にも対応しています。それらの説明を読みたい場合は、 CPU の製造元が提供するアーキテクチャソフトウエア開発者マニュアル (Architecture Software Developer's Manual) をお読みください。 AMD64/Intel 64 プロセッサでの対応文書については、 6.7項 「さらなる情報」 にリンクがあります。
perf top
発生したシステムの動作状況を表示します。
perf trace
このコマンドは strace
に似た動作をする仕組みで、特定のスレッドやプロセスでどのシステムコールが実行されているのかと、シグナルの受信状況を表示することができます。
イベント (perf list
で表示されるイベント) の発生回数を数えるには、下記のように入力して実行します:
#
perf
stat -e イベント名 -a
複数のイベントを一括で数えたい場合は、それらをカンマ区切りで指定します。たとえば cpu-cycles
と instructions
をまとめて数えるには、下記のように入力して実行します:
#
perf
stat -e cpu-cycles,instructions -a
セッションを停止するには、 Ctrl–C を押します。
一定時間内でのイベント発生回数を数えることもできます:
#
perf
stat -e イベント名 -a -- sleep 時間
時間 の箇所は秒単位で指定してください。
特定のコマンドに固有のイベントを採取する方法には、いくつかのものがあります:
新しく起動したコマンドに対してレポートを作成するには、下記のようにします:
#
perf
record コマンド
起動したコマンドは通常通りに処理を行うだけです。コマンドのプロセスが終了すると、 Perf のセッションも終了します。
新しく起動したコマンドが実行されている間、システム全体で発生したイベントのレポートを作成するには、下記のようにします:
#
perf
record -a コマンド
起動したコマンドは通常通りに処理を行うだけです。コマンドのプロセスが終了すると、 Perf のセッションも終了します。
動作中のプロセスに対するレポートを作成するには、下記のようにします:
#
perf
record -p PID
ここで、 PID にはプロセス ID を指定します。セッションを停止するには、 Ctrl–C を押します。
収集されたデータ ( perf.data
) を表示するには、下記のように入力して実行します:
>
perf
report
すると、擬似的なグラフィカルインターフェイスが起動されます。 ヘルプを表示したい場合は H を、終了したい場合は Q をそれぞれ押してください。
グラフィカルインターフェイスを使用したい場合は、 Perf の GTK+ インターフェイスをお試しください:
>
perf
report --gtk
ただし、 GTK+ インターフェイスの機能は限られたものであることに注意してください。
本章では非常に短い説明しか記載していません。下記に示すリンク先で様々な情報が提供されています (英語のみの提供となります):
プロジェクトの Web ページです。 perf
を使用する際のチュートリアルも用意されています。
perf
の様々な使用例を含む、非公式ページです。
様々なりソースを含む非公式ページです。主に Perf の Linux カーネルコードと、その API に関連した情報が書かれています。たとえば CPU の互換性テーブルやプログラミングガイドなどがあります。
Intel Architectures Software Developer's Manual, Volume 3B です。
AMD Architecture Programmer's Manual, Volume 2 です。
性能を最適化したい場合は、この章もお読みください。