대메뉴 바로가기 본문 바로가기

데이터 기술 자료

데이터 기술 자료 상세보기
제목 VSPerfCmd를 이용한 샘플링 프로파일링
등록일 조회수 5532
첨부파일  

프로파일링 방법 이해하기

VSPerfCmd를 이용한 샘플링 프로파일링



마이크로소프트는 비줄얼 스튜디오에서 제공하는 프로파일링 기능을 비주얼 스튜디오 없이도 사용할 수 있도록 무료 도구인 ‘VSPerfCmd’을 제공하고 있다. 비주얼 스튜디오에서 진행됐던 샘플링(Sampling) 프로파일링을 비주얼 스튜디오 도움 없이 VSPerfCmd만으로 프로파일링하는 방법을 살펴본다.



개발 과정에서는 비주얼 스튜디오를 사용해 다양한 성능 문제를 발견하고, 또 문제를 해결할 때도 비주얼 스튜디오를 적극적으로 사용한다. 그러나 개발이 완료된 제품이 고객 사이트를 통해 배포된 후에 발생하는 성능 관련 문제들은 개발 과정에 비해 원인을 파악하기가 쉽지 않다. 고객의 개발 환경과 운영 환경이 개발자의 환경과 다르기 때문이다. 그 외도 다양한 이유가 존재할 것이다. 그 때문에 어떤 개발자는 해당 운영 환경에 비주얼 스튜디오를 설치한 후 디버깅 모드에서 장애 상황을 재현해 원인을 분석하고 싶다고 말하기도 한다. 고객의 운영 시스템에 개발 도구를 직접 설치해 장애 상황을 분석할 수 있는 상황은 거의 존재하지 않을 것이다. 이에 마이크로소프트는 비주얼 스튜디오의 설치 없이 배포된 프로그램의 장애 상황(비정상 종료 또는 응답 없음)을 분석하는 다양한 방법을 제공하고 있다. 대표적인 방법은 장애 발생 시점의 프로그램 메모리 상태를 Dump 파일로 저장하는 것이다. Dump 파일은 운영체제, Proc Dump 도구 또는 MiniDumpWriteDump 함수를 직접 호출헤 생성할 수 있다. 생성된 Dump 파일을 고객으로부터 전달 받은 후 빌드 때 같이 생성된 PDB 파일과 소스를 함께 매치하면 장애가 발생된 상황을 비주얼 스튜디오로 재현할 수 있다. ProcDump로 Dump 파일을 생성해 장애를 정의하는 방법은 ProcDump 관련 사이트(https://technet.microsoft.com/ko-kr/sysinternals/dd996900)를 참고하자.

그러나 Dump 파일을 이용하는 방법은 성능과 관련된 장애를 처리할 수 없는 한계가 있다. ProcDump와 같은 유틸리티가 성능과 관련된 장애를 모니터링할 수는 없기 때문이다. 그렇다면 어떻게 비주얼 스튜디오의 설치 없이 성능과 관련된 장애를 해결할 수 있을까? 한 가지 방법은 VSPerfCmd를 이용하는 것이다. VSPerfCmd는 특정 프로그램로부터 수집된 성능 데이터 정보를 파일로 저장하는 도구다. 비주얼 스튜디오 2008 버전 VSPerfCmd 설치 파일은 관련 사이트(http://www.microsoft.com/en-us/download/details.aspx?id=18277)에서 다운로드할 수 있다. 비주얼 스튜디오 2010 버전 설치 파일(http://www.microsoft.com/ko-KR/download/details.aspx?id=23205)도 공개돼 있다.

비주얼 스튜디오 2012 버전 VSPerfCmd는 비주얼 스튜디오 2012가 설치된 곳에 이미 존재한다. 경로는 C:Program Files (x86)Microsoft Visual Studio 11.0Team ToolsPerformance ToolsSetups이다. 비주얼 스튜디오 2013도 역시 C:Program Files (x86)Microsoft Visual Studio 12.0Team ToolsPerformance ToolsSetups 경로에서 설치 파일을 확인할 수 있다.

VSPerfCmd 설치 파일은 플랫폼에 따라 vs_profiler_x86_kor.exe와 vs_profiler_x64_kor.exe로 구분 제공된다. 성능 장애가 발생하는 프로그램이 운영되는 시스템 플랫폼에 맞게 설치 파일을 배포, 설치하면 된다. 설치 파일을 실행하면 <그림 1>과 같이 ‘사용권 계약서’가 표시된다. ‘동의함’에 체크하고 기본 경로가 아닌 특정 경로에 설치하길 원한다면 ‘옵션’ 버튼을 클릭해 설치 경로를 지정할 수 있다. 정상적으로 설치가 완료되면 기본 경로인 C:Program Files (x86)Microsoft Visual Studio 12.0Team ToolsPerformance Toolsx64에서 <그림 2>와 같이 VSPerfCmd.exe 파일을 확인할 수 있다.







vs_profiler_x64_kor.exe로 설치하면 C:Program Files (x86)Microsoft Visual Studio 12.0Team ToolsPerformance Tools 폴더에 x86 버전도 함께 설치된다. 이것으로 VSPerfCmd를 사용하기 위한 모든 준비 과정이 마무리됐다.







비주얼 스튜디오 성능 마법사 1/3 페이지에서는 프로파일링 방법을 <그림 4>와 같이 제공한다. 선택할 수 있는 프로파일링 방법은 CPU 샘플링, 계측, .NET 메모리 할당, 리소스 경합 데이터(동시성) 네 가지다. VSPerfCmd도 CPU 샘플링, 계측, 리소스 경합 데이터(동시성)를 제공한다. 이번 시간에는 샘플링 프로파일링 방법만 살펴보도록 하겠다.

VSPerfCmd 사용법을 익히기 전에 먼저 샘플링 개념을 이해하고 어떤 성능 장애 상황이 샘플링 프로파일링 방법에 적합한지 판단하는 능력을 갖추자. 샘플링은 이름에서도 알 수 있듯이 전수 조사는 아니다. 기본적으로 1000만 CPU 사이클당 하나의 프로파일링 데이터를 프로그램 운영에 거의 영향을 주지 않고 수집한다. 그래서 통계적 프로파일링 접근 방식이라고도 한다. 성능 데이터를 수집하는 주기는 CPU 사이클 외에도 페이지 폴트, 시스템 호출, CPU 캐시 미스 등 조건이 다양하다. 프로파일링 방법과 샘플링 수집 주기를 변경하기 위해서는 우선 <그림 5>과 같이 성능 탐색기에서 성능 세션 트리 항목(프로젝트 이름)을 선택한 후 마우스 오른쪽 버튼을 누르고 ‘속성’을 클릭한다.





프로파일링 방법을 변경하려면 <그림 6>과 같이 속성 페이지에서 ‘일반’을 선택한다. 그러면 <그림 4>와 같은 성능 마법사 페이지가 나타나니 원하는 방법을 선택하면 된다.



VSPerfCmd에서 프로파일링 방법을 지정하는 방법은 <리스트 1>과 같다.



<리스트 1> VSPerfCmd 프로파일링 방법 지정 VSPerfCmd.exe /Start:SAMPLE | TRACE | CONCURRENCY | COVERAGE /Output:출력 파일 이름 [옵션]

/Start 옵션 다음에 프로파일링 방법을 지정하면 된다. 샘플링은 SAMPLE, 계측은 TRACE, 동시성은 CONCURRENCY이다. VSPerfCmd는 추가적으로 코드 검사 COVERAGE도 제공한다Output 옵션에 지정하면 된다. 프로파일링 파일 확장자는 기본적으로 vsp이다.

<그림 7>과 같이 성능 마법사 2/3, 3/3 페이지에서는 프로파일링 대상 프로그램을 선택한다. 마법사가 완료된 후 프로파일링이 바로 시작된다.



성능 마법사에 지정한 프로파일링 대상 프로그램은 <그림 8>과 같이 속성 페이지의 ‘시작’에서 변경할 수 있다. 또한 오른쪽에 있는 상·하 버튼을 이용해 프로파일링 시작 순서도 변경할 수 있다.



지금까지 비주얼 스튜디오를 통해 프로파일링 대상 프로그램을 지정하고 실행 순서를 변경하는 방법에 대해 살펴봤다. VSPerf Cmd는 /Launch 옵션으로 동일한 작업을 수행할 수 있다. VSPerfCmd에서 /Start 옵션으로 프로파일링 방법을 지정한 후 프로파일링 프로그램을 실행하기 위해서 <리스트 2>와 같이 /Launch 옵션으로 프로파일링 분석 프로그램 이름을 지정하면 프로그램이 실행되면서 프로파일링이 시작된다.



<리스트 2> VSPerfCmd 프로파일링 분석 프로그램 실행 VSPerfCmd.exe /Launch:프로그램 이름 [옵션]

옵션 중 /Args를 사용하면 프로그램을 실행할 때 전달할 인수 목록을 지정할 수 있다. 그리고 /Console 옵션을 사용하면 새 창에서 /Launch를 통해 지정한 프로그램이 실행된다. /Shutdown 옵션은 /Launch 옵션을 통해 프로파일링이 시작된 프로세스가 종료되거나 연결이 분리될 때까지 대기하고 있다가 프로파일러를 해제하고 프로파일링 출력 파일(VSP 파일) 핸들을 닫는 역할을 수행한다. <리스트 3>과 같이 /Shutdown 옵션에 시간 제한 매개 변수를 지정하지 않으면 프로파일링 분석 프로세스가 종료될 때까지 무기한 대기하게 된다.



<리스트 3> VSPerfCmd 프로파일링 분석 프로그램 종료 대기 VSPerfCmd.exe /Shutdown[:시간 제한(초)]

지금까지 확인한 /Start, /Output, /Launch 그리고 /Shutdown 옵션을 이용해 비주얼 스튜디오 없이 VSPerfCmd로 프로파일링을 해보자. 가장 먼저 프로파일링 방법과 출력 파일 이름을 지정하기 위해 VSPerfCmd /Start:Sample /Output:Primes.exe.vsp를 실행하면 Windows 작업 관리자에서 VSPerfMon.exe 프로그램이 실행된 것을 확인할 수 있다. VSPerfMon.exe 프로그램이 성능 데이터 수집 역할(프로파일러)을 수행하게 된다.

다음으로 프로파일링 대상 프로그램을 실행하기 위해 VSPerf Cmd /Launch:Primes.exe를 실행하면 Primes.exe 프로그램이 정상적으로 실행된 후 모든 작업이 끝나면 정상적으로 종료된다. Primes.exe 프로그램은 종료됐지만 아직 /Start 옵션으로 시작된 VSPerfMon.exe이 실행 중이다. VSPerfMon.exe을 종료하기 위해 VSPerfCmd /Shutdown을 실행한다. /Shutdown이 정상적으로 실행되면 VSPerfMon.exe 프로그램이 종료된 후 출력 파일인 Primes.exe.vsp도 정상적으로 생성된다. 이 모든 과정은 <그림 9>를 통해 확인할 수 있다.



샘플링을 하기 위한 성능 데이터(샘플)를 수집하기 위해서는 다양한 이벤트를 이용해야 한다. 이러한 다양한 이벤트를 좀 더 자세히 살펴보기 위해 <그림 10>과 같이 속성 페이지를 확인하자. ‘샘플링’을 선택하면 ‘성능 이벤트’ 목록에서 클록 주기, 페이지 폴트, 시스템 호출 그리고 성능 카운트를 확인할 수 있다. 클록 주기는 CPU 사용률 관련 성능 문제, 페이지 폴트는 메모리 관련 성능 문제, 시스템 호출은 I/O 관련 성능 문제 그리고 성능 카운터는 캐시 미스와 같은 하드웨어 아키텍처 수준의 성능 문제일 때 선택함으로써 성능 데이터를 수집, 장애 원인을 분석할 수 있다. 클록 주기는 성능 데이터를 수집하는 이벤트 기본 값이다. ‘샘플 이벤트’ 왼쪽에는 ‘샘플링 간격’ 입력란이 있는 것을 확인할 수 있다. 그리고 아래 ‘성능 카운트’를 선택하면 샘플링 CPU 카운터 목록이 표시된다.



‘성능 카운트’를 선택했을 때 나타나는 CPU 카운터는 <그림 11>과 같이 Portable Events와 Platform Events로 구분된다. Portable Events는 모든 프로세서에서 제공되는 CPU 카운터이고, Platform Events는 현재 컴퓨터 프로세서의 CPU 카운터이기 때문에 프로세서 종류에 따라 다른 항목이 표시될 수 있다. 성능 카운터를 사용해 샘플링을 수행하기 위해서는 프로세서 아키텍처를 충분히 이해하고 있어야 한다. 샘플링 결과 데이터를 적절하게 해석해야 성능 장애 원인을 정확히 분석할 수 있다. <그림 11>의 용어들이 아직 익숙하지 않다면 구현 코드를 수정하기 보다는 프로세서 아키텍처를 우선 학습해야 할 것이다.



OpenMP와 PPL 등 다양한 병렬 라이브러리를 사용하면 라이브러리가 제공하는 기본적인 특징으로 인해 데이터 레이스와 같은 특이한 상황이 아니고서야 어느 정도의 성능 향상 결과를 기대할 수 있다. 그러나 실제로 목표하는 성능 향상 효과를 얻긴 어렵다. 이때는 병렬 라이브러리만이 아닌 프로세서 아키텍처에 대한 이해가 함께 병행돼야 한다. 그러면 병렬 라이브러리를 깊이 있게 이해하고 사용할 수 있게 된다. 성능 카운터에서 제시되는 세부 CPU 카운터 항목들이 하드웨어 아키텍처 이해 수준을 평가하는 척도가 될 수도 있을 것이다. 비주얼 스튜디오의 UI에서 확인할 수 있었던 성능 카운터 목록 정보를 VSPerfCmd에서는 /QueryCounters 옵션으로 <그림 12>와 같이 확인할 수 있다. <그림 11>에서 Portable Events와 Platform Events가 <그림 12>에서는 ‘이식 가능한 카운터’와 ‘플랫폼 카운터’로 번역된다. 또 세부 그룹화 없이 단순 목록으로 표시된다.



이는 지금까지 확인한 샘플링 프로파일링 방법이 CPU 동작과 밀접한 관련이 있다는 얘기다. 즉 CPU가 활발하게 사용되는 경우에만 성능 데이터를 수집함을 뜻한다. 만약 성능 데이터 수집 대상 프로그램이 디스크, 네트워크 또는 기타 리소스를 사용하기 위해 대기 상태로 빠지게 되면 CPU 사용률이 낮아질 것이고 이로 인해 성능 분석 데이터 수집 빈도 역시 줄어들게 된다.

정리하면 첫째, 샘플링은 배포된 바이너리 파일을 수정하지 않고, 또한 프로그램 운영 중에 거의 영향을 주지 않으면서 성능 데이터를 수집할 수 있다. 또한 전수 조사를 수행하지 않기 때문에 성능 분석 시간이 적게 소요된다. 이러한 특징으로 인해 프로그램의 성능을 처음 분석할 때 적합하다. 둘째, 샘플링의 데이터있다. 그 때문에 성능 분석 대상 프로그램이 CPU 사용률과 관련된 성능 장애일 때 적합하다고 할 수 있다. 비주얼 스튜디오 UI에서 지정했던 성능 분석 데이터 수집 이벤트(샘플 이벤트: 클록 주기, 페이지 폴트, 시스템 호출, 성능 카운터)를 VSPerfCmd에서 설정하는 방법과 샘플링과 관련된 다른 기능들을 다음 시간에 살펴 볼 것이다.



출처 : 마이크로소프트웨어 3월호

제공 : 데이터전문가 지식포털 DBguide.net