Perf - Linux向けのパフォーマンス監視および分析ツール
コンピュータのパフォーマンスについて話すとき、私たちはリソースとそれにより特定の時間内に完了できるタスクとの関係を指します。
企業間の厳しい競争の中で、私たちが持っているものを最大限に活用する方法を学ぶことが重要です。ハードウェアやソフトウェアリソースの無駄遣いや、それらをより効率的に使う能力の欠如は、私たちがトップの座にいたいのであれば、余裕のない損失となります。
同時に、持続的な使用が修復不可能な損害をもたらす限界まで資源を使い果たさないように注意しなければなりません。
この記事では、比較的新しいパフォーマンス分析ツールを紹介し、ハードウェアやアプリケーションを含むLinuxシステムを監視するためのヒントを提供します。これにより、リソースや自身のエネルギーを無駄にすることなく、望ましい結果を出すことができるようにシステムが正常に動作することを保証できます。
LinuxにおけるPerfの紹介とインストール
他のツールの中でも、Linuxは便利にperfと呼ばれるパフォーマンス監視・分析ツールを提供しています。それでは、perfは、すでに馴染みのある他のよく知られたツールとどのように異なるのでしょうか?
答えは、perfがCPUのパフォーマンスモニタリングユニットへのアクセスを提供し、ハードウェアの動作や関連するイベントを詳しく見ることを可能にするということです。
さらに、それはソフトウェアイベントを監視し、収集したデータからレポートを作成することもできます。
RPM ベースのディストリビューションでは、perf を以下のようにインストールできます:
# yum update && yum install perf [CentOS / RHEL / Fedora]
dnf update && dnf install perf [Fedora 23+ releases]
Debianおよびその派生版では:
# sudo aptitude update && sudo aptitude install linux-tools-$(uname -r) linux-tools-generic
上記のコマンドで uname -r が実際のバージョン(私の場合は 3.2.0-23-generic)以外の余分な文字列を返す場合、uname の出力を使用する代わりに linux-tools-3.2.0-23 と入力する必要があるかもしれません。
また、perfはVirtualBoxやVMWare上のゲストで実行すると不完全な結果を返すことにも注意が必要です。これらの仮想化技術は、KVMやXENのようにハードウェアカウンタへのアクセスを許可しないためです。
さらに、いくつかのperfコマンドはデフォルトでrootに制限されていることに注意してください。これを無効にするには(システムが再起動されるまで)、次のようにします:
# echo 0 > /proc/sys/kernel/perf_event_paranoid
パラノイドモードを永久に無効にする必要がある場合は、/etc/sysctl.confファイル内の次の設定を更新してください。
kernel.perf_event_paranoid = 0
サブコマンド
一度perfをインストールすると、利用可能なサブコマンドのリストについてのマニュアルページを参照できます(サブコマンドは、システムへの特定のウィンドウを開く特別なオプションと考えることができます)。最良でより完全な結果を得るために、perfをrootとして、またはsudoを通じて使用してください。
パフォーマンスリスト
perf list(オプションなし)は、すべてのシンボリックイベントタイプの長いリストを返します。特定のカテゴリの利用可能なイベントのリストを表示したい場合は、perf listの後にカテゴリ名([hw|sw|cache|tracepoint|pmu|event_glob])を続けて使用します。例えば:
Linuxで定義済みのソフトウェアイベントのリストを表示する:
# perf list sw
パフォーマンス統計
perf statはコマンドを実行し、そのコマンドの実行中にLinuxのパフォーマンス統計を収集します。我々がddを実行したとき、私たちのシステムで何が起こるのでしょうか?
# perf stat dd if=/dev/zero of=test.iso bs=10M count=1
上記の統計は、他のことの中でも以下のことを示しています:
- dd コマンドの実行には 21.812281 ミリ秒の CPU がかかりました。この数値を下の “経過時間(秒)” の値 (23.914596 ミリ秒) で割ると、0.912 (CPU 使用率) が得られます。
- コマンドが実行される間に、15 回のコンテキストスイッチ(プロセススイッチとも呼ばれる)が発生し、CPUが15回、あるプロセス(またはスレッド)から別のプロセス(またはスレッド)に切り替わったことを示しています。
- 2 CPUの移行は、2コアCPUにおいてワークロードがコアの数に均等に分配されるときの期待される結果です。
その間に(21.812281ミリ秒)、消費されたCPUサイクルの総数は62,025,623であり、それを0.021812281秒で割ると2.843 GHzになります。 - もし私たちがサイクルの数を総命令数で割ると、4.9 サイクル/命令が得られます。これは、各命令の実行にほぼ5 CPUサイクルがかかることを意味しています(平均的に)。これは、分岐と分岐ミスの数(下記参照)に起因するものであり、結果としてCPUサイクルを無駄にしたり、誤って使用したりすることになります。
- コマンドが実行されたとき、合計3,552,630の分岐が発生しました。これは、コード内の決定ポイントとループのCPUレベルの表現です。分岐が多いほど、パフォーマンスは低下します。このため、すべての現代CPUは、コードがたどるであろうフローを予測しようとします。51,348のブランチミスは、予測機能が1.45%の確率で誤っていたことを示しています。
アプリケーションが実行中の状態で統計を収集する(つまり、プロファイリングする)際にも同じ原則が適用されます。必要なアプリケーションを起動し、適切な期間(これはあなた次第です)後に閉じるだけで、perf が画面に統計を表示します。その統計を分析することで、潜在的な問題を特定することができます。
パフォーマンスのトップ
perf top は、ほぼリアルタイムのシステムプロファイル(ライブ分析とも呼ばれる)を表示する点で、top コマンドに似ています。
-aオプションを使用すると、すべての既知のイベントタイプが表示されます。一方、-eオプションを使用すると、perf listによって返された特定のイベントカテゴリを選択できます。
すべてのサイクルイベントを表示します。
perf top -a
すべてのCPUクロック関連のイベントを表示します。
perf top -e cpu-clock
上記の出力の最初の列は、実行開始以来サンプルとして取得された割合を、関数シンボルおよび共有オブジェクトごとにグループ化したものです。より多くのオプションについては、man perf-topを参照してください。
パフォーマンス記録
perfはコマンドを実行し、統計データを現在の作業ディレクトリ内のperf.dataというファイルに保存します。perf statと同様に実行されます。
perf record とコマンドを入力してください:
# perf record dd if=/dev/null of=test.iso bs=10M count=1
パフォーマンスレポート
perf reportは、上記のperf.dataに収集されたデータをパフォーマンスレポートにフォーマットします。
# sudo perf report
上記のサブコマンドはすべて、次のように呼び出すことができる専用のマニュアルページを持っています:
# man perf-subcommand
サブコマンド は、list、stat、top、record、または report のいずれかです。これらは最も頻繁に使用されるサブコマンドです。他のサブコマンドはドキュメントに記載されています(リンクについては要約セクションを参照してください)。
要約
このガイドでは、Linux用のパフォーマンスモニタリングおよび分析ツールであるperfを紹介しました。そのドキュメントはhttps://perf.wiki.kernel.orgで維持されているので、ぜひご確認ください。
リソースの高い割合を消費しているアプリケーションを見つけた場合は、ソースコードを変更するか、他の代替手段を使用することを検討してください。
この記事に関する質問や改善提案があれば、ぜひお聞かせください。下のコメントフォームをご利用ください。





