Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Windows에서 프로파일링하기

WPR과 WPA 소개

메모리 사용량을 포함한 고수준 성능 분석은 Windows Performance Recorder(WPR)와 Windows Performance Analyzer(WPA)로 수행할 수 있습니다. 이름에서 알 수 있듯이 WPR은 시스템 통계를 (이벤트 추적 로그, 즉 ETL 파일 형태로) 기록하는 도구이고, WPA는 이 ETL 파일을 분석하는 도구입니다.

WPR은 시스템 전체의 통계를 수집하므로 rustc와 관련된 것뿐만 아니라 머신에서 실행 중인 다른 모든 것도 기록합니다. 분석할 때 관심 있는 항목만 골라 필터링할 수 있습니다.

이 도구들은 상당히 강력하지만, Rust 컴파일러를 제대로 프로파일링하려면 먼저 사용법을 어느 정도 익혀야 합니다.

여기서는 WPR과 WPA를 사용하여 Rust 컴파일러를 분석하는 방법을 살펴보고, rustc 분석을 더 쉽게 하도록 특별히 설계된 유용한 “프로필”(즉, WPR과 WPA의 기본값을 조정하는 설정 파일)의 링크도 제공합니다.

WPR과 WPA 설치하기

WPR과 WPA는 Windows Performance Toolkit의 일부로 설치할 수 있으며, Windows Performance Toolkit은 Windows Assessment and Deployment Kit(ADK)를 다운로드할 때 선택할 수 있는 옵션 중 하나입니다. ADK 설치 프로그램은 여기에서 다운로드할 수 있습니다. 반드시 Windows Performance Toolkit을 선택하십시오(다른 항목은 선택하지 않아도 됩니다).

기록하기

시스템 분석을 수행하려면 먼저 WPR로 시스템을 기록해야 합니다. WPR을 열고 창 하단에서 기록하려는 항목의 “프로필“을 선택하십시오. rustc 부트스트랩 과정의 메모리 사용량을 살펴보려면 다음 항목을 선택해야 합니다:

  • CPU 사용량
  • VirtualAlloc 사용량

“Heap usage“도 함께 기록하고 싶을 수 있지만, 이 항목은 모든 힙 할당을 하나하나 기록하므로 비용이 매우, 매우 클 수 있습니다. 고수준 분석에서는 이 항목을 꺼 두는 것이 가장 좋을 것입니다.

이제 기록할 수 있도록 환경을 준비해야 합니다. 메모리 사용량을 분석할 때는 디버그 심볼이 포함된 stage 1 컴파일러 빌드로 stage 2 컴파일러를 빌드하는 과정을 기록하는 것이 가장 좋습니다. rustc를 빌드하는 데 사용하는 컴파일러에 심볼이 있으면 WPA가 Rust 심볼을 올바르게 해석할 수 있으므로 분석에 큰 도움이 됩니다. 안타깝게도 stage 0 컴파일러에는 심볼이 활성화되어 있지 않으므로, stage 1 컴파일러를 빌드한 다음 stage 2 컴파일러를 직접 빌드해야 합니다.

이를 위해 bootstrap.toml 파일에 rust.debuginfo-level = 1을 설정했는지 확인하십시오. 이는 rustc가 부트스트래핑 시 스택 프레임을 포함하는 디버그 정보를 생성하도록 지시합니다.

이제 stage 1 컴파일러를 빌드할 수 있습니다: x build --stage 1 -i library 또는 원하는 다른 방식으로 stage 1 컴파일러를 빌드하십시오.

stage 1 컴파일러가 빌드되었으므로 이제 stage 2 빌드를 기록할 수 있습니다. WPR로 돌아가 “start” 버튼을 클릭하고 stage 2 컴파일러를 빌드하십시오(예: x build --stage=2 -i library). 이 과정이 끝나면 기록을 중지하십시오.

Save 버튼을 클릭하고, 저장이 완료되면 나타나는 “Open in WPA” 버튼을 클릭하십시오.

참고: 트레이스 파일이 상당히 크기 때문에 WPA가 파일을 모두 여는 데 시간이 다소 걸릴 수 있습니다.

분석

이제 ETL 파일이 WPA에서 열렸으므로 결과를 분석할 수 있습니다. 먼저 미리 만들어 둔 “프로필“을 적용하여 WPA를 rustc 부트스트랩 분석에 적합한 상태로 만듭니다. 프로필은 여기에서 내려받으십시오. 상단의 “Profiles” 메뉴를 선택한 다음 “apply“를 선택하고, 내려받은 프로필을 고르십시오.

다음과 비슷한 화면이 보일 것입니다.

다음으로, WPA가 Rust 스택 트레이스를 올바르게 디맹글할 수 있도록 디버그 심볼을 불러와 처리하게 해야 합니다. 이를 위해 “Trace“를 클릭한 다음 “Load Symbols“를 선택하십시오. 이 단계는 시간이 꽤 걸릴 수 있습니다.

WPA가 rustc의 심볼을 불러오고 나면 rustc.exe 노드를 펼쳐 할당량이 가장 큰 스택부터 파고들기 시작할 수 있습니다.

이를 위해 “Commit Stack”(커밋 스택) 열에서 [Root] 노드를 펼치고, 흥미로운 스택 프레임을 찾을 때까지 계속 펼쳐 나가겠습니다.

팁: 펼치려는 노드를 선택한 후 오른쪽 화살표 키를 누르십시오. 그러면 노드가 펼쳐지고, 펼쳐진 항목 중 그다음으로 큰 노드가 선택됩니다. 흥미로운 프레임에 도달할 때까지 오른쪽 화살표 키를 계속 누르면 됩니다.

이 샘플에서는 코드 생성을 거치는 호출들이 이 프로필 전체에 걸쳐 총 약 30GB의 메모리를 할당하고 있음을 확인할 수 있습니다.

기타 분석 탭

이 프로필에는 유용하게 쓸 수 있는 다른 탭도 몇 가지 포함되어 있습니다.

  • System Configuration
    • 캡처를 기록한 시스템에 대한 일반 정보입니다.
  • rustc 빌드 프로세스
    • rustc.exe, cargo.exe, link.exe 등 관련 프로세스를 나열한 평면 목록입니다.
    • 각 프로세스에는 해당 명령줄 인자가 나열됩니다.
    • 특정 rustc 프로세스가 무슨 작업을 하고 있었는지 파악하는 데 유용합니다.
  • rustc 빌드 프로세스 트리
    • 프로세스가 시작되고 종료된 시점을 보여 주는 타임라인입니다.
  • rustc CPU Analysis
    • rustc의 핫스팟을 보여 주도록 미리 구성된 차트가 들어 있습니다.
    • 이 차트들은 rustc가 어디에서 시간을 소비하는지 분석하는 데 도움이 되도록 설계되었습니다.
  • rustc 메모리 분석
    • rustc가 메모리를 할당하는 위치를 보여 주도록 미리 구성된 차트가 들어 있습니다.