第6章 プロファイル
開発者は、パフォーマンスに最も大きな影響を与えるプログラムの部分に注目するためにプログラムのプロファイルを作成します。収集されるデータのタイプには、プロセッサーの時間を最も多く消費するプログラムのセクションや、メモリが割り振られる場所などがあります。プロファイルでは、実際のプログラム実行からデータを収集します。そのため、収集されるデータの質は、プログラムが実施する実際のタスクに影響されます。プロファイル時に実施されるタスクは、実際の使用を表すものでなければなりません。これにより、プログラムの実際の使用に起因する問題への対応を開発時に確実に行うことができるようになります。
Red Hat Enterprise Linux 6 には、プロファイルデータを収集するための数多くの異なるツール (Valgrind、OProfile、
perf
、および SystemTap) が含まれます。それぞれのツールは、以下のセクションで説明されているように特定タイプのプロファイルの実行に適しています。
6.1. Valgrind
Valgrind は、アプリケーションの詳細なプロファイルを作成するために使用する動的な分析ツールを構築するための計測フレームワークです。Valgrind ツールは、通常多くのメモリー管理およびスレッド化の問題を自動検出するために使用されます。また、Valgrind スイートには、新規のプロファイルツールを随時作成できるツールも含まれます。
Valgrind は、初期化されていないメモリーの使用、メモリーの不適切な割り振り/解放、およびシステム呼び出しの不適切な引数などのエラーをチェックするためのユーザースペースバイナリーの計測を提供します。そのプロファイルツールは、標準的なユーザーがほとんどのバイナリーに対して使用できますが、他のプロファイラーと比較すると、Valgrind プロファイルの実行速度は大幅に遅くなります。バイナリーのプロファイルを作成するために、Valgrind はその実行可能ファイルを再作成し、再作成されたバイナリーを計測します。Valgrind のツールは、ユーザースペースプログラムにおけるメモリ関連の問題を見つける際に最も役立ちます。ただし、これはある時間に特定の問題や、カーネルスペースの計測/デバッグには適していません。
過去のリリースでは、Valgrind は IBM System z アーキテクチャーをサポートしていませんでした。しかし、6.1 の時点でこのサポートが追加されました。つまり、Valgrind は、Red Hat Enterprise Linux 6.x でサポートされるすべてのハードウェアアーキテクチャーをサポートするようになりました。
6.1.1. Valgrind ツール
Valgrind スイートは以下のツールで構成されています。
- memcheck
- このツールは、メモリーからの読み取りおよびメモリーへの書き込みのすべてをチェックし、
malloc
、new
、free
、およびdelete
へのすべてのシステム呼び出しをインターセプトすることにより、プログラム内のメモリー管理の問題を検出します。他の手段を使ってメモリー管理の問題を検出することは困難であるため、memcheck は最もよく使用される Valgrind ツールと言えるかもしれません。このような問題は長期にわたって検出されないままになることが多く、最終的には診断しにくいクラッシュを生じさせます。 - cachegrind
- cachegrind は、CPU 内の I1、D1 および L2 キャッシュの詳細なシミュレーションを実行することにより、コード内のキャッシュミスの原因を正確に指摘するキャッシュプロファイラーです。これは、キャッシュミス数、メモリ参照、およびソースコードの各行になる命令を示します。また、cachegrind は関数別、モジュール別、およびプログラム全体の要約を提供し、個々のマシン命令のカウントを表示することもできます。
- callgrind
cachegrind
のように、callgrind
はキャッシュ動作をモデリングできます。ただし、callgrind
の主な目的は、実行済みコードについての callgraphs データを記録することにあります。- massif
- massif はヒーププロファイラーです。これは、プログラムが使用するヒープメモリーの量を測定し、ヒープブロック、ヒープ管理オーバーヘッド、およびスタックサイズについての情報を提供します。ヒーププロファイラーは、ヒープメモリーの使用量を減らす方法を探す際に役立ちます。仮想メモリを使用するシステムでは、最適なヒープメモリー使用量が設定されたプログラムがメモリー不足になる可能性は少なく、必要なページングが少ない分、スピードが速くなることがあります。
- helgrind
- POSIX pthreads スレッド化プレミティブを使用するプログラムでは、 helgrind は同期エラーを検出します。このようなエラーには以下が含まれます。
- POSIX pthreads API の誤用
- ロックの順序付けの問題から生じる潜在的なデッドロック
- データレース (ロックが適切でない状態でのメモリーへのアクセス)
Valgrind により、独自のプロファイルツールを開発することもできます。これに関連して、Valgrind には、独自のツールを生成するためのテンプレートとして使用できるサンプルの
lackey
ツールが含まれます。
6.1.2. Valgrind の使用
valgrind
パッケージとその依存関係は、Valgrind プロファイル実行を実施するために必要なすべてのツールをインストールします。Valgrind を使ってプログラムのプロファイルを作成するには、以下を使用します。
valgrind --tool=toolname program
toolname
の引数のリストについては、「Valgrind ツール」 を参照してください。Valgrind ツールのスィートに加えて、none
も toolname
の有効な引数です。この引数を使用することにより、プロファイルを実行せずにプログラムを Valgrind の下で実行できます。これは、Valgrind 自体のデバッグまたはベンチマークの際に役立ちます。
さらに、Valgrind に対し、その情報のすべてを特定ファイルに送信するように指示することもできます。これを実行するには、オプションの
--log-file=filename
を使用します。たとえば、実行可能ファイルの hello
のメモリー使用量をチェックしたり、プロファイル情報を output
に送信するには、以下を使用します。
valgrind --tool=memcheck --log-file=output hello
詳細は、Valgrind スイートのツールに関する他のドキュメントと合わせて、「Valgrind のドキュメント」を参照してください。
6.1.3. Eclipse 用の Valgrind プラグイン
Eclipse 用の Valgrind プラグインは、複数の Valgrind ツールを Eclipse に統合します。これにより、Eclipse ユーザーは、各種のプロファイル機能をそれぞれのワークフローにシームレスに組み込むことができます。現在、Eclipse 用の Valgrind プラグインは、以下の 3 つの Valgrind ツールをサポートしています。
- Memcheck
- Massif
- Cachegrind
Valgrind プロファイル実行を起動するには、 > に移動します。これにより、 ダイアログが開かれ、ここからプロファイル実行用のツールを選択できます。
図6.1 Profile As
プロファイル実行用に各ツールを設定するには、
> に移動します。これにより、 メニューが開かれます。
Eclipse 用の Valgrind プラグインは、
eclipse-valgrind
パッケージで提供されます。このプラグインについての詳細は、Eclipse の『Valgrind Integration User Guide』を参照してください。
6.1.4. Valgrind のドキュメント
Valgrind についての詳細は、
man valgrind
を参照してください。また Red Hat Enterprise Linux 6 は、包括的なドキュメント『Valgrind Documentation』が PDF および HTML 形式で提供されており、これらは以下にあります。
file:///usr/share/doc/valgrind-version/valgrind_manual.pdf
file:///usr/share/doc/valgrind-version/html/index.html
Eclipse Valgrind Integration User Guide』 も、Eclipse 用の Valgrind プラグインのセットアップと使用についての詳細情報を提供しています。このガイドは、
にある 『eclipse-valgrind
パッケージで提供されています。