TN_1207: TechNote 1207 백그라운드 서비스를 프로파일링 하는 방법 기초
Bill Gibson, 프로그램 관리자
Microsoft Corporation
적용 대상 :
Microsoft Visual Studio 2005 Team System
새로운 Visual Studio Team System Developer ( 및 Team Suite) 에디션에는 새로운 강력한 성능 프로파일러가 있습니다. 이 도구를 사용하면, 네이티브 및 매니지의 실행가능 파일, 어셈블리, ASP.NET Web 사이트의 프로파일을 실행할 수 있습니다. 샘플링 모드 (정기적인 주기로 프로그램 상태를 capture) 또는 계측 모드 (함수 시작과 종료를 모두 capture 하기 위해서 프로파일 대상의 어셈블리에 코드를 삽입)에서 프로파일을 실행 가능합니다. 프로파일러를 사용하는 대부분의 사용자는 독립 실행형 응용 프로그램의 프로파일을 실시한다고 생각할 수 있지만, 원격 서비스를 사용하는 사용자도 증가하여 이러한 사용자는 원격 서비스 프로파일링을 실행할 수 있게 되기를 바랍니다. 여기에서는 서비스 프로파일링을 실시하는데 필요한 기본적인 지식과 도구에 대해 살펴봅니다.
데이터 수집
서비스 프로파일링을 실시하려면, 프로파일러에 의한 데이터 수집 방법을 어느 정도 이해해야 합니다. 프로파일러에서는 글로벌 공유 개체를 사용하고, 프로파일 대상의 어셈블리 안에 있는 다양한 런타임 프로세스에서 데이터를 취득하는 모니터가 실행됩니다. 취득된 데이터는 모두 이 모니터에 의해서 리포트 파일에 출력됩니다. 매니지드 코드용과 계측 모드나 샘플링 모드용으로, 다양한 종류의 런타임 라이브러리가 존재합니다. 일반적으로, 실행중의 프로세스가 모니터에 접속할 기회는 한번 뿐이어서,이것을 놓치면 접속할 수 없습니다. 즉, 모니터의 실행이 시작되기 전에 실행된 계측된 대상 이진은 재시동하지 않으면, 모니터에 데이터를 제공할 수 없습니다.
런타임 삽입
매니지 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"
서비스 프로파일링을 실시하는 경우에 대처해야 할 문제점을 몇 가지 보았기 때문에 이번은 계측(Instrumentation)과 샘플링을 사용하여 관리형 서비스 프로파일링을 실시하는 방법에 대해 간단한 단계별 방법을 보여줍니다.
샘플링을 사용한 관리형 서비스 프로파일링 실시 ? 단계별 방법
이 프로세스에서는 서비스를 설치하는 것부터 시작합니다. 서비스는 실행 하지 마세요. 실행전에 환경변수를 설정해야 합니다. 이것을 실시하려면, vsperfclrenv /GlobalSampleOn 를 사용합니다.
vsperfclrenv /globalsampleon
다음은 새로운 설정을 검색하기 위한 서비스를 재시동 해야 합니다.
여기에서는 컴퓨터를 재시동해야 할 경우도 있습니다. 재시동하면, 프로파일 모니터를 샘플링 모드로 실행해야 합니다. 모니터에 접속하기 위해, 반드시 /USER 옵션에 서비스 계정을 지정해 주세요. 또, 데이터가 기록되는 출력 리포트 파일 (import_sample.vsp) 지정해야 합니다.
vsperfcmd /start:sample /output:import_sample.vsp/user:"LOCAL SERVICE"
이렇게 하면 서비스를 실행할 수 있습니다. 환경변수 설정에 따라, CLR 는 관리형 프로파일링 용무의 Visual Studio 런타임을 로드.모니터는 이미 실행 중에서 LOCAL SERVICE 계정에 의한 접속을 허가하도록 설정합니다. 다음의 커멘드를 실행하면, 설정이 올바르게 행해지는 것을 확인할 수 있습니다.
이어서 다음 ID에 대해, [Users with access rights to monitor] 섹션의 내용을 확인합니다.
NT AUTHORITY\LOCAL SERVICE (S-1-5-19)
일반적인 방식으로, 서비스 스냅 인에서 서비스를 실행합니다. 실행하면, 프로파일 시나리오를 실행하기 전에 프로파일러를 첨부합니다.
vsperfcmd /attach:ExampleService.exe
여기서 서비스 프로파일링에 사용하는 시나리오를 실행해야 합니다. 시나리오가 종료되면, /detach 옵션을 사용하여 프로파일을 정지할 수 있습니다. 또는 서비스 종료까지 프로파일을 실시하는 경우는 다음과 같이 shutdown 커멘드를 사용합니다.
이것으로, 분석용으로 IDE에서 열릴 수 있는 . vsp 리포트 파일이 생성됩니다. 분석시에는 함수 뷰를 사용하여, 마우스의 오른쪽을 클릭하여 [Group By Module] 를 선택하고, 수집된 코드 가운데, CLR 마샬링, 원격 프로세스, 직렬화(Serialization) 화 코드 모두가 아닌, 생성한 코드만 만큼 주목하는 것이 가능합니다.
계측(Instrumentation)을 사용하여 관리형 서비스 프로파일링 실시 ? 단계별 방법
계측을 사용한 서비스 프로파일링은 샘플링 프로파일과 큰 차이는 없습니다. 먼저 가장 중요한 것은 Visual Studio 프로파일러의 CLR 구성요소는 트레이스 프로파일에는 다른 CLSID 를 사용하기 때문에, 다음과 같이, 샘플링 경우와 환경을 적절히 설정하여, 시스템을 재시동 해야 합니다.
vsperfclrenv /globaltraceon
트레이스 프로파일을 실시하는 경우는 프로파일 대상의 코드를 계측해야 합니다. 이것을 실시하려면, 데이터를 수집하는 모든 이진은 vsinstr 도구를 사용합니다.
vsinstr ExampleService.exe
다음은 수집 모니터를 실행해야 합니다. 계측 런타임(instrumentation runtime)이 접속을 시도하는 것보다 먼저 모니터를 실행해야 합니다. 서비스가 실행되면, 런타임은 자동적으로 접속을 시도합니다.
vsperfcmd /start:trace /output:example.vsp
그리고 일반적 방식으로 서비스를 실행합니다. 여기서 프로파일 대상의 서비스 시나리오를 실행합니다.
시나리오 실행 후에는 우선 서비스를 정지한 후 VsPerfCmd 를 사용하여 모니터를 종료해야 합니다.
이렇게 하면 샘플링의 경우와 같이, 분석용으로 IDE에서 열릴 수 있는 VSP 리포트가 생성됩니다. 계측의 경우는 시작 업에서 프로파일을 실시하므로, 서비스의 OnStart 메서드 안의 데이터를 확인할 수 있습니다.
여기서 소개한 방법을 사용하여, Visual Studio Team System 에 있는 프로파일러를 사용하여 서비스 프로파일링을 행하기 위한 입문으로서 도움이 될 것 있습니다.