Bill Gibson、プログラム マネージャ
Microsoft Corporation
日本語版最終更新日 2007 年 11 月 27 日
適用対象 :
Microsoft Visual Studio 2005 Team System
新しい Visual Studio Team System Developer (および Team Suite) エディションには、新しい強力なパフォーマンス プロファイラが組み込まれています。このツールを使用すると、ネイティブおよびマネージの実行可能ファイル、アセンブリ、ASP.NET Web サイトのプロファイルを実行することができます。サンプリング モード (定期的なサイクルでプログラムの状態をキャプチャ) またはインストルメンテーションモード (関数の開始と終了をすべてキャプチャするためにプロファイル対象のアセンブリにコードを挿入) でプロファイルを行うことができます。プロファイラを使用するほとんどのユーザーは、スタンドアロン アプリケーションのプロファイルを行うと考えられますが、リモートサービスを使用するユーザーも増えており、こうしたユーザーはリモート サービスのプロファイルを実行できるようになることを望んでいることもわかっています。ここでは、サービスのプロファイルを行うのに必要な基本的な知識とツールについて見ていきます。
データ収集について
サービスのプロファイルを行うには、プロファイラによるデータ収集の方法についてある程度理解しておく必要があります。プロファイラでは、グローバル共有オブジェクトを使用して、プロファイル対象のアセンブリ内にあるさまざまなランタイムプロセスからデータを取得するモニタが実行されています。取得されたデータはすべてこのモニタによってレポート ファイルに出力されます。マネージ コード用と、インストルメンテーションモードやサンプリング モード用に、さまざまな種類のランタイム ライブラリが存在します。通常、実行中のプロセスがモニタに接続する機会は 1 回だけで、これを逃すと接続することができません。つまり、モニタの実行が開始される前に実行されているインストルメント化されたターゲットバイナリは、再起動しない限り、モニタにデータを提供できません。
ランタイムを挿入する
マネージ CLR プロファイル用のランタイムを挿入するには、ターゲット アプリケーションのプロファイルを行えるようにするため、そのアプリケーションに特定の環境変数を設定する必要があります。
VSPerfCLREnv ツール (コマンド ライン ツールはすべて Microsoft Visual Studio8\Team Tools\Performance Tools にインストールされています) を使用すると、任意のプロセスにこれらの変数を設定したり、これらの変数の有効/無効をグローバルに切り替えたりすることができます。
サンプリング モードの場合は、 CreateRemoteThread を使用してランタイム ライブラリを挿入します。 CreateRemoteThread
には、複数のターミナル サービス セッション間では機能しないことと、通常のユーザー セッションは 0 以外であるのに対しほとんどのサービスがセッション 0 で実行されるという制限事項があります。この場合、ランタイムがモニタと通信するのに使用する共有オブジェクトを開くことができず、プロファイルデータを収集できません。これを回避するには、ターゲット プロセスからモニタの共有オブジェクトへのアクセスを許可する必要があります。これを実現する
/USER スイッチをモニタに用意しました。たとえば、サービスが “LOCAL SERVICE” として実行される場合は、次のコマンドを使用してモニタを起動します。
VSPerfCmd /start:trace /output:data.vsp /user:"LOCAL SERVICE"
サービスのプロファイルを行う場合に対処すべき問題点をいくつか見てきたので、今度は、インストルメンテーションとサンプリングを使用してマネージ サービスのプロファイルを行う方法についての簡単なチュートリアルを示します。
サンプリングを使用してマネージ サービスのプロファイルを行う ? チュートリアル
この処理では、サービスをインストールすることから始めます。サービスは起動しないでください。起動する前に環境変数を設定する必要があります。これを行うには、vsperfclrenv /GlobalSampleOn を使用します。
vsperfclrenv /globalsampleon
次に、新しい設定を検出するためサービスを再起動する必要があります。
これには、コンピュータの再起動が必要になる場合もあります。再起動したら、プロファイル モニタをサンプリング モードで起動する必要があります。モニタに接続できるようにするため、必ず /USER オプションにサービス アカウントを指定してください。また、データが書き込まれる出力レポート ファイル (import_sample.vsp) の指定も必要です。
vsperfcmd /start:sample /output:import_sample.vsp
/user:"LOCAL SERVICE"
これで、サービスを起動することができます。環境変数の設定に従い、CLR はマネージ プロファイル用の Visual Studio ランタイムを読み込みます。モニタは既に実行中で、LOCAL SERVICE アカウントによる接続を許可するように設定されています。次のコマンドを実行すると、設定が正しく行われていることを確認できます。
vsperfcmd /status
続いて、以下の ID について、[監視するアクセス権を伴うユーザー] セクションの内容を確認します。
NT AUTHORITY\LOCAL SERVICE (S-1-5-19)
通常どおり、サービス スナップインからサービスを起動します。起動したら、プロファイル シナリオを実行する前にプロファイラをアタッチします。
vsperfcmd /attach:ExampleService.exe
ここで、サービスのプロファイルに使用するシナリオを実行する必要があります。シナリオが終了したら、/detach オプションを使用してプロファイルを停止することができます。または、サービスの終了までプロファイルを行う場合は、次のように shutdown コマンドを使用します。
vsperfcmd /shutdown
これで、分析用に IDE で開くことができる .
vsp レポート ファイルが作成されます。分析の際には、関数ビューを使用し、右クリックして [モジュールでグループ化] をクリックすれば、収集されたコードのうち、CLR のマーシャリング、リモート処理、シリアル化のコードすべてではなく、作成したコードだけに注目することができます。
インストルメンテーションを使用してマネージ サービスのプロファイルを行う ? チュートリアル
インストルメンテーションを使用したサービスのプロファイルは、サンプリング プロファイルと大きな違いはありません。まず最も重要なことには、
Visual Studio プロファイラの CLR コンポーネントは、トレースのプロファイルには異なる CLSID を使用するため、以下のようにして、サンプリングの場合と同様、環境を適切に設定し、システムを再起動する必要があります。
vsperfclrenv /globaltraceon
トレースのプロファイルを行う場合は、プロファイル対象のコードをインストルメント化する必要があります。これを行うには、データを収集するすべてのバイナリに対して vsinstr ツールを使用します。
vsinstr ExampleService.exe
次に、収集モニタを起動する必要があります。インストルメンテーション ランタイムが接続を試みるよりも前にモニタを起動する必要があることを覚えておいてください。サービスが起動されていれば、ランタイムは自動的に接続を試みます。
vsperfcmd /start:trace /output:example.vsp
続いて、通常どおりにサービスを起動します。ここで、プロファイル対象のサービス シナリオを実行します。
vsperfcmd /status
シナリオの実行後は、まずサービスを停止し、次に VsPerfCmd を使用してモニタをシャットダウンする必要があります。
vsperfcmd /shutdown
これで、サンプリングの場合と同様、分析用に IDE で開くことのできる VSP レポートが作成されます。インストルメンテーションの場合は、スタートアップからプロファイルを行うので、サービスの OnStart メソッドの中のデータを確認することができます。
ここで紹介した手法やチュートリアルを使用して、Visual Studio Team System に組み込まれているプロファイラを使用してサービスのプロファイルを行うための入門として役立てることができます。