第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
このツールは、メモリーからの読み取りおよびメモリーへの書き込みのすべてをチェックし、mallocnewfree、および 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 ツールのスィートに加えて、nonetoolname の有効な引数です。この引数を使用することにより、プロファイルを実行せずにプログラムを 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 プロファイル実行を起動するには、Run > Profile に移動します。これにより、Profile As ダイアログが開かれ、ここからプロファイル実行用のツールを選択できます。
Profile As

図6.1 Profile As

プロファイル実行用に各ツールを設定するには、Run > Profile Configuration に移動します。これにより、Profile Configuration メニューが開かれます。
Profile Configuration

図6.2 Profile Configuration

Eclipse 用の Valgrind プラグインは、eclipse-valgrind パッケージで提供されます。このプラグインについての詳細は、Eclipse Help Contents の『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 Help Contents にある 『Valgrind Integration User Guide』 も、Eclipse 用の Valgrind プラグインのセットアップと使用についての詳細情報を提供しています。このガイドは、eclipse-valgrind パッケージで提供されています。