Solaris オペレーティングシステムでの C/C++ プロジェクトの I/O プロファイル - NetBeans IDE 6.8/6.9 チュートリアル
執筆:
Susan Morgan
2009 年 12 月 [リビジョン番号: V6.8--2]
目次
要件
このチュートリアルに従うには、次のソフトウェアが必要です。
必要な NetBeans ソフトウェアのダウンロードとインストールについては、「NetBeans IDE 6.8 のインストール 」および「C/C++/Fortran 向けの NetBeans IDE の構成 」 を参照してください。
はじめに
C/C++/Fortran プラグインを持つ NetBeans IDE 6.8 には、C/C++ プロジェクトの入出力の動作を監視するための I/O 使用法ツールが用意されています。このツールで、プロジェクトの読み取りと書き込みの全体をグラフィカルに表示できます。また、読み書きのバイト数など、読み込みおよび書き込みされる個々のファイルについて詳細な情報を確認することもできます。
このチュートリアルでは、Solaris 10 または OpenSolaris オペレーティングシステム上で実行されている C/C++ プロジェクトで、I/O 使用法ツールを使用する方法について説明します。このツールは Solaris オペレーティングシステムのみでサポートされます。これは、ツールで使用されるシステムデータおよびプログラムデータを収集するために Solaris DTrace ユーティリティーを必要とするからです。I/O 使用法ツールは、C/C++ NetBeans プロジェクトを Solaris オペレーティングシステムで実行する際にデフォルトで実行されます。無効にする場合は、プロジェクトのプロパティーで設定できます。
Windows または MacOS X ユーザーであり、ネットワーク上で Solaris システムを利用できる場合、IDE を PC または Mac のローカルで実行し、Solaris システムをリモート開発ホストとして使用するようにプロジェクトを設定できます。Windows または MacOS X で IDE を実行している場合でも、リモート開発で I/O 使用法ツールおよびその他の Solaris ベースツールを使用できます。リモート開発機能は、NetBeans IDE 用 C/C++/Fortran モジュールでのみ使用できます。リモート開発ホスト上で構築するための設定方法の詳細については、「C/C++ リモート開発のチュートリアル 」を参照してください。
このチュートリアルでは、シングルコア Solaris SPARC プロセッサベースシステムで実行されるプロジェクトを使用します。SPARC ベースまたは x86 ベースのシステムで実行されている Solaris オペレーティングシステムで、NetBeans IDE 6.8 を実行する場合は、このチュートリアルの手順に従ってください。このチュートリアルで使用されている「Solaris オペレーティングシステム」は、OpenSolaris と Solaris 10 の両方のオペレーティングシステムを指しています。
入出力データの収集
入出力データは、Solaris 10 および OpenSolaris オペレーティングシステムで実行されているプログラム動作を追跡するツールである DTrace によって収集されます。特殊な DTrace スクリプトによって、I/O 関連の Solaris システムコール (open、creat、close、read、write) を傍受します。このスクリプトによって収集されたデータは、NetBeans IDE に渡されて解析されます。IDE は解析結果をグラフィカルに表示します。「I/O 詳細」ボタンをクリックすると、情報が表形式で表示されます。
Solaris 環境をチュートリアル用に設定
I/O 使用法ツールを使用するには、NetBeans を実行する際に使用する Solaris ユーザーアカウントに、システムの動作を監視するための DTrace 権限が付与されている必要があります。ユーザーアカウントには、dtrace_user、dtrace_proc、および dtrace_kernel 権限がある必要があります。
DTrace 権限を確認するには、コマンドプロンプトに次を入力します。
/bin/ppriv $$
アカウントに必要な権限がある場合、ppriv コマンドで次のような結果が返されるはずです。
E: basic,dtrace_kernel,dtrace_proc,dtrace_user
I: basic,dtrace_kernel,dtrace_proc,dtrace_user
P: basic,dtrace_kernel,dtrace_proc,dtrace_user
L: all
「I:」で始まる行は、シェルから起動したプログラムによって継承される権限を指定するため、重要です。必要な継承可能権限がアカウントになく、管理者権限またはシステムへのルートアクセス権もない場合、システム管理者に問い合わせて、dtrace_user、dtrace_proc、および dtrace_kernel 継承可能権限をアカウントに追加します。
管理者権限またはシステムへのルートアクセス権がある場合、次の説明に従って、必要な権限をユーザーアカウントに付与できます。
ユーザーアカウントに必要な DTrace 権限を永久的に付与するには、次の手順に従います。
権限を変更するユーザーアカウントが、システムからログアウトしていることを確認してください。
スーパーユーザー (root) または別の管理者ユーザーでログインします。
コマンドプロンプトに次を入力し、<ユーザー名> を、変更するユーザーアカウント名に置き換えます。
$ usermod -K defaultpriv=basic,dtrace_kernel,dtrace_user,dtrace_proc <ユーザー名>
ユーザーアカウントでログインして NetBeans IDE を起動し、DTrace データプロバイダでプロファイルツールを使用します。
ユーザーアカウントに必要な DTrace 権限を一時的に付与するには、次の手順に従います。
次を入力して、シェルのプロセスのプロセス ID を特定します。
$ echo $$
スーパーユーザー (root) または別の管理者ユーザーになります。
次を入力し、<プロセス ID> を echo コマンドで返されたプロセス ID に置き換えます。
$ ppriv -s I+dtrace_user,dtrace_proc,dtrace_kernel <プロセス ID>
<プロセス ID> で指定してシェルに入力したすべてのコマンドは必要な権限を継承しています。ユーザーアカウントは、このシェルで NetBeans IDE を開始し、I/O 使用法プロファイルツールを使用することができます。
チュートリアル用のプロジェクトの作成
I/O 使用法プロファイル機能を調べるため、IDE に含まれている ProfilingDemo サンプルアプリケーションを使用して新規プロジェクトを作成します。
ProfilingDemo アプリケーションは 3 つの段階で実行されます。タスクをそれぞれ 10 秒間づつ繰り返し実行し、3 種類の方法で興味深い動作を生成してプロファイルツールに表示します。最初のタスクでデータをファイルに書き込みます。そのあとで何度かの計算タスクが行われます。計算タスクの数は、CPU の数によって異なります。
シングル CPU マシンでは、ファイルへの書き込みと計算の実行という 2 個のタスクがセットにされます。
マルチ CPU マシンでは、タスクの合計数は CPU の数と同じになります。CPU の数が N 個の場合、1 回のファイル書き込みと N-1 回の計算を合わせて、N 個のタスクがセットにされます。
たとえば、開発用ホストに 32 個のコアがある場合、プログラムは書き込みタスクを 1 回、計算タスクを 31 回実行します。タスクを開始するたびに Enter キーを押す必要があるため、出力ウィンドウの表示に注意が必要です。
ProfilingDemo プロジェクトには、次の 3 つのデモの段階があります。
シーケンシャルデモはシングルスレッドで行われ、2 つのタスクを交互に 10 秒間づつ実行します。CPU の数が多いシステムでは、このデモに時間がかかることがあります。これは多数のタスクセットが次々と実行されるからです。
パラレルデモはマルチスレッドで行われ、ファイルへの書き込みタスクと計算タスクが、各スレッドで同時にそれぞれの CPU に対して 1 回行われます。このデモ段階は、マルチコアマシンでシーケンシャルデモを実行する場合よりも時間がかかりません。これは、実行されるタスクの数はシーケンシャルデモと同じですが、同時に行われるためです。ただし、同じデータへアクセスするスレッドの競合を避けることができないため、正しい結果にならないことがあります。ProfilingDemo のスレッドでは、共有するデータがないため、不正確な結果になることはありません。しかし、ほかのプログラムでは保証のかぎりではありません。
Pthread Mutex デモもマルチスレッドで行われ、ほかのデモ段階と同じように書き込みタスクと計算タスクが実行されます。ただし、このコードでは、複数のスレッドによる特定の関数へのアクセス競合を防ぐため、排他ロックを使用しています。
ProfilingDemo プロジェクトを作成するには、次の手順に従います。
「ファイル」>「新規プロジェクト」を選択して、「新規プロジェクト」ウィザードを開きます。
ウィザードで「サンプル」カテゴリを選択し、「C/C++」サブカテゴリを選択します。
次の図に示すように、「プロファイルのデモ」を選択して「次へ」をクリックします。
プロジェクトの名前と場所を選択できます。ここでは、デフォルトの ProfilingDemo_1 を NetBeansProjects ディレクトリで使用します。
「完了」をクリックしてウィザードを終了し、プロジェクトを作成します。
プロジェクトのプロファイル構成の設定
プロジェクトプロパティーの一つであるプロファイル構成を使用して、プロジェクト実行時に実行するプロファイルツールを設定できます。I/O 使用法ツールを表示するには、「C/C++ DTrace 拡張」プロファイル構成を使用する必要がありますが、この場合、使用可能なすべてのプロファイルツールが指定されてしまいます。このチュートリアルでは I/O 使用法ツールに焦点を当てるため、プロファイルツールのセットを小さくするように独自のプロファイル構成を作成します。このタスクは任意です。
新しいプロファイル構成を作成するには、次の手順に従います。
プロジェクト名を右クリックし、「プロパティー」を選択して「プロジェクトプロパティー」ダイアログを開きます。
「プロファイル」カテゴリを選択します。「C/C++ DTrace 拡張」プロファイル構成が選択されています。
「プロファイル構成」リストの横にある「...」ボタンをクリックすると、「プロファイラツールマネージャー」ダイアログが表示されます。
「プロファイラ構成」リストで、「構成を管理...」を選択します。
「プロファイラ構成マネージャー」ダイアログで「C/C++ DTrace 拡張」を選択します。
「複製」をクリックします。
「名前を変更」をクリックし、「CPU Memory I/O」と入力して「了解」をクリックします。
このスクリーンショットは、「名前」ダイアログと、このダイアログに到達するまでに表示する必要があるダイアログを示しています。
「プロファイル構成マネージャー」ダイアログで「了解」をクリックします。
「プロファイラツールマネージャー」ダイアログで、新しく作成した 「CPU Memory I/O」構成を選択します。
ツールのリストで「スレッドマイクロステート」ツールと「スレッド使用」ツールの選択を解除し、「了解」をクリックします。
この構成を使用するには、「プロジェクトプロパティー」ダイアログで、プロファイル構成用に「CPU Memory I/O」を選択して「了解」をクリックします。
ProfilingDemo プロジェクトの構築と実行
(任意) このチュートリアルに示したように、NetBeans の出力ウィンドウにプロジェクトの出力を表示する場合は、ProfilingDemo プロジェクトノードを右クリックして「プロパティー」を選択します。「プロジェクトプロパティー」で、「カテゴリ」パネルの「実行」ノードをクリックし、「コンソールタイプ」で「出力ウィンドウ」を選択します。「了解」をクリックします。
ProfilingDemo プロジェクトノードを右クリックし、「構築」を選択します。
「出力」タブに、次のような構築の結果が表示されます。
スクリーンショットに示したコンパイラは、Sun Studio ツールコレクションに含まれている CC コンパイラです。GNU C コンパイラ (gcc) を使用することもできます。
ProfilingDemo プロジェクトノードを右クリックし、「実行」を選択します。
ProfilingDemo プロジェクトの実行中に Enter キーを押すように求められた場合は、その指示に従います。
「実行監視」タブが開いて I/O 使用法ツールの動的グラフが表示されます。プロファイル構成で定義されているほかのツールがあれば、それも表示されます。ここでは、前の手順で作成した「CPU Memory I/O」プロファイル構成を使用しているため、3 つのツールしか表示されません。
すべてのツールを表示するには、「実行監視」タブの上部の境界線をクリックして上方にドラッグし、「実行監視」タブのサイズを大きくします。上図のスクリーンショットでは、インジケータを見やすくするために「実行監視」タブは上下左右に広げられています。ツール上部の境界線をドラッグして、特定のグラフの高さを伸ばすこともできます。
ProfilingDemo プログラムの出力ウィンドウに実行中の処理が表示されます。それを、IDE がツールにグラフィカルに表示しているデータと照合できます。たとえば、実行の経過時間が示され、完了すると Enter キーを押すことが求められます。また、割り当てられているメモリーの量が表示され、計算を実行したあとにメモリーが解放されます。こうしたプログラムの動作がグラフに反映されるところを確認できます。
このチュートリアルでは、Enter キーを押すように求められたときは指示に従い、プログラムを最後まで実行してください。収集されたデータが保存されたら、そのデータをステップ実行して I/O 使用法ツールの機能を確認することができます。
I/O 使用法の確認
I/O 使用法ツールでは、プロジェクト実行中のプログラムの読み取りと書き込みの動作の概要を確認できます。
下図のスクリーンショットは、プログラムの実行開始時のシーケンシャルデモの部分です。シングルスレッドで交互に実行される 2 つのタスクを示しています。最初の数秒でプログラムが開始され、その後ユーザーが Enter キーを押すまで待機しています。約 0:02 秒後の時点でユーザーが Enter キーを押し、プログラムが文字を一時ファイルに書き込んでいます。この動作は I/O 使用法ツールに反映され、書き込まれたバイトの数は図ではオレンジ色の線で示されています。次のことに注意してください。
I/O 使用法ツールのオレンジ色の線は、最近の 1 秒間に書き込まれたバイトの数を示しています。ProfilingDemo 自体は、このシーケンシャルデモの実行中に合計 39690240 バイト (約 38.7M バイト) の書き込みを行なったことを報告します。オレンジ色の線の 2 秒から 12 秒までのすべてのデータ点を総計すると、合計で 38.7M バイト近くになります。
「CPU 使用」ツールの「システム時間」は、この期間で高い値を示していますが、これは、データの生成とディスクへのデータ書き込みにシステムコールが使用されるためです。
「メモリー使用」ツールには、常に 8K バイトのメモリーヒープが割り当てられていることが示されます。
「実行監視」ウィンドウの下部に、グラフの表示の制御に使用するスライダが表示されます。スライダの端にマウスカーソルを置くと、それに関する情報が表示されます。
プロファイルツールのスライダの使い方については、「C/C++ プロファイルのチュートリアル 」のチュートリアルを参照してください。
下部にある水平スクロールバーをクリックし、マウスボタンを押したままスライダを左にドラッグすると、実行の先頭が表示されます。すべてのグラフが連動してスライドするため、任意の時刻に各領域 (CPU、メモリー、スレッド) がどのような状態になっているかを確認し、それらの領域の関係を見ることができます。
左から右へドラックすると、実行の状態を最初から最後まで確認できます。
「I/O 詳細」ボタンをクリックします。I/O 使用法の詳細タブが開き、標準入力、標準出力、およびプログラムが読み取りおよび書き込みを行う一時ファイルが表示されます。
チェックマークの付いたファイルは閉じていることを示します。黄色いアイコンが付いたファイルは、読み取りまたは書き込みの操作で開いていることを示します。
このプログラムでは Enter キーで何度か入力するだけであるため、「読み取りバイト」列はそれほど役に立つわけではありません。「読み取りバイト」列を非表示にするには、列見出しの横にあるボタンをクリックして、「表示項目の変更」ダイアログを表示します。チェックボックスをクリックして「読み取りバイト」を選択解除し、「了解」をクリックします。
このプログラムでこれらのすべての一時ファイルがどのように使用されているか詳しく知りたいとします。「I/O 詳細」タブでいずれかのファイル名をクリックすると、そのファイルがどの関数によって開かれて閉じられたかを確認することができます。ファイル一覧の右側のパネルに関数の名前が表示されます。
右側のパネルの関数をダブルクリックすると、関数を呼び出したソースファイルが開きます。ここでは、work_run_syscpu 関数をクリックして、common.c ファイルを開いています。
「I/O 詳細」タブで表示する期間を指定できます。2 つの時刻の選択で、表示する期間の「開始時刻」と「終了時刻」を秒数で指定または入力します。秒数を入力した場合、Enter キーを押すことが求められることがあります。
これにより関数のリストが更新されて、その期間中に収集されたデータのみが表示されるため、特定の期間にどのファイルに対してどれだけのバイト数の書き込みと読み取りが行われたかを正確に把握することができます。グラフも更新され、実行時間のうち指定した期間は明るく表示され、それ以外の部分は暗く表示されます。
「実行監視」ウィンドウを見ると、実行開始直後に書き込み動作が開始されています。このときに、プロファイルプロジェクトのシーケンシャルデモ部分で一時ファイルへの書き込みが始まります。シーケンシャルデモは 2 つのタスクをそれぞれ 10 秒づつ行うため、シーケンシャルデモの動作を特定するには、Enter キーが押されるなどの操作にかかる遅延時間を考慮し、0:00 ~ 0:27 秒を実行の観察期間にしてみます。
「I/O 詳細」タブの「終了時刻」に 0:27 を指定します。これによりデータがフィルタされるため、シーケンシャル段階の入出力を確認できます。フィルタする期間を選択したときの結果がグラフのインジケータにも反映されます。
シーケンシャルデモの期間には、「I/O 詳細」タブに一時ファイルが一つ表示されます。シングルスレッドでファイルが開かれ、書き込みが行われたあとにファイルが閉じられます。ファイルをクリックすると、そのファイルにアクセスする関数が表示されます。関数をダブルクリックするとソースコードが表示されます。
「実行監視」ウィンドウに戻って、時刻スライダを 0:30 秒あたりに動かします。一時停止したあと、ここから書き込み動作が開始されています。書き込みの一時停止は、シーケンシャルデモの計算タスク中に発生し、このときディスクへの書き込みは行われません。更新された動作状況を見ると、プログラムがパラレルデモ段階に移行しており、ユーザーが Enter キーを押してタスクを起動したときに、ディスクへの書き込みと計算が同時に複数のスレッドで行われていることが分かります。パラレルデモの動作を特定するには、「I/O 詳細」タブの「時間フィルタ」で、「開始」時刻に 0:28 秒を、「終了」時刻に 0:41 秒を指定し、Enter キーを押します。これで、パラレル段階の入出力のデータだけがフィルタされます。
パラレルデモの期間には、「I/O 詳細」タブに複数の一時ファイルが表示されます。ファイルへの書き込みを行なっているのが一つのスレッドだけの場合も複数の一時ファイルが表示されます。これは 1 秒ごとに新しいファイルに切り替わるためです。計算タスクは、ディスクへの書き込みを行いません。
いずれかの一時ファイルをクリックすると、parallel_threadfunc 関数によってファイルが開かれて閉じられるのを観察できます。
次のスクリーンショットの図では、0:40 秒のあたりで I/O 動作が再度切り替わっています。この時点でプログラムは Pthread Mutex デモ段階に移行し、ユーザーが Enter キーを押しています。この領域のデータをフィルタするために、「開始時刻」に 0:41 を、「終了時刻」に「最大」を指定します。Enter キーを押して、入力した値を確定します。
「I/O 詳細」タブには、Pthread Mutex デモ期間中に開かれた複数のファイルが表示されます。
一つのスレッドでファイルへの書き込みが行われ、パラレルデモ期間の場合と同じように 1 秒ごとに書き込み先ファイルが切り替えられます。ただし、mutex ロックがかかっているため、書き込みを行うスレッドが計算を行うスレッドによってブロックされ、続けてファイルへの書き込みを行うことができないことがときどき発生します。
「スレッド使用」ツールを有効にして、再度このプログラムを実行してください。このチュートリアルで作成したプロファイル構成に「スレッド使用」ツールを追加するには、「ツール」>「プロファイルツール」を選択し、構成を選択して「スレッド使用」ツールを選択します。
関連項目
実行プロジェクトに関するデータをコンパイルするためにバックグラウンドで使用されている DTrace テクノロジの詳細については、「BigAdmin DTrace ポータル 」を参照してください。
スレッドマイクロステートツールの詳細については、「Solaris オペレーティングシステムでのスレッドマイクロステートツールの使用 」を参照してください。
CPU 使用、スレッド使用、およびメモリー使用の各ツールについては、「C/C++ プロファイルのチュートリアル 」を参照してください。
NetBeans IDE 用のその他の C/C++ チュートリアルについては、「C/C++ アプリケーションの学習 」を参照してください。
まとめ
このチュートリアルでは、I/O 使用法プロファイルツールの次の点について説明しています。
I/O 情報は、Solaris プラットフォームでは、Solaris DTrace ユーティリティーによって自動的に収集される。
グラフィカルに表示されるプロファイルインジケータは、プロファイル構成を使用して選択できる。
I/O 使用法ツールは、C/C++ DTrace 拡張プロファイル構成または独自に作成したプロファイル構成でのみ表示される。
プロファイル設定は、「プロファイル」カテゴリのプロジェクトプロパティーにある。
「I/O 詳細」ボタンをクリックすると、プログラムの関数ごとの詳細な I/O 情報が表示される。
詳細タブの関数をクリックすると、その関数が格納されたソースファイルが開き、関数の呼び出し元の行にカーソルが置かれる。
Solaris オペレーティングシステムが実行されているシステムをネットワーク上で使用できる場合、Solaris システムをプロジェクトの構築と実行用のリモート開発ホストとして設定することで、Windows または Mac マシンから I/O 使用法ツールを使用できる。