Bill Gibson、プログラム マネージャ
Microsoft Corporation
日本語版最終更新日 2007 年 11 月 27 日
適用対象 :
Microsoft Visual Studio 2005 Team System
Visual Studio Team System 2005 for Developers (および Suite エディション) には、新しいパフォーマンス プロファイル ツールが組み込まれています。このツールを使用すると、ネイティブおよびマネージの実行可能ファイルとdll ファイルで、サンプリングとインストルメンテーションの両方を使用してパフォーマンスの問題を診断することができます。IDE から直接 ASP.NET アプリケーションのプロファイルを実行することもできます。つまり、ASP.NET アプリケーションを他のネイティブ アプリケーションやマネージ アプリケーションと同じように扱うことができます。これまで ASP.NET のサポートが IDE から正常に機能するようにするために多くの時間を費やしてきましたが、すべてのユーザーがあらゆるシナリオに IDE を使用できるわけではないということも認識しています。たとえば、プロファイルを行っている間、Visual Studio IDE はある程度ディスク領域を占有するためパフォーマンスに影響する可能性があります。また、ASP.NET データの収集を開始する前には IIS を強制的に再起動する必要があります。ここでは、ASP.NET アプリケーションからインストルメンテーションを使用してデータを収集するために、IDE ではなくコマンド ライン ツールを使用する方法をいくつか見ていきます。
プロファイルは、サンプリング プロファイルとインストルメンテーション プロファイルのどちらを使用するかを選択することから始めます。要約すると、サンプリングでは定期的なサイクルでプログラム状態のスナップショットが作成されます。それに対して、インストルメンテーションでは関数の開始と終了をすべて捕らえるためにアセンブリにコードが挿入されます。そのため、インストルメンテーションでは非常に大量のデータが収集されます。そこで、通常、ユーザーにはパフォーマンスホットスポットを分離するためにサンプリング プロファイルから始めることをお勧めしています。その後、インストルメンテーションを使用して、より具体的なプロファイルシナリオまで掘り下げていくことができます。ただし、ASP.NET のプロファイルを行う場合は、実際には、インストルメンテーションモードを主体に実行することをお勧めします。サンプリング モードでは ASP.NET フレームワークから多くのデータが提供され、ユーザーが独自に作成したコードで何が行われているかがわかりにくくなってしまうためです。ここでは、インストルメンテーションモードのみに注目します。
ASP.NET は非常に複雑で、作成したコードは、通常、システムの動作全体のほんの一部にすぎません。プロファイラの観点からすると、ASP.NET のユーザー コードには 2 種類あります。1 つは、通常、Web サイトの bin ディレクトリに配置されるビルド済みアセンブリです。もう 1 つは、Web ページや App_Code ディレクトリに埋め込まれているコードから生成される、動的にビルドされるアセンブリです。以下では、インストルメンテーションモードでこれら 2 種類のコードについてのデータを収集する方法を説明します。ここに記載したサンプルはすべて、
Visual Studio Team System for Developers または
Team Suite がコンピュータにインストールされていることを前提としています。ただし、IDE を開く必要はまったくありません。ここで使用するさまざまなツール (vsperfclrenv, vsperfcmd, vsinstr、および class=SpellE>vsperfmon) はすべて、Microsoft Visual Studio 8\Team Tools\Performance Tools ディレクトリにあります。
ビルド済みアセンブリのインストルメント化されたプロファイル
ビルド済みアセンブリとは、Web サイトの bin ディレクトリに配置されるアセンブリで、ASP.NET によって動的にビルドされるアセンブリではありません。
-
vsperfclrenv / globaltraceon
- このコマンドを実行すると、プロファイル ヘルパを読み込むよう .NET に指示する環境変数が設定されます。
- reboot (この記載のある箇所で再起動が必要です)
-
vsinstr [my assembly path]
- パフォーマンス データを収集するすべてのビルド済みアセンブリに対して、vsinstr を実行する必要があります。
-
vsperfmon /TRACE /OUTPUT:[your ouputfile].vsp/USER:"[ASP.NET worker process user]"
- このコマンドを実行するとパフォーマンス モニタが起動され、アプリケーションの実行時にデータを収集し、指定した出力ファイルに書き込まれます。
- ASP.NET ワーカープロセスが使用するユーザー名 (実行している IIS のバージョンによって異なります) を確認するには、付録 A を参照してください。
-
vsperfmon は収集プロセス全体にわたって実行されるので、他のコマンドを完了するためにはコマンドプロンプトをもう 1 つ起動する必要があります。
- Web アプリケーションに対してテストシナリオを実行します。
-
iisreset /STOP
- 収集を完了するためには、プロファイル対象のプロセスをシャットダウンする必要があります。
-
vsperfcmd -SHUTDOWN
-
vsperfreport [your outputfile].vsp/SUMMARY:FUNCTION /PACKSYMBOLS
- PACKSYMBOLS は、ターゲット アセンブリが一時的なストレージ内の場所からなくなる前にシンボルを正しく固定するために必要です。また、PACKSYMBOLS を指定すると、分析用に別のコンピュータでレポートを開く場合にレポートが意味のあるものになるようにシンボルが保存されます。
- プロファイルをさらに行う場合のみ、これを実行します。
- この手順とその次の手順を実行すると、プロファイルヘルパが今後 ASP.NET に読み込まれなくなります。これは、ヘルパの読み込みがパフォーマンスに影響を与える場合があるため、プロファイルの実行完了時に行います。
- reboot
- [your outputfile].vsp を Visual Studio で開きます。
- 前の手順でシンボルをパックしたので、 [your outputfile].vsp は、VSTS が完全にインストールされているあらゆるコンピュータにコピーして、そこで開くことができます。
動的にビルドされるアセンブリのインストルメント化されたプロファイル
動的にビルドされるアセンブリとは、Web ページ、分離コード ファイル、および App_Code ディレクトリからのコードが含まれるアセンブリすべてです。
-
vsperfclrenv / globaltraceon
- reboot
-
web.config ファイルをバックアップします。
- サイトの web.config ファイルを修正します。
-
web.config ファイルを修正する方法については、付録 B を参照してください。
-
vsperfmon /TRACE /OUTPUT:[your ouputfile].vsp/USER:"[ASP.NET worker process user]"
- Web アプリケーションに対してテストシナリオを実行します。
-
iisreset /STOP
- 収集を完了するためには、プロファイル対象のプロセスをシャットダウンする必要があります。
-
vsperfcmd -SHUTDOWN
-
vsperfreport [your outputfile].vsp/SUMMARY:FUNCTION /PACKSYMBOLS
- (プロファイルをさらに実行する予定がない場合は) web.config ファイルを復元します。
-
iisreset /START
-
vsperfclrenv / globaloff (プロファイルをさらに実行する予定がない場合はこのコマンドを実行します)
- reboot
- [your outputfile].vsp を Visual Studio で開きます。
動的にビルドされるアセンブリに関する手順に従い、なおかつ、web.config ファイルを修正する前にビルド済みアセンブリに対して手動で class=SpellE>vsinstr を実行すると、ビルド済みアセンブリと動的に生成されるアセンブリの両方のプロファイルを同時に行うことができます。
付録 A: ASP.NET ワーカー プロセスのユーザー名とプロセス ID を確認する
- ASP.NET アプリケーションが実行されていることを確認します。
- タスク マネージャを開きます。
- [プロセス] タブをクリックします。
- PID 列とユーザー名列を表示します。
- これを行うには、 [表示] メニューの [列の選択] をクリックし、PID とユーザー名を選択します。
- aspnet_wp.exe が存在する場合は、それを使用します。存在しない場合は w3wp.exe を探します。
- Windows Server 2003 では、分離の設定方法によっては、ワーカー プロセスが複数存在する場合があります。その場合は、%windir% \system32\iisapp.vbs を使用して w3wp PID を IIS アプリケーション プールと関連付けます。
- PID 列とユーザー名列を読み取ります (既定値を以下に示します)。
- Windows Server 2003/IIS 6: (w3wp.exe、NETWORK SERVICE)
- Windows XP/IIS 5.1: (aspnet_wp.exe、ASPNET)
- Windows 2000/IIS 5.0: (aspnet_wp.exe、LOCAL SYSTEM)
付録 B: web.config ファイルを修正する
1. 以下のように、compilation タグを追加または修正します。
<system.web> <compilation assemblyPostProcessorType="Microsoft.VisualStudio.Enterprise.Common.AspPerformanceInstrumenter, Microsoft.VisualStudio.Enterprise.ASPNetHelper, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> </system.web>
PublicKeyToken は、ASPNetHelper.dll の PublicKeyToken と一致している必要があります。
2. ASPNetHelper.dll ファイルの場所を示すように runtime タグを設定します。
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.VisualStudio.Enterprise.ASPNetHelper" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <codeBase version="8.0.0.0" href="file:///C:/Program%20Files/Microsoft%20Visual%20Studio%208/Common7/IDE/PrivateAssemblies/Microsoft.VisualStudio.Enterprise.ASPNetHelper.DLL" /> </dependentAssembly> </assemblyBinding> </runtime>
PublicKeyToken
は、ASPNetHelper.dll の
PublicKeyToken と一致している必要があります。また、
class=SpellE>codeBase の
href は、この .DLL を指す、ファイルの
URL (単なるパス名ではない) にする必要があります。
3. vsinstr.exe の場所、および vsinstr.exe の依存関係を設定します。
<appSettings> <add key="Microsoft.VisualStudio.Enterprise.AspNetHelper.VsInstrLocation" value="C:\Program Files\Microsoft Visual Studio 8\Team Tools\Performance Tools\vsinstr.exe" /> <add key="Microsoft.VisualStudio.Enterprise.AspNetHelper.VsInstrTools" value="C:\Program Files\Microsoft Visual Studio 8\Team Tools\Performance Tools\" /> </appSettings>
-
VsInstrLocation は、vsinstr.exe というファイル名を含むフルパスです。
-
VsInstrTools は、パス上の他の場所では入手できない、vsinstr.exe 用のヘルパ dll が格納されているディレクトリです。このような dll は、msdis150.dll と mspdb80.dll です。
付録 C: トラブルシューティング
現象 : すべてが正常に機能しているように思えたのですが、ファイルを開こうとしたところ、"ファイルはデータを含んでいません" というエラーが表示されました。
これに関しては、考えられるケースが 2 つあります。
- vsperfmon.exe を起動するときに /USER スイッチを正しく設定しませんでした。ASP.NET ワーカー プロセスのプロセス ID を正しく特定したことを確認し (付録 A 参照)、それを vsperfmon.exe に対して指定していることを確認してください。
- アセンブリがインストルメント化されなかったか、またはインストルメント化されたアセンブリが実行されませんでした。インストルメント化されたプロセスからのデータの取得が始まると、vsperfmon.exe をホストするコマンド プロンプトにメッセージが表示されます。このメッセージが表示されない場合は、何か問題が発生したことを示しています。web.config ファイルを正しく変更したことを確認してください。アセンブリを手動でインストルメント化する場合は、そのアセンブリが実行中のものであることを確認してください。
現象 : vsperf80.dll が見つからないというエラーが Web ページに表示されます。
これは、vsperf80.dll が ASP.NET ワーカー
プロセスのパス上に存在する必要があるためです。Visual Studio のセットアップとスタンドアロン パフォーマンスツールのセットアップはどちらも、vsperf80.dll を [Windows]\system32 に配置しますこの問題を解決するには、vsperf80.dll を探し出して、[Windows]\system32 ディレクトリに配置します。
現象 : すべてが正常に機能しているように思えたのですが、表示されるべきシンボルが全部は表示されません。
これに関しては、考えられるケースが 2 つあります。
- 作成したコードでシンボルがまったく表示されない場合は、サーバーを再起動する前に /PACKSYMBOLS フラグを指定した vsperfreport を実行していることを確認してください。
- ASP.NET でシンボルがまったく表示されない場合は、、シンボルサーバーが正しく設定されていることを確認してください。
style='mso-spacerun:yes'>?_NT_SYMBOL_PATH 変数に、"symsrv*symsrv.dll*c:\localcache*http://msdl.microsoft.com/download/symbols" を設定します。
シンボルの詳細については、http://www.microsoft.com/japan/whdc/devtools/debugging/symbolpkg.mspx を参照してください。