TN_1204: TechNote 1204 커멘드라인에서 샘플링 모드로 ASP.NET 프로파일 실행
Bill Gibson, 프로그램 관리자
Microsoft Corporation
적용 대상 :
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 프로세스 전체에서 데이터를 수집하기 때문에, 특정의 코드를 분리할 만한 경우는 구조의 사용이 필요한 경우가 있습니다.
여기에 기재한 샘플은 모두, Visual Studio Team System for Developers 또는 Team Suite 가 컴퓨터에 설치된 것을 전제로 합니다.
다만, 통합개발환경(IDE) 를 열 필요가 전혀 없습니다. 여기서 사용하는 다양한 도구 (vsperfclrenv, vsperfcmd, vsinstr 및 vsperfmon)는
모두, Microsoft Visual Studio 8\Team Tools\Performance Tools 디렉터리에 있습니다.
샘플링 프로파일
- vsperfclrenv / globalsampleon
- 이 커멘드를 실행하면, 프로파일 도우미를 읽어들이는 듯 .NET 에 지시하는 환경변수가 설정됩니다.
데이터 수집을 시작할 때에는 이러한 변수가 유효하게 되어 있는 것을 확인해야 합니다.
- reboot
- vsperfmon /SAMPLE /OUTPUT:[your ouputfile].vsp /USER:"[ASP.NET worker process user]"
- 이 커멘드를 실행하면, 성능 모니터가 실행 되어 응용 프로그램의 실행시에 데이터를 수집하여, 지정한 출력 파일에 기록됩니다.
- ASP.NET 작업자 프로세스가 사용하는 사용자 이름 (실행하고 있는 IIS 의 버전에 따라서 다릅니다)을 확인하려면, 부록 A 를 참조해 주세요.
- vsperfmon 는 수집 프로세스 전체에 걸쳐서 실행되므로, 다른 커멘드를 완료하기 위해서는 커멘드프롬프트를 하나 실행해야 합니다.
- vsperfcmd /ATTACH:[PID of ASP.NET WORKER PROCESS]
- ASP.NET 작업자 프로세스의 프로세스 ID 를 확인하려면, 부록 A 를 참조해 주세요.
- Web 응용 프로그램에 대해서 테스트 시나리오를 실행합니다.
- 샘플링 프로파일에서 유효한 결과를 얻기 위해서는 CPU 에 부하가 걸리는 시나리오를 실행하는 것이 중요합니다.
CPU 사용율이 몇 분간 100% 가 되도록 시도해 주세요. 이것에는 Visual Studio Team System 에 준비되어 있는 새로운 로드 테스트 도구 사용이 적합합니다.
- vsperfcmd /DETACH
- 이 커멘드를 실행하면, ASP.NET 프로세스에서 분리되어 데이터 수집이 정지합니다.
- vsperfcmd /SHUTDOWN
- 이 커멘드를 실행하면, 시나리오를 종료하는 것 및 로그 파일을 닫도록 성능 모니터에 통지됩니다.
- vsperfreport [your outputfile].vsp /SUMMARY:FUNCTION /PACKSYMBOLS
- PACKSYMBOLS 는 대상 어셈블리가 일시적인 저장소 내의 장소에서 없어지기 전에 기호를 올바르게 고정하기 위해서 필요합니다.
또, PACKSYMBOLS 를 지정하면, 분석용으로 컴퓨터로 리포트를 여는 경우에 리포트가 의미가 있는 것이 되도록 기호가 저장됩니다.
- vsperfclrenv / globaloff
- 이 순서와 그 다음의 순서를 실행하면, 프로파일 도우미가 향후 ASP.NET 에 읽히지 않게 됩니다.
이것은 도우미의 로드가 성능에 영향을 주는 경우가 있기 때문에, 프로파일의 실행 완료시에 실행합니다.
- reboot
- [your outputfile].vsp 를 Visual Studio 로 열립니다.
- 앞의 순서로 기호를 압축했으므로, [your outputfile]. vsp 는 VSTS 가 완전하게 설치된 모든 컴퓨터에 복사하고, 거기서 열 수 있습니다.
여기에서는 실행하는 몇 가지의 시나리오에서 커멘드라인에서 샘플링 모드를 사용하여 ASP.NET 응용 프로그램의 프로파일을 실행할 필요가 있는 상황을 보여줍니다.
부록 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: 트러블 슈팅
현상 : 모든 것이 정상적으로 기능하는 것처럼 생각되지만, 파일을 열려고 했는데,"파일은 데이터를 포함하고 있지 않습니다" 라는 오류가 표시되었습니다.
이것에 관해서는 생각할 수 있는 경우가 2 개 있습니다.
- vsperfmon.exe 를 실행할 경우에 /USER 스위치를 올바르게 설정 하지 않았습니다. ASP.NET 작업자 프로세스의 프로세스 ID 를 올바르게 특정한 것을
확인하고(부록 A 참조), 그것을 vsperfmon.exe 에 대해서 지정해 있는 것을 확인해 주세요. - 어셈블리가 인스트루먼트화 되지 않았는지, 또는 인스트루먼트화 된 어셈블리가 실행되지 않았습니다.
인스트루먼트화 된 프로세스에서의 데이터의 취득이 시작되면, vsperfmon.exe 를 호스트 하는 커멘드프롬프트에 메시지가 표시됩니다.
이 메시지가 표시되지 않는 경우는 무엇인가 문제가 발생한 것을 보여줍니다. b.config 파일을 올바르게 변경한 것을 확인해 주세요.
어셈블리를 수동으로 인스트루먼트화하는 경우는 그 어셈블리가 실행중임을 확인해 주세요.
현상 : vsperf80.dll 가 발견되지 않는다는 오류가 웹페이지에 표시됩니다.
이것은 vsperf80.dll 가 ASP.NET 작업자 프로세스의 경로에 존재해야 합니다. Visual Studio 의 설치와 독립 실행형 성능 도구의 설치는 v sperf80.dll 를 [Windows]\system32 에 배포합니다
해결책 : vsperf80.dll 를 찾아내어, [Windows]\system32 디렉터리에 배포합니다.
현상 : 모든 것이 정상적으로 기능하는 것처럼 생각되지만, 표시되어야 할 기호가 전부는 표시되지 않습니다.
이 경우, 생각할 수 있는 것이 두 가지 있습니다.
- 생성한 코드로 기호가 전혀 표시되지 않는 경우는 서버를 재시동 하기 전에 /PACKSYMBOLS 플래그를 지정한 vsperfreport 를 실행하는 것을 확인해 주세요.
- ASP.NET 로 기호가 전혀 표시되지 않는 경우는 기호 서버가 올바르게 설정 되어 있는지 확인해 주세요.
style='mso-spacerun:yes'>?_NT_SYMBOL_PATH 변수에"symsrv*symsrv.dll*c:\localcache*http://msdl.microsoft.com/download/symbols" 를 설정합니다.