Jump to contentJump to page navigation: previous page [access key p]/next page [access key n]
適用先 openSUSE Leap 15.7

6 Perf を利用したハードウエアベースの監視 Edit source

概要

Perf はプロセッサに搭載された性能監視ユニット (PMU) にアクセスするためのインターフェイスで、ページフォルトなどのソフトウエア全てを記録し、表示することができます。また、システム全体やスレッド単位、そして KVM の仮想化ゲストの監視にも対応しています。

収集された情報はレポート内に保存することができます。このレポートにはインストラクションポインタに関する情報のほか、その時点でスレッドが実行していたコードの内容などが含まれています。

Perf は下記の 2 種類の部品から構成されています:

  • ハードウエアに対して指示を与える、 Linux カーネル内に統合されたコード。

  • カーネルコードを使用することができ、収集したデータの分析を支援するための perf ユーザスペースユーティリティ。

6.1 ハードウエアベースの監視 Edit source

性能監視とは、アプリケーションやシステムがどのような処理を行ったのかについて、関連する情報を収集することを意味します。この情報はソフトウエアベースの手段のほか、 CPU やチップセットなどを介して取得することができます。 Perf では、これらの方式の両方を統合する仕組みです。

多くの新しいプロセッサには、性能監視ユニット (Performance Monitoring Unit (PMU)) が搭載されています。 PMU の設計と機能は CPU ごとに異なります。たとえばレジスタの数や対応するカウンタ、機能などは CPU 側の実装によって異なります。

それぞれの PMU のレジスタを分類すると、性能監視設定 (Performance Monitor Configuration; PMC) と性能監視データ (Performance Monitor Data (PMD)) に分けられます。どちらのレジスタとも読み込みは可能ですが、書き込みに関しては PMC にのみ行うことができます。これらのレジスタには、設定情報とデータが記憶されています。

6.2 サンプリングとカウンティング Edit source

Perf にはいくつかのプロファイルモードが用意されています:

  • カウンティング: イベントの発生回数を数えるモードです。

  • イベントベースのサンプリング: あまり正確ではない計数方法です。ある一定回数のイベント発生が起こるたびにサンプルを記録するモードです。

  • 時間ベースのサンプリング: あまり正確ではない計数方法です。一定の時間間隔でサンプルを記録するモードです。

  • インストラクションベースのサンプリング (AMD64 のみ): プロセッサは、指定された間隔で現れるインストラクションに従い、生成されるイベントを採取します。これにより、個別のインストラクションをたどることができますので、性能面で何が問題なのかを確認することができるようになります。

6.3 Perf のインストール Edit source

Perf のカーネルコードは既定のカーネル内に含まれています。ユーザスペース側のユーティリティを使用するには、 perf パッケージをインストールしてください。

6.4 Perf のサブコマンド Edit source

必要な情報を収集する目的で、 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 に似た動作をする仕組みで、特定のスレッドやプロセスでどのシステムコールが実行されているのかと、シグナルの受信状況を表示することができます。

6.5 特定種類のイベントのカウント Edit source

イベント (perf list で表示されるイベント) の発生回数を数えるには、下記のように入力して実行します:

# perf stat -e イベント名 -a

複数のイベントを一括で数えたい場合は、それらをカンマ区切りで指定します。たとえば cpu-cyclesinstructions をまとめて数えるには、下記のように入力して実行します:

# perf stat -e cpu-cycles,instructions -a

セッションを停止するには、 CtrlC を押します。

一定時間内でのイベント発生回数を数えることもできます:

# perf stat -e イベント名 -a -- sleep 時間

時間 の箇所は秒単位で指定してください。

6.6 特定のコマンド固有のイベント記録 Edit source

特定のコマンドに固有のイベントを採取する方法には、いくつかのものがあります:

  • 新しく起動したコマンドに対してレポートを作成するには、下記のようにします:

    # perf record コマンド

    起動したコマンドは通常通りに処理を行うだけです。コマンドのプロセスが終了すると、 Perf のセッションも終了します。

  • 新しく起動したコマンドが実行されている間、システム全体で発生したイベントのレポートを作成するには、下記のようにします:

    # perf record -a コマンド

    起動したコマンドは通常通りに処理を行うだけです。コマンドのプロセスが終了すると、 Perf のセッションも終了します。

  • 動作中のプロセスに対するレポートを作成するには、下記のようにします:

    # perf record -p PID

    ここで、 PID にはプロセス ID を指定します。セッションを停止するには、 CtrlC を押します。

収集されたデータ ( perf.data ) を表示するには、下記のように入力して実行します:

> perf report

すると、擬似的なグラフィカルインターフェイスが起動されます。 ヘルプを表示したい場合は H を、終了したい場合は Q をそれぞれ押してください。

グラフィカルインターフェイスを使用したい場合は、 Perf の GTK+ インターフェイスをお試しください:

> perf report --gtk

ただし、 GTK+ インターフェイスの機能は限られたものであることに注意してください。

6.7 さらなる情報 Edit source

本章では非常に短い説明しか記載していません。下記に示すリンク先で様々な情報が提供されています (英語のみの提供となります):

https://perf.wiki.kernel.org/index.php/Main_Page

プロジェクトの Web ページです。 perf を使用する際のチュートリアルも用意されています。

https://www.brendangregg.com/perf.html

perf の様々な使用例を含む、非公式ページです。

https://web.eece.maine.edu/~vweaver/projects/perf_events/

様々なりソースを含む非公式ページです。主に Perf の Linux カーネルコードと、その API に関連した情報が書かれています。たとえば CPU の互換性テーブルやプログラミングガイドなどがあります。

https://www-ssl.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3b-part-2-manual.pdf

Intel Architectures Software Developer's Manual, Volume 3B です。

https://support.amd.com/TechDocs/24593.pdf

AMD Architecture Programmer's Manual, Volume 2 です。

第7章 「OProfile: システム全体に対するプロファイラ

性能を最適化したい場合は、この章もお読みください。

このページを印刷