Sun WorkShop には、アプリケーションのパフォーマンスデータを収集し、集まったデータの解析を行うために共に使用する 1 組のツールが用意されています。その 2 つのツールが標本コレクタと標本アナライザです。標本コレクタはパフォーマンスデータを収集し、標本アナライザはそのデータをグラフィカルに表示します。これらのツールは、ソフトウェア開発者による使用 (パフォーマンスのチューニングは開発者の担当でない場合でも)を前提として設計されています。
この章は、以下の項目から構成されています。
標本コレクタは、オペレーティングシステムのタイミングの集計情報、アドレス空間データ、プログラムカウンタまたはコールスタックの統計標本を収集し、関数単位に、さまざな状態における包括的な実行時間や排他的な実行時間を提示します。
一方、標本アナライザは、標本コレクタによって記録された実験データをグラフィカルに表示します。さらに、標本アナライザは、マップファイルを作成することで、より効率的なアプリケーション再構築の手がかりを提供します。つまり、マップファイルの情報を利用して、アプリケーションのアドレス空間へのより効率的な関数の読み込み順を見つけ出せれば、アプリケーションがメモリに占める割合を減らすことができます。そして、そのアプリケーションを新しい読み込み順にリンクすることで、より小さなテキストワーキングサイズで動作する実行可能ファイルを作成できます。
標本アナライザは、アプリケーションのアドレス空間へ関数をより効率的に読み込む順番を判断します。その後、アプリケーションを再リンクすることで、より小さなテキストワーキングサイズで動作する実行可能ファイルを作成できます。
以下の図に、基本的なパフォーマンスチューニングアーキテクチャを示します。
Sun WorkShop のデバッガに含まれるGUI (グラフィカルユーザーインタフェース) ツールの 1 つである標本コレクタは、アプリケーションの実行中にカーネルから動作のパフォーマンスデータを収集し、そのデータを実験レコードファイルに書き出します。ここでは、データを収集しながらアプリケーションを実行することを、実験と呼びます。
動作データを収集する前に、以下の指定が可能となります。
実験データを書き出すディレクトリおよびファイル名
データを標本化する時間
収集するデータの種類
標本コレクタは以下の情報を収集します。
アプリケーションについての統計情報
呼び出し先の関数の回数を含む場合と含まない場合の実行プロファイルデータ
プログラムのメモリ使用法データ
標本コレクタは標本としてデータを取り出し、それぞれの標本は実行のある部分を表します。標本アナライザはそうした標本の任意の組み合わせに対するデータをグラフィカルに表示します。
統計情報はつねに収集され、これには 2 種類のデータが含まれます。最初のデータは、さまざまな状況においてプログラムが費やした時間の統計情報であり、標本アナライザの初期画面に表示されます。これには、ユーザー時間、システム時間、システム待ち時間、テキストページ・フォルト時間、データページ・フォルト時間が含まれます。
2 番目の統計データは、標本アナライザの「実行統計」画面に表示され、こちらには、ページフォルトおよび I/O 情報、コンテキストスイッチ、さまざなまページ常駐 (ワーキングセットおよびページング) 情報が含まれます。
実行プロファイルは、アプリケーション実行中に、関数、モジュール、セグメントによってどのくらいの時間が消費されるかを示します。標本アナライザでは、ヒストグラム (呼び出し先の関数の回数が標本に含まれない場合) もしくは累積ヒストグラム (呼び出し先の関数の回数が標本に含まれる場合) として表示されます。
実行プロファイルデータは、以下の疑問に答えてくれます。
アプリケーションは、さまざまな関数、オブジェクトモジュール、セグメントの実行にどれくらいの時間を費やすか。
どの関数、モジュール、セグメントが一番多く、あるいは一番少なく時間を消費しているか。
呼び出し先の関数の回数が標本に含まれる場合、その関数によるほかの関数の呼び出しにどれくらい時間が費やされるか。
アドレス空間データは、処理アドレス空間を一連のセグメントとして表示し、各セグメントにはページ数が含まれます。このデータによって、標本アナライザは各ページの状態、そのページは参照されるか、あるいは変更されるかを表示できます。プログラムのメモリの使用状況データは、標本アナライザの「アドレス空間」表示画面に表示されます。
アドレス空間データは、以下の疑問に対する答えを導くヒントとなります。
メモリの使用状況はどのように変化するか。
アプリケーションはページを効率的に使用しているか。
特定のオペレーション中にどのページがアクセスされるか。
データの収集を開始する前に、以下の項目を確認してください。
プログラムは必ず「WorkShop デバッグ」ウィンドウに読み込んでおく。
実行時検査はオフにしておく。
データを収集するには、以下の手順に従ってください。
「デバッグ」ウィンドウで「ウィンドウ」メニューの「標本コレクタ」コマンドを選択し、「標本コレクタ」ウィンドウを開きます (図 2-2 参照) 。
1 回の実行に対してのみデータを収集するか、すべての実行に対してデータを収集するかを指定します。
1 回の実行に対してのみ標本コレクタを実行する場合、実験データが作成された後に、標本コレクタは終了します。一方、すべての実行に対して標本コレクタを実行する場合は、実験データの作成後も標本コレクタは終了せず、再び実行をすれば、実験データが追加記録されます。
標本コレクタをオンにしても、データ収集は始まりません。プログラムを「デバッグ」ウィンドウ上で開始すると、パフォーマンスデータは収集されます。
「実験ファイル」 テキストフィールドに実験ファイルのフルパスを入力します。
標本コレクタは、デフォルトの実験名として test.1.er と名付けます。.1.er を接尾辞として使用する場合、標本コレクタは自動的に数字の部分を1ずつ増やします (つまり、test.1.er の次は test.2.er となります)。
収集するデータを選択します。
統計情報データは常に収集されますが、実行された関数についての情報は収集されません。ほとんどのユーザーは実行された関数についての情報を必要とするので、「実行プロファイル情報」チェックボックスを選択してください。また、「実行プロファイル情報」には、呼び出された関数に費やされる時間を含めるかどうかも指定できます。ほとんどのユーザーは呼び出された関数に費やされた時間を含めることを望む場合が多く、そのためには、「呼び出し先の関数を含む」ラジオボタンを選択してください。
アプリケーションによるメモリの使用方法に関する情報が必要な場合は、「アドレス空間情報」チェックボックスも選択してください。
データは標本として収集され、それぞれがプログラムの実行時標本となります。デフォルトでは、標本は周期的に収集されます。「現行の標本収集を終了して、新規に開始」で「手動」ラジオボタンを選択している場合は、「新規標本」コマンドまたは 「新規標本」ボタンに応答する形でサンプリングは開始されます。また、標本を手動で収集するか、周期的に収集するかにかかわらず、プログラムがブレークポイントに到達すると、つねに追加の標本収集が開始されます。
「コレクタ」メニューの「開始」または「継続」をクリックすると、「デバッグ」ウィンドウでプログラムの実行が開始します。
「開始」は、プログラムの標本採取をコードの先頭から開始します。一方、「継続」は、プログラムの標本採取をコードの現在位置から開始します。
「コレクタ」メニュー |
プログラム標本収集を開始、プログラム標本収集を停止、標本アナライザを起動、標本コレクタを終了するためのコマンドを提供します。 |
「データ収集」 ラジオボタン |
標本コレクタをオフ、一回の実行のみオン、またはすべての実行においてオンにします。「一回の実行のみ」を選択している場合、実験データの作成後に、標本コレクタはオフとなります。「すべての実行で」を選択している場合は、実験データ作成後も標本コレクタは起動したままの状態となります。標本コレクタをオンにしても、データ収集は開始されません。パフォーマンスデータは、「デバッグ」ウィンドウ上でプログラムを実行した場合のみ収集されます。 |
「実験ファイル」 テキストフィールド |
実験ファイルのフルパスを入力します。パスはキーボードから入力することも、ファイルチューザから選択することも可能です。ファイルチューザを利用するには、テキストフィールドの右端の省略記号 (...) の付いたボタンをクリックしてください。 |
「アドレス空間情報」チェックボックス |
一連のセグメント (それぞれにはページ数が含まれます) として表されるプロセスのアドレス空間データを収集します。こうしたデータによって、標本アナライザは、各ページの状態、およびそのページが参照されたかまたは変更されたかどうかを示します。 |
「実行プロファイル情報」チェックボックス |
アプリケーション実行中に、関数、モジュール、セグメントによって費やされた時間についての情報を収集します。 |
「プロファイルデータ収集」 スライダ |
標本コレクタが 1 秒間にどれくらいの標本を収集するかを制御します。 |
「プロファイル時間」ラジオボタン |
標本データに呼び出し先の関数の回数を含めるかどうかを指定します。 |
「手動(「新規標本」コマンド使用)」 ラジオボタン |
「コレクタ」メニューの「新規標本」コマンドが選択されると、データを集計し、新しい標本収集を開始します。 |
「周期的に」 ラジオボタン |
「周期」スライダによって設定された間隔に従って、データを周期的に収集します (デフォルトは 1 秒です)。 |
「周期」スライダ |
データを周期的に収集する間隔を指定します。 |
標本コレクタがプロファイル PC およびコールスタックを記録する頻度は、1 秒あたりの回数として指定できます。その範囲は秒あたり 1〜100 サンプルとなります。
収集データの精度が落ちても、データ収集によるオーバーヘッドを少なくしたい場合は、頻度を低くします。
データ収集によるオーバーヘッドが増大しても、収集データの精度を上げたければ、頻度を高くします。
プロファイル収集の間隔を指定するには、「プロファイルデータ収集」スライダを動かして、秒あたりのサンプル回数を指定します。
標本コレクタは、以下に示す 3 つのポイントにさしかかると、1 つの標本に対するデータの収集を中断して、次の標本採取へと移ります。
ブレークポイント
「コレクタ」メニューの「新規標本」コマンドが選択された場合
ユーザーによって指定された秒数(周期)が経過した場合
データはコード中のブレークポイントにおいて常に集計されるので、どの位置にでもブレークポイントを設定すれば、データを自由に収集することができます。
アプリケーションが -g オプションによってコンパイルされている場合、収集したい情報に関係のあるコードの特定の位置にブレークポイントを設定できます。ブレークポイントは関数の最初、最後、およびコード中の任意の行に設定できます。
アプリケーションが -O オプションによってコンパイルされている場合、関数上にはブレークポイントを設定できますが、特定のソースコード行には設定できません。
「手動(「新規標本」コマンド使用)」ラジオボタンが選択されている場合は、コードにブレークポイントを設定しておかなくても、「コレクタ」メニューの「新規標本」コマンドによって、アプリケーションのどのポイントのデータでもチェックできます。ユーザーとアプリケーションとのインタラクション (メニューからコマンドを選択するまでの時間や、キーボードからコマンドを入力する時間など) を測りたい場合などには、便利な機能です。
「周期的に」ラジオボタンを選択しておけば、アプリケーションの実行を観察しながら動作データ標本を採取できるため、アプリケーションの動作を一定の規則に従って確認できます。「標本コレクタ」ウィンドウ下部の「周期」スライダを使うことで、標本コレクタが標本データを集計する間隔を設定できます。間隔は 1 〜 60 秒の範囲で指定できます。
標本アナライザは、アプリケーションのパフォーマンスを測り、記録し、解析します。また、アプリケーションのアドレス空間へ関数をより効率的に読み込む順序を示し、改良されたアプリケーションの再構築を助けます。
「実験ファイル」 メニュー |
実験データの読み込み、エクスポート、印刷、削除、およびマップファイルの作成を行なうためのコマンドを提供します。 |
「表示」メニュー |
データの選択、ソート、検索、表示を行なうためのコマンドを提供します。 |
「オプション」メニュー |
列の幅や棒グラフ名を変更するためのコマンドを提供します。 |
「ヘルプ」メニュー |
オンラインヘルプを提供します。 |
「データ」リストボックス |
解析対象となるパフォーマンスデータの種類を指定します。 |
「表示形式」リストボックス |
解析対象となるデータの表示方法を指定します。 |
「単位」ラジオボタン |
表示枠に表示するユニットの種類を選択します。 |
「平均」凡例 |
実験標本中に含まれる、パフォーマンスの問題箇所に費やされる時間の平均パーセンテージを表示します。 |
「標本」表示枠 |
収集されたデータの解析結果を視覚的に表示します。 |
「標本の範囲」テキストフィールド |
標本、標本収集範囲、表示されている標本の数、またはそのどれかが表示されます。このテキストボックスは編集可能です。 |
「矢印」ボタン |
クリックするごとに標本番号が 1 ずつ増加または減少し、実験の位置が移動し、各標本のプログラムの動作を確認できます。 |
「メッセージ」エリア |
現在の動作に関する情報が表示されます。 |
標本アナライザは、標本コレクタによって書き出された実験レコードを検証し、それを画面上にグラフィカルに表示します。er_export ユーティリティは実験レコードのデータを ASCII フォーマットへ変換し、er_print ユーティリティは現在表示されているデータをファイルまたはプリンタに出力します。これら 2 つのユーティリティは、「実験ファイル」メニューの「エクスポート」および「印刷」コマンドから起動されます。コマンド行から実行されることは、通常はありません。
実験結果は標本アナライザのオープン時に読み込むことも、あるいは標本アナライザをオープンした後であらためて読み込むことも可能です。デフォルトでは、実験データは 「概要」 表示画面で表示されますが、データの内容に応じて、「ヒストグラム」、「累計」、「アドレス空間」、「統計」 表示画面に切り替えることも可能です。
標本アナライザのオープン時に実験データを読み込むには、「標本アナライザ」ウィンドウが開いた時点で現れる「実験ファイルの読み込み」ダイアログボックスで実験データファイル名をダブルクリックします。
あるいは、「名前」フィールドに実験ファイルの名前を入力して、「了解」ボタンをクリックします。
標本アナライザがすでにオープンしている状態で、実験結果を読み込むには、以下の手順に従ってください。
標本アナライザでは、収集したデータの表示方法をさまざまに切り替えられます。アプリケーションのパフォーマンス改良に役立つようなデータの種類を指定できます。
「データ」リストボックスを使って、以下の表に示すデータの種類の中から 1 つを選択してください。
表 2-1 標本アナライザによる表示が可能なデータの種類
プロセス時間 |
処理状態の推移の集計 |
ユーザー時間 |
命令実行によってユーザープロセス状態に費やされる時間 |
システム待ち時間 |
処理がカーネルでスリープしている時間 (ただし、「中断」、「アイドル」、「ロック待ち」、 「テキストフォルト」、「データフォルト」状態は含まない) |
システム時間 |
オペレーティングシステムがシステムコールの実行に費やす時間 |
テキストページ・フォルト時間 |
テキストページでのフォルティングに費やされる時間 |
データページ・フォルト時間 |
データページでのフォルティングに費やされる時間 |
プログラムのサイズ |
アプリケーションの関数、モジュール、セグメントのサイズ(バイト)。「アドレス空間」データと組み合わせると、アプリケーションのサイズを確認し、必要なメモリ要件を確定できる |
アドレス空間 |
テキストページおよびデータページの両方の参照動作。 「プログラムのサイズ」データと組み合わせると、アプリケーションのサイズを確認し、必要なメモリ要件を確定できる。 |
実行統計 |
アプリケーション実行に関する包括的な統計情報 |
各種のデータは、その性質に合った表示画面でのみ表示できます。表 2-2 には、各データの種類と関連した表示形式を示します。
表 2-2 標本アナライザのデータの種類と対応する表示形式
データの種類 |
表示形式 |
---|---|
プロセス時間 |
概要 |
ユーザー時間 |
ヒストグラム、累計 |
システム待ち時間 |
ヒストグラム、累計 |
システム時間 |
ヒストグラム、累計 |
テキストページ・フォルト時間 |
ヒストグラム、累計 |
データページ・フォルト時間 |
ヒストグラム、累計 |
プログラムのサイズ |
ヒストグラム |
アドレス空間 |
アドレス空間 |
実行統計 |
統計 |
標本アナライザは、実際のデータの性質に応じて、各データの種類により 1 つか 2 つの表示形式を選択し関連付けます。
「表示」リストボックスを使って、表 2-3 に示す表示形式から 1 つを選択してください。
表 2-3 データの種類に対する標本アナライザの表示形式
概要 |
デフォルトの表示は、パフォーマンス動作のレベルの高い概要を提供する。 |
ヒストグラム |
関数、ファイル、読み込みオブジェクトの実行に費やした時間の合計 |
累計 |
関数、ファイル、読み込みオブジェクトの実行に費やした時間の累積合計。呼び出し関数、ファイル、セグメントに費やされた時間も含む |
アドレス空間 |
メモリの使用状況についての情報 |
統計 |
パフォーマンスおよびシステム資源の使用状況についての総合的なデータ |
「概要」表示画面では、アプリケーションが異なる処理状態において費やす時間の合計を各標本ごとに表示します (図 2-4 を参照)。標本コレクタはデータ収集処理中つねにこのデータを収集するため、実験結果が標本アナライザに読み込まれる際には、デフォルトとして「概要」表示画面が表示されます。
「概要」表示形式の特徴を以下に示します。
アプリケーションの高いレベルでのパフォーマンス動作の概要を提示する。
アプリケーションの実行時間が異なるパフォーマンス領域にどのように区分けされるかを提示することで、CPU、I/O、ページングなどのボトルネックを確認する手がかりを提供する。
実行中のアプリケーションのパフォーマンスの変化を提示する (たとえば、実行の最初の部分は I/O の境界内にあり、その後の部分が CPU の境界内にあるなど) 。
「概要」表示画面には、セグメント分けされたバーからなる、番号の付けられた標本のカラムが表示されます。各カラムは、実験中に収集された個々の標本を表しています。
各カラム内のセグメントは、異なるパフォーマンス領域を表しています。そして、各セグメントの高さは、各パフォーマンス領域に費やされた時間に比例しています。
それぞれのパフォーマンス領域を示すカラムの凡例は、実験データのすべてのカラム、およびほかの実験においても同じです。
透明なセグメント (表示画面の前景色と同じ色のセグメント) は、パフォーマンス領域が小さすぎて、表示できないことを示しています。透明なセグメントにどのパフォーマンス領域が含まれているかを確認するには、そのセグメントのカラムをクリックし、「表示」メニューの「詳細表示」を選択すると、「標本の詳細」ダイアログボックスが表示されます(図 2-5 を参照)。
「表示」メニューから「詳細表示」を選択すると、「標本の詳細」ダイアログボックスを表示できます。
このダイアログボックスのフィールドには、選択された標本についての以下の情報が含まれます。
表 2-4 「標本の詳細」ダイアログボックスのフィールド
標本 |
現在選択されている標本とそれらの実験におけるパーセンテージ |
開始時間 |
標本採取の開始時刻 |
終了時間 |
標本採取の終了時刻 |
経過時間 |
標本採取の期間 |
ユーザー |
アプリケーション命令実行に費やされた時間 |
システム |
オペレーティングシステムがシステムコール実行に費やした時間 |
トラップ |
トラップ (自動的な例外処理あるいはメモリのエラー) 実行に費やした時間 |
テキストフォルト |
テキストページでのフォルティングに費やされる時間 |
データフォルト |
データページでのフォルティングに費やされる時間 |
I/O |
プログラム I/O に費やされる時間 |
ロック待ち |
ライトウェイトプロセスロックが解放されるまでの待ち時間 |
スリープ |
プログラムがスリープに費やす時間 (「テキストフォルト」、「データフォルト」、「システム待ち」、「ロック待ち」以外の理由による) |
中断 |
サスペンドに費やされる時間 (ブレークポイントに到達した際に、デバッガで費やす時間も含む) |
アイドル |
アイドルに費やされる時間 |
パラメータ |
各標本用に収集されるデータパラメータの一覧 (実験の開始前に、標本コレクタにおいて設定します) |
「ヒストグラム」表示画面は、アプリケーションが関数、ファイル、読み込みオブジェクトの実行にどれくらいの時間を費やしたかを表示します。(図 2-6 を参照)
「ヒストグラム」表示画面オプションは、以下のデータの種類に対して利用できます。
ユーザー時間
システム待ち時間
システム時間
テキストページ・フォルト時間
データページ・フォルト時間
アプリケーションのパフォーマンスデータをコンパイル細分性のレベルごとに表示するには、以下の表に示すいずれかの単位を選択してください。
表 2-5 標本アナライザが使用する測定の表示単位
関数 |
アプリケーションが関数実行に費やす時間 |
ファイル |
ファイルレベル単位の実行に費やす時間。アプリケーションが多くの関数を持っている場合には、この表示方法は有用です。ひとつのソースファイルのすべてのデータが一緒に表示されます。 注意 : 実行対象の一部 (共有ライブラリを含む) が -g オプションによってコンパイルされていない場合、関数とその関数を含むファイルとの関連情報が足りない場合もあります。 |
ロードオブジェクト |
テキストセグメントの実行に費やす時間 |
「ヒストグラム」表示画面に含める標本は、以下の 3 通りの方法で選択できます。
「標本の範囲」テキストフィールドに標本番号を直接入力する。各番号はカンマで区切り (例 : 1,3,6)、範囲はハイフンによって指定 (例 : 1-6) する。
「概要」表示画面上で、対象となる標本が含まれるカラムを選択します。
「概要」表示画面上で、「表示」メニューから「すべてを選択」または「選択解除」を選択して、実験データの全標本を含めるかまたは除外します。
「ヒストグラム」表示画面に含めるセグメントを選択するには、「表示」メニューの 「ファイルから取り込むセグメント」コマンドを選択し、「ファイルから取り込むセグメント」ダイアログボックスを開きます。そして、任意のセグメントを選択し、「適用」ボタンをクリックするか、「すべてを選択」ボタンをクリックして全セグメントを選択します。
「ヒストグラム」 表示画面をソートするには、「表示」メニューの 「ソート基準」コマンドを選択し、「値」または「名前」を選択します。
特定の名前を検索するには、「表示」メニューの「検索」コマンドを選択し、「検索」ダイアログボックスを開きます。そして、検索文字列をテキストフィールドに入力し、「適用」ボタンをクリックします。
「累計」表示画面には、関数、ファイル、ロードオブジェクトによって費やされる総実行時間 (呼び出された関数、ファイル、セグメントに費やされる時間も含みます) が表示されます(図 2-7 を参照)。下位クラスの関数において累積された実行時間は、すべて親関数へと帰します。
「累計」表示画面は以下のデータの種類に対して利用できます。
ユーザー時間
システム待ち時間
システム時間
テキストページ・フォルト時間
データページ・フォルト時間
データをコンパイル細分性のレベルごとに表示するには、以下の表に示すいずれかの単位を選択してください。
表 2-6 標本アナライザが使用する測定の表示単位
関数 |
アプリケーションが関数実行に費やす時間 |
ファイル |
ファイルレベル単位の実行に費やす時間。アプリケーションが多くの関数を持っている場合には、この表示方法は有用です。ひとつのソースファイルのすべてのデータが一緒に表示されます。 注意 : 実行対象の一部 (共有ライブラリを含む) が -g オプションによってコンパイルされていない場合、関数とその関数を含むファイルとの関連情報が足りない場合もあります。 |
ロードオブジェクト |
テキストセグメントの実行に費やす時間 |
「累計」表示画面に含める標本は、以下の 3 通りの方法で選択できます。
「標本の範囲」テキストフィールドに標本番号を直接入力する。各番号はカンマで区切り (例 : 1,3,6) 、範囲はハイフンによって指定 (例 : 1-6) する。
「概要」表示画面上で、対象となる標本が含まれるカラムを選択します。
「概要」表示画面上で、「表示」メニューから「すべてを選択」または「選択解除」を選択して、実験データの全標本を含めるかまたは除外します。
「累計」表示画面に含めるセグメントを選択するには、「表示」メニューの 「ファイルから取り込むセグメント」コマンドを選択し、「ファイルから取り込むセグメント」ダイアログボックスを開きます。そして、任意のセグメントを選択し、「適用」ボタンをクリックするか、「すべてを選択」ボタンをクリックして全セグメントを選択します。
「累計」 表示画面をソートするには、「表示」メニューの 「ソート基準」コマンドを選択し、「値」または「名前」を選択します。
特定の名前を検索するには、「表示」メニューの「検索」コマンドを選択し、「検索」ダイアログボックスを開きます。そして、検索文字列をテキストフィールドに入力し、「適用」ボタンをクリックします。
「アドレス空間」表示画面によって、アプリケーションが最も集中的に利用するメモリ (修正および参照ページ) を示すことができます。また、実験がアプリケーションのすべての関数を試すわけではないため、あるいは、アプリケーションに無駄なコードやメモリ割り当ての問題などが含まれているなどの理由から、未使用となっているメモリも識別します。
「アドレス空間」表示画面形式は、アドレス空間データを収集する場合のみ、データを提示します。アドレス空間データが収集されていない場合、標本アナライザ画面の下部にその旨を告げるメッセージが表示されます。
「アドレス空間」表示画面では、アプリケーションが使用するメモリを以下のカテゴリに分類しています。
表 2-7 標本アナライザが表示するメモリのカテゴリ
変更 |
アプリケーションの実行中に書き込まれるページ。参照されることも、参照されないこともある。 |
参照 |
アプリケーションに読み取られるページあるいはアプリケーションによって実行される命令を含むページ |
参照なし |
アプリケーションによって変更も参照もされないページ |
「アドレス空間」表示画面は、個々の正方形 (ページ) または長方形 (セグメント) からなる列と行とで構成されます。そして、列と行にはメモリ内のアドレスを示す番号が付けられています。空白部分は、アプリケーションが使用しないアドレス空間の領域を表しています。
SunOS は 4 K バイトあるいは 8 K バイトのページを使用します。ページのアドレスは 0x1000 (16 進数で表す 4 Kバイト) または 0x2000 (16 進数で表す 8 Kバイト) の倍数です。
システムのページサイズを確認するには、プロンプトから次のように入力してください。
% pagesize
この pagesize コマンドはページサイズをバイト単位で返します。
4096 (4 K バイトページ)
8192 (8 K バイトページ)
ページサイズが 4 Kバイトの場合、行当たりのページ数は 16 です。ページサイズが 8 K バイトの場合、行当たりのページ数は 8 です。
ページを含む行と列の 16 進数値を組み合わせることで、そのページのアドレスを知ることができます。たとえば、確認中のページが第 4 行 (0004__00) 、第 2 列 (20) にあるなら、そのページのアドレスは 00042000 となります。
「アドレス空間」表示画面において、メモリ単位を異なる細分性レベルで表示するには、「表示形式」領域で「ページ」または「セグメント」を選択します。
選択されたページおよびセグメントには影が付けられ、浮き出して表示されます。選択したページ上でマウスの左ボタンを押し続けると、そのページを含むセグメントも表示され、影が付けられます。同様に、選択したセグメント上でマウスの左ボタンを押し続けると、そのセグメント内に含まれるページが表示され、選択されます。
選択したページまたはセグメントのプロパティに関する情報を表示するには、「表示」メニューの「詳細表示」コマンドを選択し、以下の情報を含む「ページ属性」ダイアログボックスを開きます。
アドレス
バイト単位のページサイズまたはセグメント範囲サイズ
そのページまはたセグメントに含まれる関数
セグメント名
「アドレス空間」表示画面に含める標本は、以下の 3 通りの方法で選択できます。
「標本の範囲」テキストフィールドに標本番号を直接入力する。各番号はカンマ で区切り (例 : 1,3,6)、範囲はハイフンによって指定 (例 : 1-6) する。
「概要」表示画面上で、対象となる標本が含まれるカラムを選択する。
「概要」表示画面上で、「表示」メニューから「すべてを選択」または「選択解除」を選択して、実験データの全標本を含めるかまたは除外する。
「統計」表示画面には、アプリケーションの全体的なパフォーマンスおよびシステム資源利用方法などのデータが表示されます (図 2-9 を参照) 。一方、「ヒストグラム」、「累計」、「アドレス空間」表示形式は、関数やページなどのプログラムコンポーネントごとに区分けされたデータを提示します。「統計」表示画面が提供する情報は、予想した見積りと実際の数値とを比較したい場合などに便利です。
「統計」表示画面の生成に必要な情報は、データの収集処理中、常時標本コレクタによって生成されるため、この表示画面に情報を表示するために、特別なデータの種類を指定する必要はありません。「統計」表示画面には、以下の情報が表示されます。
表 2-8 標本アナライザの「統計」表示画面に表示される情報
副ページフォルト数 |
物理的な I/O 活動を必要としないページフォルトの数 |
主ページフォルト数 |
物理的な I/O 活動を必要とするページフォルトの数 (数が非ゼロの場合、「概要」表示画面には、テキストページあるいはデータページフォルトの待ち時間が表示されます) |
プロセススワップ数 |
処理がメインメモリ外にスワップされる回数 |
入力ブロック数 |
非キャラクタあるいは特殊ファイル上でシステムコール read( ) が実行される回数 |
出力ブロック数 |
非キャラクタあるいは特殊ファイル上でシステムコール write( ) が実行される回数 |
送信メッセージ数 |
ソケットを越えて送信されるメッセージ数 |
受信メッセージ数 |
ソケットから受信されるメッセージ数 |
処置されたシグナル数 |
配信または受信されるシグナル数 |
自発的コンテキストスイッチ数 |
分配された時間が完了する前に、処理が自発的にプロセッサを放棄して、利用可能な資源を待つために起こるコンテキストスイッチの回数 |
非自発的コンテキストスイッチ数 |
優先順位がより高い処理が実行可能になるか、現在の処理が分配された時間を超過してしまったために起こるコンテキストスイッチの回数 |
システムコール数 |
システムコールの総数 |
I/O 文字数 |
読み取りおよび書き込みコールによって、キャラクタデバイスまたはファイル間で転送されるキャラクタ数 |
ワーキングセット合計サイズ(ページ) |
アドレス空間の総サイズ (ページ単位) |
ワーキングセット最大サイズ(ページ/標本) |
アドレス空間の最大サイズ (標本あたりのページ数) |
ワーキングセット最小サイズ(ページ/標本) |
アドレス空間の最小サイズ (標本あたりのページ数) |
ワーキングセット平均サイズ(ページ/秒) |
アドレス空間の平均サイズ (標本あたりのページ数) |
テキストのワーキングセット合計サイズ(ページ) |
テキストアドレス空間の総サイズ (ページ単位) |
テキストのワーキングセット最大サイズ(ページ/標本) |
テキストアドレス空間の最大サイズ (標本あたりのページ数) |
テキストのワーキングセット最小サイズ(ページ/標本) |
テキストアドレス空間の最小サイズ (標本あたりのページ数) |
テキストのワーキングセット平均サイズ(ページ/秒) |
テキストアドレス空間の平均サイズ (標本あたりのページ数) |
非テキストのワーキングセット合計サイズ(ページ) |
非テキストアドレス空間の総サイズ (ページ単位) |
非テキストのワーキングセット最大サイズ(ページ/標本) |
非テキストアドレス空間の最大サイズ (標本あたりのページ数) |
非テキストのワーキングセット最小サイズ(ページ/標本) |
非テキストアドレス空間の最小サイズ (標本あたりのページ数) |
非テキストのワーキングセット平均サイズ(ページ/秒) |
非テキストアドレス空間の平均サイズ (標本あたりのページ数) |
アドレス空間データが収集されている場合のみ、ワークセットサイズは非ゼロになります。
「統計」表示画面に含める標本は、以下の 3 通りの方法で選択できます。
「標本の範囲」テキストフィールドに標本番号を直接入力する。各番号はカンマで区切り (例 : 1,3,6)、範囲はハイフンによって指定 (例 : 1-6)する。
「概要」表示画面上で、対象となる標本が含まれるカラムを選択する。
「概要」表示画面上で、「表示」メニューから「すべてを選択」または 「選択解除」を選択して、実験データの全標本を含めるかまたは除外する。
テキストページフォルトが実行時間の大部分を占める場合は(その場合のみ)、アプリケーションの再配置をすることもできます。
動作データが収集された後、標本アナライザを使って、関数の並び順が改良されたマップファイルを生成できます。-M オプションはそのマップファイルをリンカーに渡し、リンカーはアプリケーションを再リンクし、より小さなテキストアドレス空間を持った新しい実行可能なアプリケーションを生成します。
アプリケーションの再配置を行った後は、新しい実験を実行し、オリジナルのバージョンと再配置後のバージョンとを比較できます。
アプリケーションの再配置を行うには、以下の手順に従ってください。
アプリケーションを -xF オプションを使ってコンパイルします。
-xF オプションは、再配置のために必要です。このオプションによって、コンパイラは、個別に再配置が可能な関数を生成します。
C アプリケーションに対しては、以下のコマンドを入力してください。
cc -xF -c a.c b.c
cc -o application_name a.o b.o
C++ アプリケーションに対しては、以下のコマンドを入力してください。
CC -xF -c a.cc b.cc
CC -o application_name a.o b.o
Fortran アプリケーションに対しては、以下のコマンドを入力してください。
f77 -xF -c a.f b.f
f77 -o application_name a.o b.o
以下の警告メッセージが表示される場合、非共有オブジェクトやライブラリファイルなど、静的にリンクされているファイルをチェックしてください。これらのファイルが -xF オプションによってコンパイルされていない可能性があります。
ld: warning: mapfile: text: .text% function_name:
object_file_name:
Entrance criteria not met the named file, function_name, has not been compiled with the -xF option.
デバッグのためにアプリケーションを Sun WorkShop へ読み込みます。
「デバッグ」ウィンドウの「ウィンドウ」メニューから「標本コレクタ」を選択して、標本コレクタをアクティブにし、パフォーマンスデータを収集します。 アドレス空間情報の収集も必ず可能にしておきます。
アプリケーションをデバッガ内で実行します。
指定された実験データを標本アナライザへ読み込みます。
「実験ファイル」メニューから「マップファイル作成」を選択し、標本アナライザで再配置マップを作成します。使用する標本、マップファイルディレクトリ、生成するマップファイル名を指定し、「了解」をクリックします。
マップファイルには、関連するユーザー CPU 時間を持った関数名が含まれます。プロファイリングデータとファンクションサイズを降順にソートすることで、テキストアドレス空間サイズを縮小するための関数の並び順を指定します。マップファイルにリストされないすべての関数は、リストされた関数の後ろに配置されます。
新しいマップファイルを使ってアプリケーションをリンクします。
C アプリケーションに対しては、以下のコマンドを入力してください。
cc -M mapfile_name a.o b.o
C++ アプリケーションに対しては、以下のコマンドを入力してください。
CC -M mapfile_name a.o b.o
C アプリケーションに対しては、-M オプションの使用により、コンパイラが -M mapfile_name をリンカーに渡します。
Fortran アプリケーションに対しては、以下のコマンドを入力してください。
f77 -M mapfile_name a.o b.o
標本アナライザでは、複数の表示画面に同時にデータを表示できるため、実験データの標本を比較することが可能です。複数の表示画面によって、以下の操作が可能となります。
異なる標本セットを同じ表示画面形式で表示する。たとえば、標本 8 と標本 11 の「ヒストグラム」表示画面を比較できる。
1 つの標本セットを異なる表示画面形式で表示する。たとえば、標本 1-6 を「ヒストグラム」表示画面に表示する一方、もう 1 つのウィンドウでは同じ標本を「累計」表示画面で表示できる。
異なる実験データの標本を比較する。
複数の表示画面を表示するには、以下の手順に従ってください。
「表示」メニューの「新規ウィンドウ」を選択し、「アナライザ」ウィンドウをもう 1 つオープンします。
新しい「アナライザ」ウィンドウで、データの種類、表示形式、比較する標本を選択するか、ほかの実験データを読み込みます。
新しいウィンドウは、すでにオープンしている 1 つ目の「アナライザ」ウィンドウの設定を継承しません。新しいウィンドウには、つねにデフォルトの設定が適用されます。また、オリジナルの「アナライザ」ウィンドウを閉じたり、終了したりすると、そのウィンドウからオープンしたすべてのウィンドウが閉じられます。
実験の記録を保存したければ、実験データをプリンタまたはファイルに出力できます。標本アナライザでは、以下の項目を印刷できます。
現在の表示画面のプレーンテキストバージョン
各データの種類ごとの平均標本回数や、関数、モジュール、セグメントが使用された頻度を提示する実験データのテキスト要約。
現在の表示画面のプレーンテキストバージョンを印刷するには、以下の手順に従ってください。
「実験ファイル」メニューの「印刷」を選択し、「印刷」ダイアログボックスを開きます。
データをプリンタで印刷するか、ファイルに出力するかを選択し、必要ならば、プリンタ名、用紙サイズなどを指定します。
「印刷」をクリックします。
実験結果のプレーンテキスト要約を印刷するには、以下の手順に従ってください。
「実験ファイル」メニューの「要約を印刷」を選択します。
要約データをプリンタで印刷するか、ファイルに出力するかを選択し、必要ならば、プリンタ名、用紙サイズなどを指定します。
「印刷」をクリックします。
標本アナライザでは、実験データをほかのプログラムで利用できるように、ASCII ファイルへエクスポートできます。
実験データを ASCII ファイルにエクスポートするには、以下の手順に従ってください。