第25章 Performance Counters for Linux (PCL) ツールおよび perf
Performance Counters for Linux (PCL) は、パフォーマンスデータを収集、分析するフレームワークを提供する、新しいカーネルベースのサブシステムです。これらのイベントは、システムのパフォーマンス監視のハードウェアやソフトウェア設定により異なります。Red Hat Enterprise Linux 6 には、データやユーザー空間ツール perf を収集するこのカーネルサブシステムが含まれており、収集したパフォーマンスデータを分析します。 PCL サブシステムを使用して、リタイアした説明やプロセッサークロックサイクルなど、ハードウェアイベントを測定することができます。主なページの障害やコンテキストスイッチなど、ソフトウェアイベントを測定することも可能です。たとえば、PCL カウンターは、リタイアしたプロセスの命令数やプロセッサーのクロックサイクルをもとに、 (IPC) を算出することができます。IPC の割合が低い場合は、コードが CPU をあまり使用していないことが分かります。他のハードウェアイベントを使用して、CPU パフォーマンスの低さを診断することも可能です。
パフォーマンスカウンターは、サンプルを記録するように設定することもできます。サンプルの相対的頻度を使用して、コードのどの領域がパフォーマンスに最も影響があるかを特定することが可能です。
25.1. Perf ツールコマンド
- perf stat
-
この
perfコマンドは、実行した命令や、使用したクロックサイクルなど、一般的なパフォーマンスイベントの全体的な統計が分かります。オプションを指定すると、デフォルトの計測イベント以外のイベントも選択することができます。 - perf record
-
この
perfコマンドは、パフォーマンスデータをperf reportを使用して後ほど分析できるように、ファイルに記録します。 - perf report
-
この
perfコマンドは、ファイルからパフォーマンスデータを読み込み、記録されたデータを分析します。 - perf list
-
この
perfコマンドは、特定のマシンで利用可能なイベントを一覧表示します。これらのイベントは、パフォーマンス監視ハードウェアや、システムのソフトウェア設定により異なります。
perf コマンドの完全一覧を取得するには、perf help を使用します。perf コマンドごとに、man ページの情報を取得するには、perf help command を使用します。
25.2. Perf の使用方法
プログラム実行の統計やサンプルと収集するための基本的な PCL インフラストラクチャーは、比較的単純です。以下のセクションでは、全体的な統計やサンプルのシンプルな例を紹介します。
make およびその子についての統計情報を収集するには、以下のコマンドを使用します。
# perf stat -- make all
perf コマンドは、多くの異なるハードウェアおよびソフトウェアカウンターを収集し、以下の情報を表示します。
Performance counter stats for 'make all':
244011.782059 task-clock-msecs # 0.925 CPUs
53328 context-switches # 0.000 M/sec
515 CPU-migrations # 0.000 M/sec
1843121 page-faults # 0.008 M/sec
789702529782 cycles # 3236.330 M/sec
1050912611378 instructions # 1.331 IPC
275538938708 branches # 1129.203 M/sec
2888756216 branch-misses # 1.048 %
4343060367 cache-references # 17.799 M/sec
428257037 cache-misses # 1.755 M/sec
263.779192511 seconds time elapsed
perf ツールはサンプルを記録することもできます。たとえば、make コマンドおよびその子に関するデータを記録するには、以下のコマンドを実行します。
# perf record -- make all
これで収集されたサンプル数とサンプルが保存されているファイルが表示されます。
[ perf record: Woken up 42 times to write data ] [ perf record: Captured and wrote 9.753 MB perf.data (~426109 samples) ]
Red Hat Enterprise Linux 6.4 では、{} グループ構文に新機能が追加され、これによりコマンドライン上でイベントグループが指定されている方法に基づいてイベントグループが作成できるようになりました。
最新の --group や -g オプションには変更はありません。record、stat、top コマンドが指定されていれば、指定イベントすべてが単一グループのメンバーになり、最初のイベントがグループリーダーとなります。
新たな {} グループ構文は、以下のようなグループの作成を可能にします。
# perf record -e '{cycles, faults}' ls上記のコマンドを実行すると、cycles と faults イベントを含む単一のイベントグループが作成され、cycles がグループリーダーになります。
すべてのグループはスレッドおよび CPU に関して作成されます。このため、CPU が 4 つあるサーバー上で 2 つのスレッド内のイベントは、8 つの異なるグループを作成することになります。
グループに標準イベント修飾子を使うことができます。これは、グループ内の全イベントにまたがるもので、各イベント修飾子設定を更新します。
# perf record -r '{faults:k,cache-references}:p'
上記のコマンドでは、:kp 修飾子が faults に使われ、:p 修飾子が cache-references イベントに使われることになります。
Performance Counters for Linux (PCL) ツールと OProfile の競合
OProfile と Performance Counters for Linux (PCL) は同じハードウェアの Performance Monitoring Unit (PMU) を使用します。PCL perf コマンドを使用する際に OProfile が実行中である場合は、OProfile 開始時に以下のようなエラーメッセージが表示されます。
Error: open_counter returned with 16 (Device or resource busy). /usr/bin/dmesg may provide additional information. Fatal: Not all events could be opened.
perf コマンドを使用するには、まず OProfile をシャットダウンします。
# opcontrol --deinit
その後に perf.data を分析してサンプルの相対頻度を測定することができます。レポート出力には、コマンド、オブジェクト、サンプルの機能などが含まれます。perf report を使って perf.data の分析を出力します。たとえば、以下のコマンドは最も時間がかかる実行可能ファイルのレポートを作成します。
# perf report --sort=comm
出力は以下のようになります。
# Samples: 1083783860000
#
# Overhead Command
# ........ ...............
#
48.19% xsltproc
44.48% pdfxmltex
6.01% make
0.95% perl
0.17% kernel-doc
0.05% xmllint
0.05% cc1
0.03% cp
0.01% xmlto
0.01% sh
0.01% docproc
0.01% ld
0.01% gcc
0.00% rm
0.00% sed
0.00% git-diff-files
0.00% bash
0.00% git-diff-index
左のコラムはサンプルの相対頻度を示しています。この出力では、make が xsltproc および pdfxmltex で最も多くの時間を消費していることを示しています。make が完了する時間を短縮するには、xsltproc と pdfxmltex にフォーカスします。xsltproc が実行する機能を一覧表示するには、以下のコマンドを実行します。
# perf report -n --comm=xsltproc
以下が生成されます。
comm: xsltproc
# Samples: 472520675377
#
# Overhead Samples Shared Object Symbol
# ........ .......... ............................. ......
#
45.54%215179861044 libxml2.so.2.7.6 [.] xmlXPathCmpNodesExt
11.63%54959620202 libxml2.so.2.7.6 [.] xmlXPathNodeSetAdd__internal_alias
8.60%40634845107 libxml2.so.2.7.6 [.] xmlXPathCompOpEval
4.63%21864091080 libxml2.so.2.7.6 [.] xmlXPathReleaseObject
2.73%12919672281 libxml2.so.2.7.6 [.] xmlXPathNodeSetSort__internal_alias
2.60%12271959697 libxml2.so.2.7.6 [.] valuePop
2.41%11379910918 libxml2.so.2.7.6 [.] xmlXPathIsNaN__internal_alias
2.19%10340901937 libxml2.so.2.7.6 [.] valuePush__internal_alias
Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.