7.2. パフォーマンスの問題の監視と診断
Red Hat Enterprise Linux 7 ではシステムのパフォーマンス監視やシステムメモリーに関連するパフォーマンスの問題の診断を行う際に便利なツールがいくつか用意されています。このセクションではこうしたツールを簡単に説明し、メモリー関連のパフォーマンス問題を監視、診断する方法を例を使用して説明していきます。
7.2.1. vmstat を使用したメモリー使用量の監視
vmstat は procps-ng パッケージで提供され、システムのプロセス、メモリー、ページング、入出力のブロック、割り込み、および CPU アクティビティーに関するレポートを出力します。最後にマシンを起動した時点または最後の報告を行った時点からのイベント平均を瞬時に報告します。
次のコマンドは各種イベントカウンターおよびメモリー統計の表を表示します。
$ vmstat -s
vmstat の使い方については、「vmstat」 または man ページを参照してください。
$ man vmstat
7.2.2. Valgrind を使用したアプリケーションのメモリー使用量のプロファイリング
Valgrind は、ユーザー空間バイナリーへのインストルメンテーションを提供するフレームワークです。プログラムのパフォーマンスのプロファイリングや分析に使用できるツールがいくつか収納されています。このセクションで説明されている valgrind ツールは、初期化されていないメモリー使用や不適切なメモリー割り当てや割り当て解除などのメモリーエラーを検出するのに役立ちます。
valgrind もしくはそのツールを使用するには、valgrind パッケージをインストールします。
# yum install valgrind
7.2.2.1. Memcheck を使用したメモリー使用量のプロファイリング
Memcheck はデフォルトの valgrind ツールです。これは、以下のような多くのメモリーエラーを検出し、報告することが困難となる可能性のあるメモリーエラーについて検出および報告します。
- 発生すべきでないメモリーアクセス
- 未定義または初期化されていない値の使用
- 誤って解放されたヒープメモリー
- ポインターの重複
- メモリーリーク
注記
memcheck は、これらのエラーのみを報告でき、エラーの発生を防ぐことはできません。通常、セグメンテーション違反が発生するような形でプログラムによるメモリーアクセスが行われればセグメンテーション違反は発生します。ただし、memcheck は障害の直前にエラーメッセージをログに記録します。
memcheck はインストルメンテーションを使用するため、memcheck で実行されるアプリケーションは、通常よりも 10 倍から 30 倍遅くなります。
アプリケーションで memcheck を実行するには、以下のコマンドを実行します。
# valgrind --tool=memcheck application
以下のオプションを使用して、特定の問題タイプで memcheck 出力に集中することもできます。
- --leak-check
- アプリケーションの実行が終了すると、memcheck はメモリーリークを検索します。デフォルト値は --leak-check=summary で、検出されたメモリーリークの数を出力します。--leak-check=yes または --leak-check=full を指定して、個別のリークの詳細を出力できます。無効にするには、--leak-check=no を指定します。
- --undef-value-errors
- デフォルト値は --undef-value-errors=yes で、未定義の値が使用されている場合にエラーを報告します。--undef-value-errors=no を指定することもできます。これにより、このレポートが無効になり、Memcheck が若干高速になります。
- --ignore-ranges
- メモリーアドレス可能性を確認する際に memcheck が無視する 1 つ以上の範囲を指定します(例:
--ignore-ranges=0xPP-0xQQ,0xRR-0xSS
)。
memcheck オプションの全一覧は、
/usr/share/doc/valgrind-version/valgrind_manual.pdf
に含まれているドキュメントを参照してください。
7.2.2.2. Cachegrind を使用したキャッシュ使用量のプロファイリング
Cachegrind は、システムのキャッシュ階層および分岐予測とのアプリケーションの対話をシミュレートします。シュミレーションされた第一レベルの指示とデータキャッシュの使用量を追跡し、このレベルのキャッシュで不良なアプリケーションコードのやりとりを検出します。また、メモリーへのアクセスを追跡するため最後のレベルのキャッシュ (第 2 または第 3 レベル) も追跡します。そのため、cachegrind で実行されるアプリケーションは、通常よりも 20 倍から 100 倍遅くなります。
Cachegrind は、アプリケーションの実行中に統計を収集し、コンソールに要約を出力します。アプリケーションで cachegrind を実行するには、以下のコマンドを実行します。
# valgrind --tool=cachegrind application
以下のオプションを使用して、特定の問題に cachegrind 出力に集中することもできます。
- --I1
- --I1= size、associativity、line_sizeのように、最初のレベルの命令キャッシュのサイズ、連想性、行サイズ を指定します。
- --D1
- --D1= size、associativity、line_sizeのように、第 1 レベルのデータキャッシュのサイズ、連想性、行サイズ を指定します。
- --LL
- --LL= size、associativity、line_sizeのように、最後のレベルのキャッシュのサイズ、連想性、行サイズ を指定します。
- --cache-sim
- キャッシュアクセスおよびミスの数の収集を有効化または無効化します。これはデフォルトで有効になっています(--cache-sim=yes)。このオプションと --branch-sim の両方を無効にすると、cachegrind には収集する情報がなくなります。
- --branch-sim
- ブランチ命令と誤った予測数の収集を有効化または無効化します。これはデフォルトで有効になっています(--branch-sim=yes)。このオプションと --cache-sim の両方を無効にすると、cachegrind には収集する情報がなくなります。Cachegrind は、詳細なプロファイリング情報をプロセスごとの
cachegrind.out.pid
ファイルに書き込みます。pid はプロセス ID です。この詳細情報は、次のようなコンパニオン cg_annotate ツールでさらに処理できます。# cg_annotate cachegrind.out.pid
Cachegrind は cg_diff ツールも提供します。これにより、コードの変更前後にプログラムのパフォーマンスを簡単に確認できます。出力ファイルを比較するには次のコマンドを実行します。first には初期プロファイルの出力ファイル、second には次のプロファイルの出力ファイルを入力します。
# cg_diff first second
cg_annotate ツールを使用して、出力ファイルをより詳細に表示できます。
cachegrind オプションの全一覧は、
/usr/share/doc/valgrind-version/valgrind_manual.pdf
に含まれているドキュメントを参照してください。
7.2.2.3. Massif を使用したヒープとスタックの領域プロファイリング
massif は、 指定されたアプリケーションによって使用されるヒープ領域を測定します。測定対象は、有用な領域および会計、調整用に割り当てられている追加領域の両方になりますmassif は、アプリケーションのメモリー使用量を減らして、実行速度を高め、アプリケーションがシステムのスワップ領域を使い切る可能性を減らす方法を理解するのに役立ちます。massif で実行されるアプリケーションは、通常よりも約 20 倍遅くなります。
アプリケーションで massif を実行するには、以下のコマンドを実行します。
# valgrind --tool=massif application
以下のオプションを使用して、特定の問題に massif 出力をフォーカスすることもできます。
- --heap
- massif がヒープをプロファイリングするかどうかを指定します。デフォルト値は --heap=yes です。ヒーププロファイリングを無効にするには、これを --heap=no に設定します。
- --heap-admin
- ヒープのプロファイリングを有効にした場合の管理に使用するブロックごとのバイト数を指定します。デフォルト値は
8
バイトです。 - --stacks
- massif がスタックをプロファイリングするかどうかを指定します。スタックのプロファイリングでは massif が大幅に遅くなる可能性があるため、デフォルト値は --stack=no です。スタックのプロファイリングを有効にするには、このオプションを --stack=yes に設定します。massif は、プロファイル対象のアプリケーションに関連するスタックサイズの変更をより適切に示すために、メインスタックがゼロで始まることを前提としています。
- --time-unit
- massif がプロファイリングデータを収集する間隔を指定します。デフォルト値は
i
(命令が実行される)です。ms
(ミリ秒またはリアルタイム)およびB
(ヒープおよびスタックで割り当てられたバイトまたは割り当て解除されたバイト)を指定することもできます。ハードウェアが異なる場合でもほぼ再現が可能なため短時間実行のアプリケーションやテスト目的の場合には割り当てられたバイト数を確認すると役に立ちます。
massif はプロファイリング データを
massif.out.pid
ファイルに出力します。ここで、pid は指定されたアプリケーションのプロセス識別子です。ms_print ツールは、このプロファイリングデータをグラフ化して、アプリケーションの実行におけるメモリー消費と、メモリー割り当てのピーク時に割り当てを行うサイトに関する詳細情報を表示します。massif.out.pid
ファイルからデータをグラフ化するには、以下のコマンドを実行します。
# ms_print massif.out.pid
Massif オプションの全一覧は、
/usr/share/doc/valgrind-version/valgrind_manual.pdf
に含まれているドキュメントを参照してください。