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

데이터 기술 자료

데이터 기술 자료 상세보기
제목 Back to the x86 : 비주얼 스튜디오를 이용한 성능 분석
등록일 조회수 6888
첨부파일  

Back to the x86

비주얼 스튜디오를 이용한 성능 분석



C/C++ 성능 분석을 위한 다양한 방법들이 제공되고 있다. 그중 가장 대표적인 방법은 ‘샘플링(Sampling)’과 ‘계측(Instrumentation)’이다. 이번?시간에는 샘플링과 계측에 대한 개념을 살펴보고, 비주얼 스튜디오에서 샘플링과 계측을 통한 성능 분석 방법을 살펴 본다.



윈도우에서 개발 작업을 하고 있는 개발자라면 대부분 비주얼 스튜디오를 사용하고 있을 것이다. 최근 들어 대부분의 개발 도구들이 단순히 소프트웨어를 개발하기 위한 도구가 아닌 ALM(Application Lifecycle Management)까지 지원 영역을 확대하고 있는 추세이다. ALM을 대표하는 개념 중에 하나인 형상관리를 지원하기 위해서 비주얼 스튜디오도 TFS(Team Foundation Server)만이 아닌 Git까지 다양하게 지원하고 있다. 그리고 테스트를 위한 다양한 프레임워크를 지원하는 환경들도 제공하고 있다.

몇 년 전까지만 해도 C/C++ 관련 비주얼 스튜디오 테스트 기능들이 .NET에 비해 상대적으로 지원이 많이 미흡했었다. 그러나 비주얼 스튜디오 2012부터 C/C++ 관련 기능들이 대폭 개선되기 시작했다. 최근 공개된 비주얼 스튜디오 2015 프리뷰 버전에서도 이를 확인할 수 있다. 윈도우 환경에서 C/C++ 언어를 사용해 개발하는 개발자에게는 기쁜 소식일 것이다.

C/C++ 언어가 C#, Java, Python, JavaScript, TypeScript 등 다양한 언어들 속에서도 지속적으로 사랑 받고 있는 이유 중 하나는 바로 성능일 것이다. 그러나 C/C++ 언어를 사용했다고 해서 반드시 타 언어로 개발된 제품보다 성능이 항상 우수하다고 장담할 수는 없다. 성능에 최적화된 라이브러리와 프레임워크뿐만 아니라 성능 분석 도구를 활용해 지속적인 튜닝 작업을 하는 등 성능을 높이는 작업을 수행하기 때문에 특정 비즈니스 환경에서는 다른 성능 결과를 얻을 수도 있다.

라이브러리와 프레임워크 등은 해당 제품이 목표하는 비즈니스와 관련이 있기 때문에 프로젝트 성격에 따라 변할 수 있다. 그러나 성능 분석 도구는 비즈니스 목표와는 별개로 거의 대부분의 프로젝트에서 성능 최적화 활동을 위해 항상 요구된다. 비주얼 스튜디오는 이러한 요구사항을 만족시키기 위해 다양한 성능 분석 방법을 제공한다. 우선 비주얼 스튜디오는 크게 두 가지 방법으로 성능 측정 방법을 제공한다. 첫 번째는 비주얼 스튜디오를 사용해 성능을 분석하는 방법이다. 그리고 두 번째는 비주얼 스튜디오 없이 도스 콘솔모드에서 성능 분석을 하는 것이다. 특히 도스 콘솔모드에서 지원하는 성능 분석 방법은 비쥬얼 스튜디오가 반드시 설치돼 있을 필요가 없기 때문에 다양한 운영 환경에서 테스트할 수 있는 장점이 있다. 이번 글에서는 비주얼 스튜디오를 사용한 성능 분석을 살펴볼 것이다. 버전은 비주얼 스튜디오 2013을 기준으로 한다.



비주얼 스튜디오의 성능 분석

비주얼 스튜디오를 실행해 성능 분석을 수행할 솔루션을 불러온다. 그리고 <그림 1>과 같이 ‘분석 → 성능 및 진단’을 선택한다.





2014년 11월 12일에 발표된 비주얼 스튜디오 2013 업데이트 4를 설치하면 <그림 2>와 같이 GPU 사용 현황까지 분석할 수 있다. ‘GPU 사용 현황’을 선택해 분석하면 <그림 3>과 같이 CPU와 GPU 사용률을 동시에 분석할 수 있다. GPU 분석과 관련된 자세한 내용은 다음 시간에 이야기하도록 하겠다.



<그림 4>와 같이 성능 마법사 첫 단계에서는 프로파일 방법을 선택한다. CPU 샘플링, 계측, .NET 메모리 할당 그리고 리소스 경합 데이터(동시성) 중 하나를 선택하게 되는데, 필자가 테스트할 예제는 네이티브 C/C++ 만을 이용해 개발하기 때문에 .NET 메모리 할당 선택은 지금 해당 사항이 없다. 그리고 동시성과 관련된 예제 코드가 아니기 때문에 리소스 경합 데이터도 선택할 필요가 없다. 이 두 가지를 제외하면 성능 분석을 위해 선택할 수 있는 것은 CPU 샘플링과 계측뿐이다.

분석 전에 먼저 CPU 샘플링과 계측에 대한 개념부터 확인해 보자. CPU 샘플링은 빌드된 바이너리를 전혀 수정하지 않고 분석 프로세스가 실행 중일 때 일정한 간격(샘플링 간격)으로 CPU에 인터럽트를 걸어 해당 프로세스의 정보(함수 호출 스택 등)를 수집한다. 샘플링의 단점은 샘플링 간격보다 작은 작업 함수의 수행 결과 정보를 수집할 수 없어 수집된 정보에 대한 오차가 발생할 가능성이 있다는 것이다. 그러나 바이너리를 수정하지 않기 때문에 분석 시간이 빠르다.

계측은 성능 분석을 위해서 빌드된 바이너리를 수정한다. 수정된 바이너리에서는 성능 분석을 위한 특수 코드를 분석 대상 함수의 시작과 끝에 모두 추가한다. 그 결과 모든 함수에 대한 성능 정보를 수집할 수 있게 된다. 또한 CPU 샘플링에서 확인할 수 없었던 시스템 수준의 자세한 정보까지 확인할 수 있다.

그러나 성능 분석을 위해 추가된 코드로 인해 분석 시간이 CPU 샘플링에 비해 상대적으로 더 많이 소요된다. 또한 성능 분석을 목적으로 한 까닭에 코드가 분기 예측(Branch prediction)과 같은 CPU 최적화를 방해할 수도 있다. 이는 CPU 최적화에 따른 실행 순서에 영향을 미쳐 잘못된 성능 정보를 얻게 되는 결과를 초래할 수 있다.



성능 마법사를 마치면 성능 분석이 자동으로 시작된다. 그런데 비주얼 스튜디오를 관리자 권한으로 실행하지 않았다면 <그림 5>와 같이 관리자 권한을 요구하는 대화상자가 표시된다.



성능 분석을 수행할 때는 <그림 5>에 표시된 메시지 내용과 같이 프로파일러 드라이버를 사용하기 때문에 관리자 권한이 필요하다. 이제 CPU 샘플링을 확인해 보자. 성능 분석이 완료되면 자동으로 수집된 정보를 이용해 요약된 정보가 <그림 6>과 같이 표시된다.



수집된 정보를 다양한 기준으로 확인할 수 있는데 그중 ‘함수 정보’를 선택하면 <그림 7>과 같이 소스 코드에서 함수 단위로 ‘전용 샘플 비율(%)’을 확인할 수 있다.



성능 분석 결과는 <그림 8>과 같이 성능 탐색기에 분석 대상 정보(프로세스)와 분석 결과가 기록된 .VSP 파일을 통해 확인할 수 있다. 분석 결과가 기록된 .VSP 파일에서 마우스 오른쪽 버튼을 클릭하면 추가적으로 제공되는 다양한 기능을 볼 수 있다.



보고서 데이터 내보내기와 성능 보고서 비교 메뉴를 좀더 살펴보도록 하자. 보고서 데이터 내보내기를 선택하면 <그림 9>와 같이 보고서 내보내기 대화상자가 표시된다. 보고서는 CSV와 XML 형식을 제공한다.



그리고 내보낼 정보를 체크하면 보고서 위치의 지정한 폴더에 [보고서 접두사]_[뷰].[파일 형식]과 같이 선택된 뷰 단위로 파일이 생성된다. <그림 10>은 [보고서 접두사]로 StructureSegregation Principle을 지정하고 [파일 형식]을 CSV로 선택했을 때 생성된 성능 분석 보고서다.



동일한 프로젝트를 대상으로 성능 분석을 수행하면 여러 .VSP 파일이 성능 탐색기에 추가될 것이다. 생성된 여러 .VSP 파일 중에서 비교 분석을 수행할 2개 파일을 선택한 후 마우스 오른쪽 버튼을 클릭해 ‘성능 보고서 비교’ 메뉴를 클릭하면 <그림 11>과 같이 성능 분석 결과를 비교할 수 있다.



계측 분석을 위해서는 바이너리의 수정이 요구된다. 그 때문에 프로젝트 속성을 먼저 수정해줘야 한다. <그림 12>와 같이 계측 성능 분석을 수행할 프로젝트의 속성에서 ‘링크 → 고급 → 프로필 → 예(/PROFILE)’을 지정하면 된다.



프로젝트 속성이 변경된 것을 확인한 후 성능 분석을 시작하면 ‘출력’ 창에 <리스트 1>과 같은 메시지가 출력된다.



<리스트 1> 계측 분석 출력 결과 프로파일링이 시작되었습니다. 원위치에서 C:SeminarSSPReleaseMyApp.exe 계측 정보 VSP3049: 작은 함수는 계측에서 제외됩니다. Microsoft (R) VSInstr Post-Link Instrumentation 12.0.31101 x86 Copyright (C) Microsoft Corp. All rights reserved. 처리할 파일: C:SeminarSSPReleaseMyApp.exe --> C:SeminarSSPReleaseMyApp.exe 원본 파일을 C:SeminarSSPReleaseMyApp.exe.orig(으)로 백업했습니다. 파일 C:SeminarSSPReleaseMyApp.exe 계측이 완료되었습니다. 프로파일링 프로세스 ID 2216(MyApp) 프로세스 ID 2216이(가) 종료되었습니다. C:SeminarSSPMyApp141220(7).vsp에 데이터를 기록했습니다. 프로파일링이 끝났습니다. C:SeminarSSPReleaseMyApp.exe의 기호를 로드했습니다. C:Windowssyswow64kernel32.dll의 기호를 로드하지 못했습니다. C:Windowssystem32MSVCR120.dll의 기호를 로드하지 못했습니다. C:WindowsSysWOW64 tdll.dll의 기호를 로드하지 못했습니다. 프로파일링이 완료되었습니다.



출력 메시지를 자세히 살펴 보면 MyApp.exe 파일을 “MyApp.exe.orig(으)로 백업했습니다”라는 문구를 확인할 수 있다. 이는 빌드된 바이너리에 성능 분석을 위해 특수한 코드를 추가한 수정된 바이너리를 대상으로 성능 분석을 수행하기 때문에 나타나는 것이다. 계측 분석이 완료되면 <그림 13>과 같이 요약 정보가 제공된다.



샘플링 결과와 같이 계측 결과 또한 ‘현재 뷰’에서 제공하는 다양한 기준에 따라 수집된 성능 결과 정보를 확인할 수 있다.

지금까지 샘플링과 계측 개념을 알아보고, 이러한 개념이 비주얼 스튜디오에서는 어떻게 적용되는지 살펴봤다. 비주얼 스튜디오를 이용한 성능 분석은 초급 사용자도 쉽게 접근할 수 있기 때문에 매우 유용하다. 단, 분석 결과를 스스로 이해하고 해석해 최적화 대상을 식별, 코드 수정 방향을 결정하는 것은 또 다른 과제일 것이다. 다음 시간에는 비주얼 스튜디오 설치 없이 샘플링과 계측으로 성능 분석을 수행하는 방법을 살펴볼 것이다.



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

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