TN_1206: TechNote 1206 커멘드라인에서 계측 모드로 ASP.NET 프로파일 실행
Bill Gibson, 프로그램 관리자
Microsoft Corporation
적용 대상 :
Microsoft Visual Studio 2005 Team System
Visual Studio Team System 2005 for Developers ( 및 Suite 에디션)에는 새로운 성능 프로파일 도구가 있습니다. 이 도구를 사용하면, 네이티브 및 매니지의 실행가능 파일과 dll 파일에 샘플링과 계측(Instrumentation) 모두를 사용하여 성능 문제를 진단할 수 있습니다. IDE에서 직접 ASP.NET 응용 프로그램을 프로파일링할 수도 있습니다. 즉, ASP.NET 응용 프로그램을 다른 네이티브 응용 프로그램이나 매니지 응용 프로그램과 같이 취급할 수 있습니다. 지금까지 ASP.NET 지원이 IDE에서 정상적으로 기능하도록 많은 시간을 소비했지만, 모든 사용자가 모든 시나리오에 IDE 를 사용할 수 있는 것은 아닙니다. 예를 들어, 프로파일을 실행하는 동안, Visual Studio IDE 는 어느 정도 디스크 영역을 점유하여 성능에 영향을 줄 가능성이 있습니다. 또, ASP.NET 데이터 수집을 시작하기 전에는 IIS 를 강제적으로 재시동해야 합니다. 여기에서는 ASP.NET 응용 프로그램에서 계측(Instrumentation)을 사용하여 데이터를 수집하기 위해, IDE 대신 커멘드라인 도구를 사용하는 방법을 몇 가지 살펴봅니다.
프로파일은 샘플링 프로파일과 계측(Instrumentation) 프로파일 중 어느 쪽을 선택할지에서 시작합니다. 요약하면, 샘플링에서는 정기적인 주기로 프로그램상태의 스냅샷이 작성됩니다. 그에 반해, 계측(Instrumentation)에서는 함수의 시작과 종료를 모두 잡기 위해서 어셈블리에 코드가 삽입됩니다. 그 때문에 계측(Instrumentation)에서는 매우 대량의 데이터가 수집됩니다. 일반적으로, 사용자에는 성능 핫스폿을 분리하기 위해 샘플링 프로파일에서 시작하는 것을 권장합니다. 그 후, 계측(Instrumentation)을 사용하여, 보다 구체적인 프로파일 시나리오까지 파고 들어 갈 수 있습니다. 다만, ASP.NET 의 프로파일을 실행하는 경우는 실제로는 계측 모드를 주로 실행할 것을 권장합니다. 샘플링 모드에서는 ASP.NET 프레임워크에서 많은 데이터가 제공되어 사용자가 독자적으로 작성한 코드로 무엇을 하는지 이해하기 어렵습니다. 여기에서는 계측 모드에만 주목합니다.
ASP.NET 는 매우 복잡하고, 작성 한 코드는 일반적으로, 시스템 동작 전체의 극히 일부에 지나지 않습니다. Profiler 관점에서 보면, ASP.NET 의 사용자 코드에는 두종류 있습니다. 하나는 일반적인으로, 웹사이트의 bin 디렉터리에 배포되는 빌드된 어셈블리입니다. 또 하나는 웹 페이지 또는 App_Code 디렉터리의 코드에서 작성되어 동적으로 빌드되는 어셈블리입니다.
다음은 계측 모드에서 이 두 종류의 코드의 데이터를 수집하는 방법을 설명합니다. 여기에 기재한 샘플은 모두, Visual Studio Team System for Developers 또는 Team Suite 가 컴퓨터에 설치된 것을 전제로 합니다. 다만, IDE 를 열 필요가 없습니다. 여기서 사용하는 다양한 도구 (vsperfclrenv, vsperfcmd, vsinstr 및 vsperfmon)는 모두 Microsoft Visual Studio 8\Team Tools\Performance Tools 디렉터리에 있습니다.
빌드된 어셈블리의 계측된 프로파일
빌드된 어셈블리란 웹사이트의 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 를 지정하면, 분석용으로 별도의 컴퓨터로 리포트를 여는 경우에 리포트가 의미 있도록 기호가 저장됩니다.
- iisreset /START
- 프로파일을 더 실행하는 경우만, 이것을 실행합니다.
- vsperfclrenv / globaloff
- 이 단계와 그 단계를 실행하면, 프로파일 도우미가 향후 ASP.NET 에 로드되지 않습니다. 이것은 도우미의 로드가 성능에 영향을 줄 수 있기 때문에, 프로파일의 실행 완료시에는 반드시 이것을 실행시켜줘야 합니다.
- reboot
- [your outputfile].vsp 를 Visual Studio 로 열립니다.
- 앞 단계에서 기호를 패키징했으므로, [your outputfile].vsp 는 VSTS 가 완전히 설치된 모든 컴퓨터에 복사하고, 열 수 있습니다.
동적으로 빌드되는 어셈블리의 계측된 프로파일
동적으로 빌드되는 어셈블리란 웹 페이지, 코드 비하인드 파일 및 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 파일을 수정하기 전에, 빌드되어 배포되는 어셈블리에 대해서 수동으로 vsinstr 를 실행하면, 빌드되어 배포되는 어셈블리와 동적으로 작성되는 어셈블리의 양쪽 모든 프로파일을 동시에 실행 가능합니다.
부록 A: ASP.NET 작업자 프로세스의 사용자 이름과 프로세스 ID 를 확인한다
- ASP.NET 응용 프로그램이 실행되는 것을 확인합니다.
- 작업 관리자를 엽니다.
- [Processes] 탭을 클릭합니다.
- PID 열과 사용자 이름 열을 표시합니다.
- 이것을 실행하려면, [view] 메뉴의 [select columns] 을 클릭하여, 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 와 일치해야 합니다. 또, codeBase 의 href 는 이 .DLL 를 가리키는 파일의 URL (단순한 경로 이름은 아니다)로 해야 합니다.
3. vsinstr.exe 위치 및 vsinstr.exe 의 의존관계(dependencies)를 설정합니다.
<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: 트러블 슈팅
현상 : 모든 것이 정상적으로 기능하는 것처럼 생각되지만, 파일을 열려고 할 때, "파일은 데이터를 포함하지 않습니다" 라는 오류가 표시될 경우입니다.
이것에 관해서는 생각할 수 있는 경우가 두가지 있습니다.
- vsperfmon.exe 를 실행 할 경우에 /USER 스위치를 올바르게 설정하지 않았습니다. ASP.NET 작업자 프로세스의 프로세스 ID 를 올바르게 확인하고 (부록 A 참조), vsperfmon.exe에 대해서 이를 제대로 지정했는지 확인해 주세요.
- 어셈블리가 계측되지 않았거나 계측된 어셈블리가 실행되지 않는 경우입니다. 계측된 프로세스에서의 데이터 취득이 시작되면, vsperfmon.exe 를 호스트 하는 커멘드프롬프트에 메시지가 표시됩니다. 이 메시지가 표시되지 않는 경우는 무엇인가 문제가 발생한 것을 보여줍니다. web.config 파일을 올바르게 변경한 것을 확인해 주세요. 어셈블리를 수동으로 계측하는 경우는 그 어셈블리가 실제 실행중임을 확인해 주세요.
현상 : vsperf80.dll 가 발견되지 않는다는 오류가 웹 페이지에 표시됩니다.
이것은 vsperf80.dll 가 ASP.NET 작업자 프로세스가 도달할 수 있는 경로 위에 존재해야 하기 때문입니다. Visual Studio 의 설치와 독립 실행형 성능 도구의 설치는 어느쪽이나 vsperf80.dll 를 [Windows]\system32 에 위치해야 합니다. 이 문제를 해결하려면, vsperf80.dll 를 찾아내어, [Windows]\system32 디렉터리에 위치시킵니다.
현상 : 모든 것이 정상적으로 기능하는 것처럼 생각되지만, 표시되어야 할 기호가 전부 표시되지는 않습니다.
이것에 관해 생각할 수 있는 두가지 경우가 있습니다.
- 작성한 코드로 기호가 전혀 표시되지 않는 경우는 서버를 재시동 하기 전에 /PACKSYMBOLS 플래그를 지정하여 vsperfreport 를 실행하는지를 확인해 주세요.
- ASP.NET 로 기호가 전혀 표시되지 않는 경우는 기호 서버가 올바르게 설정되었는지 확인해 주세요.
_NT_SYMBOL_PATH 변수에"symsrv*symsrv.dll*c:\localcache*http://msdl.microsoft.com/download/symbols" 를 설정합니다.