Sun(TM) ONE Studio 8: プログラムパフォーマンス解析ツール Readme
Description: Sun(TM) ONE Studio 8 README
Keywords: readme, documentation, publication,

更新日付: 2003 年 3 月 28 日

### Sun[tm] ONE Studio 8: プログラムパフォーマンス解析ツール Readme

> #### 目次

> 1. はじめに
> 2. IDE からアナライザを開始する
> 3. Sun[tm] ONE Studio 8 プログラムパフォーマンス解析ツールについて
> 4. 新規および変更された機能
> 5. ソフトウェアの修正事項
> 6. 問題点と回避策
> 7. 制限事項と互換性の問題
> 8. 記述の誤りの訂正
> 9. 必要なパッチ

> #### A. はじめに

> この文書には、Sun[tm] Open Net Environment (Sun ONE) Studio 8, Compiler Collection のプログラムパフォーマンス解析ツールに関する情報が含まれています。これらのツールには、プログラムパフォーマンスデータの収集、操作を行うコマンドと、パフォーマンスデータを表示するためのグラフィカルユーザーインタフェース (パフォーマンスアナライザ)、およびコマンド行インタフェース (`er_print`) が含まれています。本書で使用するコレクタという用語は、パフォーマンスデータを収集するツール群とそれらの基本ライブラリを総称しています。これらのツールとは、`collect` コマンド、`dbx collector` サブコマンド、IDE のパフォーマンスデータ収集機能です。

> この文章では、このリリースで導入された新機能とソフトウェアの修正事項、既知の問題点、制限事項、互換性の問題について説明しています。また、本書の記載内容はソフトウェアマニュアルの情報を更新または補充します。

> 製品マニュアル
> - リリースノート: これらのリリースノートは `http://docs.sun.com/` で参照することも可能です。リリースノートの情報は、各製品の Readme ファイルの情報に優先します。
> - Compiler Collection のマニュアル: この製品のマニュアルページ、Readme の HTML 版、およびマニュアルは、 `/opt/SUNWspro/docs/ja/index.html` から参照できます。
> - Compiler Collection の開発者リソースポータル: Compiler Collection のドキュメントは、Compiler Collection の開発者リソースポータルで マニュアル索引 を参照してください。このポータルには、技術的なトピックおよび知識ベースの項目も含まれています。

> 注意 - ご使用の Compiler Collection がデフォルトの `/opt` 以外のディレクトリにインストールされている場合は、システム管理者に実際の環境パスを問い合わせてください。

> 注意 - この文書では、「Java 仮想マシン」および「JVM」は、Java[tm] プラットフォーム対応の仮想マシンを指しています。

> #### B. IDE からアナライザを開始する

> IDE からパフォーマンスアナライザを開始するには、次のいずれかの処理を行います。
> - メニューバーから「デバッグ」 -> 「パフォーマンスツールキット」 -> 「アナライザを実行」を選択します。 このオプションを選択すると、収集された最新の実験が読み込まれます。
> - エクスプローラの「ファイルシステム」タブで実験をダブルクリックします。

> 注: IDE は、Sun[tm] ONE Studio 4 update 1, Enterprise Edition for Java[tm] の一部として含まれています。

> #### C. プログラムパフォーマンス解析ツールについて

> Sun[tm] ONE Studio 8 プログラムパフォーマンス解析ツールの本リリースは、Solaris[tm] オペレーティング環境 (SPARC® Platform Edition) バージョン 7、8、9、および Solaris オペレーティング環境 (x86 Platform Edition) バージョン 7、8、9 で使用できます。 IDE は、Sun ONE Studio 4 update 1, Enterprise Edition for Java[tm] の一部として含まれており、Solaris オペレーティング環境 (SPARC Platform Edition) バージョン 8 および 9 で使用できます。GUI を使用するには、 Sun[tm] ONE Studio 4 update 1 のライセンスが必要です。 必要なライセンスをインストールする方法については、『Compiler Collection IDE オプション README』を参照してください。

> プログラムパフォーマンス解析ツールは、プログラムのパフォーマンス統計プロファイルを収集し、重要なライブラリルーチンの呼び出しをトレースし、表や図形を使ってそれらのデータを表示します。収集されたデータは、パフォーマンスメトリックに変換されます。メトリックは、ロードオブジェクト、関数、ソース行、命令レベルのいずれかで表形式で表示されます。これらのツールは、プログラム構造をナビゲートできるので、リソースの使用法、非効率性、遅延などに影響のあるコード内の関数やパスの識別に役立ちます。パフォーマンスアナライザ GUI では、タイムラインディスプレイにパフォーマンスデータを表示することもできます。

> Sun[tm] ONE Studio Collector の本リリースでは、ベースとなる JVM (Java 仮想マシン) のサポートを使用して、Java[tm] プログラミング言語で記述されているアプリケーションをプロファイルすることができます。JVM[tm] バージョン 1.4.x にはこのサポートが含まれていますが、実験の段階によっては、JVM の将来的なリリースで変更される可能性があります。 Sun ONE Studio Collector の本リリースを、JVM の将来的なリリースで使用すると、Sun ONE Studio Collector で、Java プログラミング言語で記述されたアプリケーションのプロファイリング情報を収集できないことがあります。 Sun では、Sun ONE Studio Collector の将来的なリリースで、JVM プロファイリングテクノロジの変更に伴う Java プロファイリングをサポートできると考えています。

> #### D. 新規および変更された機能

> ここでは、Sun[tm] ONE Studio 7 (Forte[tm] Developer 7) リリース以降、パフォーマンスツールに追加された新機能および変更された機能について説明します。

> ##### データ収集機能

> 以下の一覧は、新たに追加または変更されたデータ収集機能の説明です。

> - 同期遅延のトレース、およびメモリー割り当てのトレースだけでなく、時間ベースおよび HW カウンタプロファイリングに対して Java[tm] プログラミング言語が、完全にサポートされました。 データは、ターゲットのマシン表現、および Java 表現の両方に対して収集されます。 libcollector に対する Java API が提供されます。

> - 時間ベースのプロファイリングは、より高度な分解能のクロックをサポートする Solaris[tm] オペレーティング環境のバージョンでの、複数のシステムクロックの分解能に制限されなくなりました。ユーザーが引数を指定せずに `collect` コマンドを使用した場合は、サポートされているプロファイリング間隔の範囲が返されます。

> - `collect` コマンドの `-A` オプションまたは `dbx collector archive` コマンドを使用して、ロードオブジェクトの保管を制御することができます。

> - 個々のスレッドに対してデータ収集を一時停止および継続するための API が提供されました。

> - データ収集におけるエラー検出とレポートの機能が強化されました。

> - プログラムの動作に影響されないハードウェアカウンタでは、擬似関数に対してプロファイルがレポートされます。

> - メモリーアクセスイベントをカウントするハードウェアカウンタでは、カウンタ名の先頭に「+」を付加すると、コレクタによってアグレッシブなバックトラッキングが有効になります。 イベントをトリガーした PC と仮想アドレスを記録し、データオブジェクトのメモリー動作をレポートおよび表示できるようにします (C 言語のみ)。

> - libthread.so を使用して、明示的または暗黙的にマルチスレッドになっているアプリケーションから実験を収集する場合には、Solaris[tm] 9 オペレーティング環境または Solaris[tm] 8 オペレーティング環境で代替 libthread ライブラリ (`/usr/lib/lwp/libthread.so` または `/usr/lib/lwp/64/libthread.so`) を使用することをお薦めします。Solaris 7[tm] オペレーティング環境または Solaris[tm] 8 オペレーティング環境でデフォルトの libthread ライブラリを使用すると、警告が出て、データが誤認識される可能性があることが示されます。

> 詳しくは、マニュアルページ `collect`(1)、`collector`(1)、および `libcollector`(3) を参照してください。

> ##### データ表現機能

> - パフォーマンスアナライザおよび `er_print` に CPU によるフィルタリング機能が追加されました。Solaris[tm] バージョン 9 より前のオペレーティング環境からは、CPU の識別情報は記録できません。 この機能は、`er_print` コマンドの `cpu_select` および `cpu_list` で実装されています。

> - パフォーマンスツールは、メトリック値によって順序付けされた一覧形式でソース行および PC を表示します。これらの一覧は、パフォーマンスアナライザの「行」タブおよび「PC」タブに示され、`er_print` では `lines` および `pcs` コマンドを使用して生成されます。パフォーマンスアナライザの「概要」タブには、選択したソース行のメトリックがすべて表示されます。`lsummary` および `psummary` コマンドを使用した `er_print` では、行および PC の概要パネルが表示されます。

> - 「タイムラインオプション」ダイアログボックスは、「タイムライン」タブとして「データ表示方法の設定」ダイアログボックスに統合されました。

> - 「タイムライン」タブに、LWP、スレッド、または CPU に対するデータバーを表示することができます。これらの 3 つのいずれかについてデータを表示するには、「データ表示方法の設定」ダイアログボックスの「タイムライン」タブを使用します。

> - 「タイムライン」タブの呼び出しスタックを、ルート関数またはリーフ関数上に配置することができます。また、可視フレームの数を設定することができます。「データ表示方法の設定」ダイアログボックスの「タイムライン」タブを使用して選択します。

> - 関数の他に、ソース行と PC の情報が取り込めるよう、オブジェクトの選択が拡張されました。選択したオブジェクトはメニューバーに表示され、そのメトリックは「概要」タブに表示されます。選択したオブジェクトは、他のタブへナビゲートしたときに表示されます。特に、ソースまたは逆アセンブリに切り替えると、選択した関数の先頭行または命令に必ず位置付けされるのではなく、選択した行または命令に位置付けされます。

> - 「実験ファイルの追加」または「実験を開く」ダイアログで実験をクリックして、実験をプレビューすることができます。選択した実験の説明は、ダイアログの右側のパネルに表示されます。

> - 派生プロセスの試験結果は、親プロセスの試験結果が読み込まれたときに自動的に読み込まれますが、そのデータを表示することはできません。派生プロセスの試験結果についてデータを表示するには、パフォーマンスアナライザの「データをフィルタ」ダイアログボックスを使用するか、または `er_print` で `sample_select` コマンドを使用します。

> - 「リーク一覧」タブには、リークおよび割り当てデータがグラフィカルに表示され、リークまたは割り当ての呼び出しスタックと、その呼び出しスタックの関数のソースまたは逆アセンブリとの間をナビゲートすることができます。

> - アグレッシブなバックトラッキング (記録の際にカウンタ名の前に + 記号を付ける) で記録された HW カウンタの実験では、データオブジェクトに関するレポート、およびアナライザの新しい「データオブジェクト」タブを表示することができます。このタブは、`er.rc` ファイルの `datamode on` レコードによって、または「データ表示方法の設定」ダイアログから有効にすることができます。

> - Java [tm] プログラミング言語で記述されたアプリケーションの実験は、"on"、"expert" または "off" に設定された Java モードで使用することができます。

> - アナライザおよび `er_print` は、実行可能ファイル、オブジェクト、およびソースファイルへのパスをマッピングする方法をサポートしています。後述の「ソースおよびオブジェクトファイルの検索」を参照してください。

> - アナライザおよび `er_print` で、エラー検出とレポートの機能が改良されました。

> 詳しくは、マニュアルページ `analyzer`(1) と `er_print`(1)、およびパフォーマンスアナライザオンラインヘルプを参照してください。

> #### E. ソフトウェアの修正事項

> Forte[tm] Developer 7 の以下の問題点は修正されました。

> 1. Java[tm] プログラミング言語で記述されたマルチスレッドのアプリケーションで、プロファイリングが失敗することがある

> 2. `LD_PRELOAD` および `LD_AUDIT` の `_32` または `_64` ビット派生環境変数が設定されていると、欠陥のある実験が生成される

> 3. 収集関数の MPI 時間の値が大きすぎる

> 4. 同じ実験の実装を何度も再ロードするとコアダンプが発生する

> 5. 32 個を超える CPU に対するスケーラビリティの低下

> 1. ##### Java[tm] プログラミング言語で記述されたマルチスレッドのアプリケーションでプロファイリングが失敗することがある

>    Java プログラミング言語で記述されたマルチスレッドのアプリケーションに記録されている実験を読み込むときに、パフォーマンスアナライザと `er_print` が失敗することがあります。 実験のデータは正しく記録されません。(4649137)

> 2. ##### `LD_PRELOAD` および `LD_AUDIT` の `_32` または `_64` ビット派生環境変数が設定されていると、欠陥のある実験が生成される

>    `collect` コマンドは、`LD_PRELOAD_32`、`LD_PRELOAD_64`、`LD_AUDIT_32`、または `LD_AUDIT_64` の環境変数のいずれかが設定されていると、空の実験を生成します。 この問題を回避するには、データ収集に`dbx collector`コマンドを使用します。

>    この問題は、パッチ 111705-01 を適用することで、すでに修正しています。

> 3. ##### 収集関数の MPI 時間の値が大きすぎる

>    収集処理の MPI 時間が、収集のメンバー数のファクタによって実際より多くカウントされます。 (4811269)

> 4. ##### 同じ実験を何度も再ロードするとコアダンプが発生する

>    同じ実験を何度も再ロードすると、アナライザでコアダンプが発生します (4748944)

> 5. ##### 32 個を超える CPU に対するスケーラビリティの低下

>    32 個以上の CPU またはスレッドを使用するアプリケーションでは、パフォーマンスデータの収集中に処理速度が急激に低下することがあります。 (4273174, 4304367)

> #### F. 問題点と回避策

> ここでは、これまでにわかっているソフトウェアの問題点とその回避策について説明します。一部の問題は、パッチで修正することができます。 更新情報については、 `http://sun.co.jp/software/sundev/suncc/hotnews.html` のアップデート情報を参照してください。

> 一部の問題は、Solaris[tm] オペレーティング環境のバグが問題であり、これは該当するパッチをインストールすることで解消できます。詳しくは、Readme の「必要なパッチ」の節を参照してください。また、バグの中には、アナライザの問題のように見えて、実際にはコレクタの問題であるものも存在します。コンパイラや `dbx` のバグもアナライザに影響します。 バグが原因ではない問題についても、ここで説明します。

> - パフォーマンスツールのバグ

> - Solaris[tm] オペレーティング環境のパッチで訂正できる問題

> - その他の問題

> ##### パフォーマンスツールのバグ

> 1. Java[tm] 仮想マシンで Java プロファイリングがクラッシュすることがある

> 2. Java 同期化およびヒープトレースでパフォーマンス上の問題がある

> 3. `dbx` における Java プロファイルがサポートされていない

> 4. Intel プラットフォームで Java プロファイルが失敗することがある

> 5. さなざまな処理で Java プロファイルのデータが失われることがある

> 6. パフォーマンスアナライザは 2G バイト以上のデータを扱えない

> 7. 「概要」または「イベント」タブのデータを出力できない

> 8. 並列の指令行ではメトリックが二重にカウントされる

> 9. 共有されているいくつかのオブジェクトでデータが破棄される

> 10. 複数の実験について、`<選択されている実験の合計>` の統計が誤っている

> 1. ##### Java[tm] 仮想マシンで Java プロファイリングがクラッシュすることがある

>    リリース 1.4.2 のベータ版より前の JVM[tm] マシンを使用している Java プロファイリングは、Java の バグが原因でクラッシュすることがあります。また、それ以降の JVM[tm] マシンでもクラッシュすることがあります (Java プログラミング言語のバグ 4757672、4762958、4763610、4808151、4812196)

> 2. ##### Java 同期化およびヒープトレースでパフォーマンスの問題がある

>    Java 同期化およびヒープトレースで、(特にヒープトレースで大容量の実験を処理する場合には) パフォーマンス上の問題があります。

> 3. ##### `dbx` における Java プロファイリングがサポートされていない

>    `dbx` コレクタを使用した Java プロファイリング、または SunONEStudio IDE のコレクタのグラフィカルインタフェースを使用した Java プロファイリングは、まだサポートされていません (4771337)

> 4. ##### Intel プラットフォームの Java プロファイリングが失敗することがある

>    Intel プラットフォームにおいて Java モードでデータ収集を行うと、データ収集が失敗することがあります。これは、JVM [tm] ソフトウェアの必要な関数に明確な不具合があるためです (Java プログラミング言語のバグ 4505739)

> 5. ##### さまざまな処理で Java プロファイリングのデータが失われることがある

>    ガベージコレクション、 `system.*` メソッドのコール時、モニター待ちのとき、およびその他にもさまざまタイミングで、データ収集のデータが失われることがあります。 JVM[tm] は、これらのタイミングでは Java スタックを解放しません (4824989、4762954)

> 6. ##### パフォーマンスアナライザで 2G バイト以上のデータを扱えない

>    パフォーマンスアナライザは約 2G バイト以上のデータを読み取って処理することができません。`er_print` を使用すると、全体のデータサイズが 2G バイトを超える 1 つまたは複数の実験を解析できます。その他に、収集パラメータを制御して記録するデータを減らしたり、プログラム全体ではなく一部分に関してのみデータを収集したり、データ制限を設定するなどの回避策があります。詳しくは、`collect`(1)、`collector`(1)、`libcollector`(3) マニュアルページ、および『プログラムパフォーマンスの解析』マニュアルを参照してください。 (4505739)

> 7. ##### 「概要」タブまたは「イベント」タブのデータを出力できない

>    パフォーマンスアナライザは「概要」タブまたは「イベント」タブのデータを出力できません。関数またはロードオブジェクトの概要データを出力するには、`er_print` コマンドを使用します。(4286674)

> 8. ##### 並列の指令行ではメトリックが二重にカウントされる

>    注釈付きソースコードにおける並列化コンパイラ指令行について報告されるメトリックが、二重にカウントされます。コードの並列 do、for、または section ブロックのソース行に関するメトリックは正しくカウントされます。関数レベルでの二重カウントエラーも発生することがあります。(4656193)

> 9. ##### 共有されているいくつかのオブジェクトでデータが破棄される

>    同じ環境のもとで、アナライザは誤って、共有している 2 つのオブジェクトがオーバーラップしているとみなして、最初に記録されているオブジェクトからデータを破棄することがあります。 アナライザは、共有オブジェクトのテキストおよびデータセグメントが隣接してマップされていると仮定しますが、隣接していない場合もあります (4819207)。

> 10. ##### 複数の実験で、`<選択されている実験の合計>` の統計が誤っている

>     複数の実験を読み込んだときに、`<選択されている実験の合計>` の統計が間違っています (4834122)。ただし、個別の実験の統計データは正しくなります。

> ##### Solaris[tm] オペレーティング環境のパッチで訂正できる問題

> 以下の問題は、Solaris[tm] オペレーティング環境に適切なパッチをインストールすることによって解決できます。Readme の「必要なパッチ」の節も参照してください。

> 1. ハードウェアカウンタのプロファイリングでアプリケーションがクラッシュする

> 2. LWP のクロック関係のプロファイルデータの消失

> 3. ハードウェアカウンタのプロファイル割り込みの消失

> 4. 負荷がかかっているシステムのクロックベースのプロファイリングが不正確

> 1. ##### ハードウェアカウンタのプロファイリングでアプリケーションがクラッシュする

>    特定の環境では、HW カウンタのプロファイリングの割り込みによって、UltraSPARC-III プロセッサにおける OS のバグが発生します。このバグによって、`%y` レジスタが壊れることがあります。その時点でレジスタが有効になっていると、アプリケーションがクラッシュすることがあります。 この問題は、Solaris[tm] 8, HW2 update、および Solaris[tm] 9, update 4 で解決されています。 この問題は、プロファイリングの分解能を低くしたり、1 つのカウンタのみを使用したりすることによって、発生の頻度が減少します (4793905)

> 2. ##### LWP のクロック関係のプロファイルデータの消失

>    1 つまたは複数の LWP に対するプロファイリング割り込み (`SIGPROF`) が失われる可能性があります。 この問題は、結合スレッドを使用することで回避できます。また、Solaris[tm] 8 オペレーティング環境であれば、`/usr/lib/lwp` の代替スレッドライブラリを使用して回避できます。代替スレッドライブラリは、非結合スレッド API がサポートされていても結合スレッドを使用します。(4352643)

> 3. ##### ハードウェアカウンタのプロファイル割り込みの消失

>    非結合スレッドとともにプログラムを実行すると、ハードウェアカウンタのオーバーフロー (`SIGEMT`) からの割り込みが失われて、回復不可能になることがあります。この問題は、結合スレッドを使用することで回避できます。また、Solaris[tm] 8 オペレーティング環境であれば、`/usr/lib/lwp` の代替スレッドライブラリを使用して回避できます。代替スレッドライブラリは、非結合スレッド API がサポートされていても結合スレッドを使用します。(4352643)

> 4. ##### 負荷がかかっているシステムのクロックベースのプロファイリングが不正確

>    システムに負荷がかかっているときにアプリケーションをプロファイリングすると、ユーザーの CPU 使用時間が実際よりかなり (最大で 20 パーセントまで) 少なく計測されます。 測されなかったユーザーの CPU 使用時間は、システムの CPU 使用時間または CPU の待ち時間とみなされます。(4509116)

> ##### その他の問題

> 1. シグナルハンドラをインストールするアプリケーションで動作が変わる

> 2. `dbx`がプロセスに接続されたときにデータ収集に問題が発生する

> 3. 統計表示と標本の待ち CPU メトリックの値が正しくない

> 4. 短い時間間隔でクロックプロファイリングデータが失われる

> 5. データ収集がスタックオーバーフローで異常終了する

> 6. プログラムが `exec` を呼び出すと実験が不完全になる

> 7. 末尾呼び出し最適化で再帰情報が誤って報告される

> 8. リンクが最適化されている実行可能ファイルに、ソースが表示されない

> 9. アウトライン関数の最適化で、再帰情報が誤って報告される

> 10. `java.util.prefs.FileSystemPreferences` の警告メッセージが表示された場合の解決策

> 1. ##### シグナルハンドラをインストールするアプリケーションで動作が変わる

>    シグナルハンドラをインストールするアプリケーションのパフォーマンスデータを収集すると、コレクタまたはそのアプリケーションの動作が変わる可能性があります。 検出された場所で、コレクタライブラリは、実験に警告メッセージを記録します。

>    コレクタライブラリが事前にロードされると、コレクタのシグナルハンドラは常に自分のシグナルハンドラを一次ハンドラとして再インストールし、使用しないシグナルを他のシグナルハンドラに転送します。ただし、コレクタがシステムコールに割り込むことはないため、システムコールに割り込むシグナルハンドラをインストールするアプリケーションでは、その動作が変わる可能性があります。 非同期の取り消し操作に `SIGPROF` を使用する非同期入出力ライブラリ `libaio.so` の場合、非同期取り消し要求が遅れて届きます。(4397578)

>    コレクタライブラリを事前にロードせずに `dbx` をアプリケーションに接続すると、コレクタは有効になった時点でそのシグナルハンドラを一次ハンドラとしてインストールします。ただし、それ以降にインストールされたシグナルハンドラがあれば、そのハンドラの方がコレクタのシグナルハンドラに優先します。このシグナルハンドラが `SIGPROF` シグナルと `SIGEMT` シグナルをコレクタのシグナルハンドラに転送しない場合、プロファイリングデータは失われます。

> 2. ##### `dbx` がプロセスに接続されたときにデータ収集に問題が発生する

>    コレクタライブラリ `libcollector.so` を事前にロードせずに実行中のプロセスに `dbx` を接続すると、多数のエラーが発生することがあります。

>    - トレースデータを収集することはできません。トレースデータとは、同期待ちトレース、ヒープトレース、MPI トレースなどです。トレースデータは、さまざまなライブラリに介入することによって収集されますが、`libcollector.so` が事前にロードされていない場合、他のライブラリに介入することができません。

>    - `dbx` がプロセスに接続されたあとプログラムがシグナルハンドラをインストールしていて、このシグナルハンドラが `SIGPROF` シグナルと `SIGEMT` シグナルを転送しない場合、プロファイリングデータと標本データが失われます。(4397578)

>    - プログラムが非同期入出力ライブラリ `libaio.so` を使用している場合、`libaio.so` が`SIGPROF` を使用して非同期の取り消し操作を行うため、クロックベースのプロファイリングデータと標本データは失われます。

>    - プログラムがハードウェアカウンタライブラリ`libcpc.so` を使用している場合、コレクタとプログラムが両方ともこのライブラリを使用するため、ハードウェアカウンタオーバーフロープロファイリング実験が破壊されます。 `dbx` がプロセスに接続されたあとでハードウェアカウンタライブラリがロードされる場合、ハードウェアカウンタ実験は成功しますが、`libcpc` ライブラリ関数への参照は `libcpc.so` の検索ではなく一般的検索によって解決されます。

>    - プログラムが `setitimer`(2) を呼び出すと、コレクタとプログラムが両方ともこのタイマーを使用しているため、クロックベースのプロファイリング実験は失われる可能性があります。

> 3. ##### 統計表示と標本の待ち CPU メトリックの値が正しくない

>    標本パッケージと大域統計には、不正な待ち CPU メトリックが記録されることがあります。これらの値はパフォーマンスアナライザの「統計」タブに表示され、「タイムライン」タブにおける標本の表示に影響します。(4615617)

> 4. ##### 短い時間間隔で時間プロファイリングデータが失われる

>    時間プロファイリングデータは、システムクロックが外部ソースと同期処理されている最中に数秒の間、消失しているように見えることがあります。この間、システムクロックは同期がとられるまで増分されていきます。 プロファイルシグナルは設定された間隔で送出されますが、プロファイルパケットに記録されているタイムスタンプには、シグナルの送出間の増分時間も含まれます。

> 5. ##### データ収集がスタックオーバーフローで異常終了する

>    コレクタはスタックオーバーフローエラーのために、収集を実行できないことがあります。 コレクタがアプリケーション側のスタックを使用していて、そのスタックのサイズがコレクタで使用するには小さすぎる場合に、この状況が発生します。 この問題を回避するには、スタックのサイズを 8K バイト以上にします。 詳細は、`limit`(1) のマニュアルページを参照してください。マルチタスク用ライブラリを使用する並列アプリケーションの場合、各スレッドのスタックサイズも STACKSIZE 環境変数を使用して設定する必要があります。

> 6. ##### プログラムが `exec` を呼び出すと実験が不完全になる

>    パフォーマンスデータが正常に収集されているプログラムで `exec`(2) やその派生関数を呼び出すと、実験が異常終了します。パフォーマンスアナライザや `er_print` でこの実験を読み取ることはできますが、データが収集されたコンピュータ上でその実験に対して`er_archive`(1) を実行して、プログラムで使用したロードオブジェクトが正しくアーカイブされたことを確認する必要があります。

> 7. ##### 末尾呼び出し最適化で再帰情報が誤って報告される

>    共有オブジェクト (PIC コード) から末尾呼び出しの最適化呼び出しを行って、大域変数を参照するために大域オフセットテーブルアドレスを判別する必要がある関数で、最適化コードが再帰的として誤って報告され、実際の呼び出し元が失われます。(4656890)

> 8. ##### リンクが最適化された実行可能ファイルでソースが表されない

>    リンクが最適化されている実行可能ファイルでは、実行可能ファイルのソースを表示するのに正しい行番号情報が必要ですが、パフォーマンスツールは、オブジェクトファイルの誤った情報を参照しています。 この問題の対策は、オブジェクトファイルを削除または名前変更して、ツールが実行可能ファイルを参照するようにすることです (4804467)

> 9. ##### アウトライン関数の最適化で、再帰情報が誤って報告される

>    ほとんど実行されないコードに対してアウトライン関数を生成することによって最適化された関数では、ツールがアウトライン関数の復帰アドレスを判断できないため、再帰情報が誤って報告されます (4800953)

> 10. ##### `java.util.prefs.FileSystemPreferences` の警告メッセージが表示された場合の解決策

>     `java.util.prefs.FileSystemPreferences` の警告メッセージが表示された場合は、次の方法を試してください。

>     > `%cd /usr/j2sdk1.4.1_01/jre (またはご使用の JRE ホーム)
>     > %mkdir .systemPrefs
>     > %chmod 777 .systemPrefs
>     > `

> #### G. 制限事項と互換性の問題

> ここでは、制限事項およびシステムまたはその他のソフトウェアとの互換性の問題について説明します。

> 1. パフォーマンスアナライザの要件

> 2. Java[tm] プログラミング言語で記述されたアプリケーションのプロファイリング

> 3. ハードウェアカウンタのオーバーフロープロファイリング

> 4. ライブラリへの介入

> 5. ソースファイルとオブジェクトファイルの検出

> 6. 実験の互換性の問題

> 7. `setuid` の使用

> 1. ##### パフォーマンスアナライザの要件

>    パフォーマンスアナライザを使用するには、バージョン 1.4 以降の Java[tm] 2 Software Development Kit, Standard Edition が必要です。1.4 以前のバージョンでもパフォーマンスアナライザを使用できますが、実行に失敗したり、正しく機能しなかったり、十分に動作しない可能性があります。

> 2. ##### Java[tm] プログラミング言語で記述されているアプリケーションのプロファイリング

>    Java[tm] プログラミング言語で記述されているアプリケーションで Java モードのプロファイリングデータを収集するには、バージョン 1.4.1 以降の Java 2 Software Development Kit, Standard Edition を使用する必要があります。Java プログラミング言語で記述されているアプリケーションでマシンモードのプロファイリングデータを収集するには、バージョン 1.4.0 以降のものを使用する必要があります。 JVM[tm] ソフトウェアにはバグがあり、これらのバグによって、1.4.2 ベータより前のバージョンではプログラムの実行が失敗する場合があります。それ以降のバージョンでも、(頻度は少なくなりますが) 失敗する場合があります。

>    Java モードのプロファイリングで最適な結果を得るには、Java 2 Software Development Kit, Standard Edition の最新バージョンを使用してください。

> 3. ##### ハードウェアカウンタのオーバーフロープロファイリング

>    ハードウェアカウンタのオーバーフロープロファイリングは、UltraSPARC® III シリーズより前の UltraSPARC® プロセッサではサポートされていません。

>    ハードウェアカウンタのオーバーフロープロファイリングは、Solaris[tm] 8 リリースより前のバージョンのオペレーティング環境ではサポートされていません。

>    UltraSPARC® III の初期バージョンのハードウェアの中には、ユーザー DTLB または ITLB のミスに基づくプロファイリングをサポートしていないものがあります。サポートしているのは、カーネルモード時の TLB カウンタだけです。

>    `cputrack` がシステムで実行されていると、`cputrack` がハードウェアカウンタを制御するため、コレクタはハードウェアカウンタオーバーフローデータを収集することができません。

> 4. ##### ライブラリへの介入

>    コレクタは、シグナル処理、`fork` と `exec` 呼び出し、ハードウェアカウンタライブラリ、一部のタイミング関数などさまざまなシステム関数に介入して、有効なデータを収集できるようにしています。これらの関数のいずれかをプログラムが使用すると、その動作が変わることがあります。特に、プロファイリングタイマーとハードウェアカウンタは、プロファイリングが有効な場合はプログラムで使用できず、シグナルを送出するためにシステムコールが割り込まれることはありません。この動作は、システムコールに割り込んでシグナルを送出する非同期入出力ライブラリ `libaio.so` の使用に影響します。コレクタライブラリ `libcollector.so` を事前にロードすることなく、`dbx` を実行中のプロセスに接続してからデータ収集を有効にした場合には、このようなライブラリへの介入は行われません。

> 5. ##### ソースファイルとオブジェクトファイルの検出

>    デバッガがプロセスに接続されたときに生成される実行可能ファイル名が、絶対パスではなく相対パスの場合があります。 同様の問題が、アーカイブ (`.a`) から読み込まれたオブジェ クトファイルでも発生することがあります。

>    パフォーマンスアナライザは、実行可能ファイルまたはオブジェクトファイルに記録されているパスからベース名 (最後の "/" に続く名前) を抽出し、次のようにしてファイルを検索します。

>    1. `addpath` または `setpath` コマンドで指定されたディレクトリ、または「データ表示方法の設定」ダイアログの「バスを検索」タブで設定されたとおりの順序のディレクトリで、ベース名を持つファイルを検索します。デフォルトの `setpath` は次のとおりです。

>    > A. 実験のアーカイブディレクトリ
>    > B. 現在の作業用ディレクトリ (`./<basename>`)

>    2. 最初に記録されていたパスを使用してファイルを検索します。

>    それでもファイルが見つからない場合は、エラーまたは警告を生成して、実験ファイルに当初示されたパスを示します。

>    パフォーマンスアナライザでソースファイルを検出できるようにするには、対象ファイルが含まれているディレクトリを検索パスに追加するか、またはカレントディレクトリからそのファイルの実際の場所を指すシンボリックリンクを設定するか、または該当するファイルを実験にコピーします。

> 6. ##### 実験の互換性の問題

>    パフォーマンスアナライザは、Forte[tm] Developer 7 ソフトウェアリリースより前のコレクタを使って作成された実験データを読み込むことはできません。

> 7. ##### `setuid` の使用

>    プロセスが `setuid` を呼び出したり、`setuid` ファイルを実行したりすると、コレクタはアクセス権の問題が原因で実験を生成できないことがあります。

> データ収集の制限についての詳細は、 `collect`(1) マニュアルページを参照してください。

> #### H. 記述の誤りの訂正

> 現時点では新しい情報はありません。

> #### I. 必要なパッチ

> パフォーマンス解析ツールによる問題の中には、Solaris[tm] オペレーティング環境のバグに起因するものがあります。これらのバグを修正するには、関連するパッチをインストールする必要があります。必要なパッチの一覧を入手するには、コマンドプロンプトに対して `collect` コマンドを引数なしで実行します。上記のパッチは、`http://sunsolve.sun.com` からダウンロードできます。Solaris 8[tm] オペレーティング環境では、パッチをインストールする前にアップデート 5 以降のアップデート版をインストールする必要があります。

> 以下の問題は、パッチがインストールされていない場合に、コレクタおよびパフォーマンスアナライザで発生することがあります。

> - `libaio` を使用し、`aio_cancel()` を呼び出すプログラムがデータの収集中に異常終了します。

>       dbx:l@1 の状態が読めません -- ファイルまたはディレクトリがありません
>       dbx: 警告:プロセスが競合状態にあります。

> - データの収集中にマルチスレッド実行可能ファイルで `SEGV` が発生します。スレッドライブラリコードでコアダンプが発生したり、`SIGPROF` シグナルに対する `sigacthandler()` でコアダンプが発生したりします。

> - データ収集中にマルチスレッド実行可能ファイルで問題が発生する可能性があります。このとき、最初の項目に示したメッセージをはじめとして、種々の `dbx` エラーメッセージが表示されるほかに、次のような内容を報告するメッセージが表示されます。

>       一般的な libthread_db.so エラー

> - データの収集中にマルチスレッド実行可能ファイルで、クリティカルセクションでのシグナルフォルトに関連する `libthread` パニックを伴なう問題が発生する可能性があります。

> - マルチスレッド実行可能ファイルのデータが失われる可能性があります。これは、ある時点でスレッドライブラリがプロファイリングシグナルをマスクし、それ以降データがすべて失われるためです。

> - 非結合スレッドとともにマルチプロセッサアプリケーションを実行すると、ハードウェアカウンタのオーバーフロー (SIGEMT) からの割り込みが失われて、回復不能になることがあります。

> - LWP に対するプロファイル割り込み (SIGPROF) が失われることがありますこの場合、表示されたデータには、それらの LPW で動作しているスレッドのスレッドプロファイルメトリックは含まれません。この問題は、 Solaris 7 オペレーティング環境の非結合スレッドでもっとも頻繁に発生します。

> - 32 個以上の CPU またはスレッドを使用するアプリケーションでは、パフォーマンスデータの収集中に処理速度が急激に低下することがあります。

> - 環境によっては、HW カウンタのプロファイリング割り込みが OS のバグを引き起こし、このために `%y` レジスタが壊れてしまうことがあります。その時点でレジスタが有効になっていると、アプリケーションがクラッシュすることがあります。

> Copyright © 2003 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms.