다음을 통해 공유


CPU 사용률을 분석하여 애플리케이션 성능 측정(C#, Visual Basic, C++, F#)

디버깅하는 동안 디버거에 통합된 CPU 사용량 진단 도구를 사용하여 성능 문제를 찾습니다. 디버거를 연결하지 않거나 실행 중인 앱을 대상으로 지정하지 않고도 CPU 사용량을 분석할 수 있습니다. 자세한 내용은 릴리스 또는 디버그 빌드에서 프로파일링 도구 실행에 대한 을 참조하고, CPU 프로파일링을 사용하여 성능 분석에 대한 을 참조하세요.

디버거가 일시 중지되면 진단 도구 창의 CPU 사용량 도구는 애플리케이션에서 실행되는 함수에 대한 정보를 수집합니다. 이 도구는 작업을 수행한 함수를 나열하고 샘플링 세션의 특정 세그먼트에 집중하는 데 사용할 수 있는 타임라인 그래프를 제공합니다.

중요하다

디버거 통합 진단 도구는 ASP.NET, ASP.NET Core 및 네이티브/C++ 개발을 포함하여 Visual Studio에서 .NET 개발에 지원됩니다. 해당 Visual Studio 워크로드이 필요합니다. 디버거를 사용하여 프로파일링 도구를 실행하려면 Windows 8 이상이 필요합니다(진단 도구 창).

이 자습서에서는 다음을 수행합니다.

  • CPU 사용률 데이터 수집
  • CPU 사용률 데이터 분석

1단계: CPU 사용률 데이터 수집

  1. Visual Studio에서 디버그하려는 프로젝트를 열고 CPU 사용량을 검사할 지점에서 앱에서 중단점을 설정합니다.

  2. 분석하려는 코드의 함수 또는 영역 끝에 두 번째 중단점을 설정합니다.

    두 개의 중단점을 설정하여 데이터 수집을 분석하려는 코드 부분으로 제한할 수 있습니다.

  3. 진단 도구 창은 해제하지 않은 한 자동으로 표시됩니다. 창을 다시 표시하려면 디버그>Windows>진단 도구 표시을 클릭합니다.

  4. 도구 모음에서 도구 선택 설정을 사용하여 CPU 사용량, 메모리 사용량또는 둘 다를 볼지 여부를 선택할 수 있습니다. Visual Studio Enterprise를 실행하는 경우, 도구>옵션>IntelliTrace메뉴에서 IntelliTrace를 활성화하거나 비활성화할 수 있습니다.

    진단 도구를 보여 주는 스크린샷

    진단 도구를 보여 주는 스크린샷

    주로 CPU 사용률을 확인하므로 CPU 사용량 사용하도록 설정되어 있는지 확인합니다(기본적으로 사용하도록 설정됨).

  5. 디버그>디버깅 시작을 클릭합니다(또는 도구 모음에서 시작을 클릭하거나 F5).

    앱 로드가 완료되면 진단 도구의 요약 보기가 나타납니다. 창을 열어야 하면 디버그>Windows>진단 도구 표시을 클릭하십시오.

    진단 도구 요약 탭을 보여 주는 스크린샷.

    진단 도구 요약 탭을 보여 주는 스크린샷.

    이벤트에 대한 자세한 내용은 진단 도구 창의 이벤트 탭을 검색 및 필터링하는 방법을 참조하세요.

  6. 첫 번째 중단점이 적중되는 시나리오를 실행합니다.

  7. 디버거가 일시 중지된 동안 CPU 사용량 데이터 컬렉션을 사용하도록 설정한 다음 CPU 사용량 탭을 엽니다.

    CPU 프로파일링을 활성화하는 진단 도구의 스크린샷

    진단 도구가 CPU 프로파일링을 활성화하는 것을 보여주는 스크린샷

    CPU 프로필 을 선택하면, Visual Studio에서 함수의 기록을 시작하고, 실행 시간을 측정합니다. 애플리케이션이 중단점에서 중지된 경우에만 수집된 데이터를 볼 수 있습니다.

  8. F5 키를 눌러 두 번째 중단점까지 앱을 진행합니다.

    이제 두 중단점 간에 실행되는 코드 영역에 대한 애플리케이션에 대한 성능 데이터가 있습니다.

    프로파일러가 스레드 데이터 준비를 시작합니다. 완료되기를 기다립니다.

    스레드를 준비하는 진단 도구를 보여주는 스크린샷

    진단 도구가 스레드를 준비하는 모습을 보여주는 스크린샷

    CPU 사용량 도구는 CPU 사용량 탭에 보고서를 표시합니다.

    진단 도구 CPU 사용 탭을 보여주는 스크린샷.

    진단 도구 CPU 사용 탭을 확인할 수 있는 화면 캡처.

  9. 분석할 보다 구체적인 코드 영역을 선택하려면 CPU 타임라인에서 지역을 선택합니다(프로파일링 데이터를 표시하는 지역이어야 합니다).

    시간 세그먼트를 선택하는 진단 도구를 보여 주는 스크린샷

    시간 세그먼트를 선택하는 진단 도구를 보여 주는 스크린샷

    이 시점에서 데이터 분석을 시작할 수 있습니다. 데이터를 수집하거나 표시하는 데 문제가 있는 경우 프로파일링 오류 문제 해결 및문제 해결을 참조하세요.

    성능 문제를 식별하려고 할 때 여러 측정을 수행합니다. 성능은 기본적으로 실행마다 다르며, 코드 경로는 일반적으로 DLL 로드, JIT 컴파일 메서드 및 캐시 초기화와 같은 일회성 초기화 작업으로 인해 처음 실행할 때 속도가 느려집니다. 여러 측정을 통해 표시되는 메트릭의 범위와 중앙값을 더 잘 파악할 수 있으므로 처음과 코드 영역의 안정적인 상태 성능을 비교할 수 있습니다.

2단계: CPU 사용률 데이터 분석

CPU 사용량에서 함수 목록을 검사하고, 가장 많은 작업을 수행하는 함수를 식별한 다음, 각 함수를 자세히 살펴보면서 데이터를 분석하는 것이 좋습니다.

  1. 함수 목록에서 가장 많은 작업을 수행하는 함수를 검사합니다.

    진단 도구 CPU 사용량 함수 목록을 보여주는 스크린샷

    CPU 사용량 함수 목록을 보여 주는 진단 도구 스크린샷

    함수는 가장 많은 작업을 수행하는 함수부터 순서대로 나열됩니다(호출 순서가 아님). 이렇게 하면 가장 오래 실행되는 함수를 빠르게 식별할 수 있습니다.

  2. 함수 목록에서 많은 작업을 수행하는 앱 함수 중 하나를 두 번 클릭합니다.

    함수를 두 번 클릭하면 왼쪽 창에서 함수 보기가 열립니다. 드롭다운 메뉴에서 발신자/수신자 보기를 선택합니다.

    호출자 수신자 보기를 보여주는 진단 도구의 스크린샷

    이 보기에서 선택한 함수는 제목과 현재 함수 상자에 표시됩니다(이 예제에서는 DoWork). 현재 함수를 호출한 함수는 함수아래에 왼쪽에 표시되며, 현재 함수에서 호출하는 모든 함수는 오른쪽의 호출된 함수 상자에 표시됩니다. (현재 함수를 변경하려면 두 상자 중 하나를 선택할 수 있습니다.)

    이 보기에서는 함수가 완료하는 데 걸린 총 시간(ms) 및 전체 앱 실행 시간의 백분율을 보여 줍니다. 함수 본문 호출 및 호출된 함수에 소요된 시간을 제외하고 함수 본문에 소요된 총 시간(및 시간 비율)도 보여 줍니다.

    함수를 두 번 클릭하면 왼쪽 창에서 호출자/호출 수신자 보기가 열립니다.

    호출자 및 수신자 보기를 보여주는 진단 도구 스크린샷

    이 보기에서 선택한 함수는 제목과 현재 함수 상자에 표시됩니다(이 예제에서는 GetNumber). 현재 함수를 호출한 함수는 함수아래에 왼쪽에 표시되며, 현재 함수에서 호출하는 모든 함수는 오른쪽의 호출된 함수 상자에 표시됩니다. (현재 함수를 변경하려면 두 상자 중 하나를 선택할 수 있습니다.)

    이 보기에서는 함수가 완료하는 데 걸린 총 시간(ms) 및 전체 앱 실행 시간의 백분율을 보여 줍니다. 함수 본문 호출 및 호출된 함수에 소요된 시간을 제외하고 함수 본문에 소요된 총 시간(및 시간 비율)도 보여 줍니다. 이 예제에서는 2389ms 중 2367ms가 함수 본문에 사용되었고 나머지 22ms는 이 함수에서 호출한 외부 코드에서 사용되었습니다.

    함수 본문 높은 값은 함수 자체 내에서 성능 병목 상태를 나타낼 수 있습니다.

  3. 함수가 호출되는 순서를 보여 주는 상위 수준 보기를 보려면 창 위쪽의 드롭다운 목록에서 호출 트리 선택합니다.

    그림의 각 번호 매기기 영역은 프로시저의 단계와 관련이 있습니다.

    진단 도구 호출 트리

    이미지 묘사
    1단계 애플리케이션을 나타내는 CPU 사용량 호출 트리의 최상위 노드입니다.
    2단계 대부분의 앱에서 외부 코드 표시 옵션을 사용하지 않도록 설정하면 두 번째 수준 노드는 앱을 시작 및 중지하고, UI를 그리고, 스레드 예약을 제어하고, 앱에 다른 하위 수준 서비스를 제공하는 시스템 및 프레임워크 코드가 포함된 [외부 코드] 노드입니다.
    3단계 두 번째 수준 노드의 자식은 두 번째 수준 시스템 및 프레임워크 코드에서 호출하거나 만든 사용자 코드 메서드 및 비동기 루틴입니다.
    4단계 메서드의 자식 노드에는 부모 메서드의 호출에 대한 데이터만 포함됩니다. 외부 코드 표시 사용하지 않도록 설정하면 앱 메서드에 [외부 코드] 노드가 포함될 수도 있습니다.

    열 값에 대한 자세한 내용은 다음과 같습니다.

    • 총 CPU은 함수와 그에 의해 호출된 모든 함수들에 의해 수행된 작업의 양을 나타냅니다. 총 CPU 값이 높을수록 전반적으로 비용이 가장 많이 드는 함수를 가리킵니다.

    • 자체 CPU는 함수 본문 내에서 코드가 수행한 작업의 양을 나타내며, 함수가 호출한 다른 함수에서 수행된 작업은 제외됩니다. 높은 자체 CPU 값은 함수 자체 내에서 성능 병목 상태를 나타낼 수 있습니다.

    • 모듈 함수를 포함하는 모듈의 이름 또는 [외부 코드] 노드의 함수를 포함하는 모듈의 수입니다.

    호출 트리 뷰에서 CPU의 가장 높은 비율을 사용하는 함수 호출을 보려면 핫 경로 확장클릭합니다. 핫 경로는 가장 큰 영향을 미칠 영역에 대한 조사에 집중하는 데 도움이 될 수 있습니다.

    진단 도구 핫 경로를 보여 주는 스크린샷

    메모

    호출 트리에 코드가 "중단됨" 코드 또는 "읽을 수 없는 스택"으로 표시된 경우 ETW(Windows용 이벤트 추적) 이벤트가 삭제되었을 가능성이 있음을 나타냅니다. 동일한 추적을 두 번째로 수집하여 문제를 해결해 보세요.

  4. 데이터의 다른 보기를 보려면 창 위쪽의 드롭다운 목록에서 플레임 그래프 선택합니다.

    화염 그래프는 데이터를 분석하는 데 도움이 될 수 있는 호출 트리의 다른 시각화를 제공합니다. 자세한 내용은 불꽃 그래프사용하여 핫 경로 식별을 참조하세요.

외부 코드 보기

외부 코드는 작성하는 코드에 의해 실행되는 시스템 및 프레임워크 구성 요소의 함수입니다. 외부 코드에는 앱을 시작 및 중지하고, UI를 그리고, 스레딩을 제어하고, 앱에 다른 하위 수준 서비스를 제공하는 함수가 포함되어 있습니다. 대부분의 경우 외부 코드에 관심이 없으므로 CPU 사용량 도구는 사용자 메서드의 외부 함수를 하나의 [외부 호출] 노드로 수집합니다.

외부 코드의 호출 경로를 보려면 설정 목록에서 내 코드만 표시을 선택 해제한 후 적용을 선택하십시오.

설정을 보여 주는 스크린샷을 다음 내 코드만 표시합니다.

외부 코드는 작성하는 코드에 의해 실행되는 시스템 및 프레임워크 구성 요소의 함수입니다. 외부 코드에는 앱을 시작 및 중지하고, UI를 그리고, 스레딩을 제어하고, 앱에 다른 하위 수준 서비스를 제공하는 함수가 포함되어 있습니다. 대부분의 경우 외부 코드에 관심이 없으므로 CPU 사용량 도구는 사용자 메서드의 외부 함수를 하나의 [외부 코드] 노드로 수집합니다.

외부 코드의 호출 경로를 보려면 필터 보기 목록에서 외부 코드 표시를 선택한 다음 적용을 선택합니다.

필터 보기를 선택하고 외부 코드를 표시하는 스크린샷

외부 코드 호출 체인이 깊이 중첩되어 있는 경우가 많아, 함수 이름 열의 너비가 가장 큰 모니터를 제외한 대부분의 컴퓨터 모니터의 디스플레이 너비를 초과할 수 있습니다. 이 경우 함수 이름은 [...]표시됩니다.

검색 상자를 사용하여 찾으려는 노드를 찾은 다음 가로 스크롤 막대를 사용하여 데이터를 표시합니다.

Windows 함수를 호출하는 외부 코드를 프로파일하는 경우, 최신의 pdb파일를 가지고 있는지 확인해야 합니다. 이러한 파일이 없으면 보고서 보기에 암호화되고 이해하기 어려운 Windows 함수 이름이 나열됩니다. 필요한 파일이 있는지 확인하는 방법에 대한 자세한 내용은 디버거기호(.pdb) 및 원본 파일 지정을 참조하세요.

다음 단계

이 자습서에서는 CPU 사용량 현황 데이터를 수집하고 분석하는 방법을 알아보았습니다. 프로파일러의 둘러보기를 이미 완료한 경우, 도구를 보다 효과적으로 사용하는 방법을 보여주는 자습서를 진행할 수 있습니다.

사례 연구: 코드 최적화에 대한 초보자 가이드

이 자습서에서는 디버깅하는 동안 CPU 사용량 현황 데이터를 수집하고 분석하는 방법을 알아보았습니다. 성능 프로파일러를 사용하여 릴리스 빌드 프로파일링에 대해 자세히 알아볼 수 있습니다.