다음을 통해 공유


성능 프로파일러에서 CPU 프로파일링을 사용하여 성능 분석(C#, Visual Basic, C++, F#)

앱에서 성능 문제 조사를 시작하는 좋은 방법은 CPU 프로파일러를 사용하여 CPU 사용률을 이해하는 것입니다. Visual Studio의 CPU 사용량 성능 도구는 C++, C#/Visual Basic에서 코드를 실행하는 데 소요된 CPU 활성 계산 시간과 백분율을 보여 줍니다.

CPU 사용량 도구를 사용하면 다음을 수행할 수 있습니다.

  • 팀의 코드베이스에서 속도가 느려지거나 프로세스가 중단되는 것을 진단합니다. 이 도구는 팀의 프로덕션 코드로 문제를 진단하는 데 도움이 될 수 있습니다. 성능 문제를 분석하고 진단할 수 있도록 데이터의 자동 인사이트 및 다양한 보기를 제공합니다.

  • DevOps 시나리오에서 성능 문제를 식별합니다. 예를 들어 고객이 성수기 동안 일부 요청 또는 주문이 소매 웹 사이트로 전송되지 않는다고 보고할 때 이 도구가 도움이 될 수 있습니다. 종종 문제는 프로덕션 중이며, 해당 시점에서 디버그하기가 어렵지만 이 도구는 문제의 충분한 정보와 증거를 캡처하는 데 도움이 될 수 있습니다. 추적 파일을 수집한 후 분석을 통해 잠재적인 원인을 빠르게 파악하고 코드 컨텍스트 내에서 제안을 제공하므로 다음 단계를 수행하여 문제를 해결할 수 있습니다.

  • 높은 CPU 사용률 확인 대기 시간 문제가 API 요청 내에 없는 경우 높은 CPU 사용률 및 CPU 사용량 도구와 관련된 기타 문제를 확인할 수 있습니다. CPU 사용량 도구를 사용하면 병목 상태를 식별하여 최적화할 위치를 좁힐 수 있습니다.

CPU 사용량 도구는 로컬 추적 세션과 프로덕션 모두에 유용합니다. 바로 가기 키, Alt+F2 다음 CPU 사용량선택하거나 dotnet 추적 또는dotnet-monitor같은 도구를 사용하여 이미 수집된 추적을 열어 CPU 사용량 도구를 실행할 수 있습니다. .NET 프로덕션 코드에서는 주로 이 방법으로 추적을 수집합니다.

열려 있는 Visual Studio 프로젝트, 설치된 Microsoft Store 앱 또는 실행 중인 앱 또는 프로세스에 연결된 CPU 사용량 도구를 실행할 수 있습니다. 릴리스 또는 디버그 빌드에서 CPU 사용량 도구를 실행할 수 있습니다. 자세한 내용은 릴리스 또는 디버그 빌드에서 프로파일링 도구 실행을 참조하세요.

다음 지침에서는 Visual Studio 성능 프로파일러를 사용하여 디버거 없이 CPU 사용량 도구를 사용하는 방법을 보여 줍니다. 이 예제에서는 로컬 컴퓨터에서 릴리스 빌드를 사용합니다. 릴리스 빌드는 실제 앱 성능에 대한 최상의 보기를 제공합니다. CPU 사용량 도구를 사용하여 성능을 향상시키는 방법을 보여 주는 자습서는 사례 연구: 코드최적화에 대한 초보자 가이드를 참조하세요.

일반적으로 로컬 컴퓨터는 설치된 앱 실행을 가장 잘 복제합니다. 원격 디바이스에서 데이터를 수집하려면 원격 데스크톱 연결을 통해서가 아니라 디바이스에서 직접 앱을 실행합니다.

CPU 사용률 데이터 수집

  1. Visual Studio 프로젝트에서 솔루션 구성을 릴리스 설정하고 로컬 Windows 디버거(또는 로컬 컴퓨터 )를 배포 대상으로 선택합니다.

    릴리스 및 로컬 컴퓨터 선택을 보여 주는 스크린샷 선택

    릴리스 및 로컬 컴퓨터 선택을 보여 주는 스크린샷

  2. 디버그>성능 프로파일러선택하세요.

  3. 사용 가능한 도구에서 CPU 사용량을 선택한 다음, 시작을 선택합니다.

    CPU 사용량 선택을 보여 주는 스크린샷

    CPU 사용량 선택을 보여 주는 스크린샷

    프로파일러를 시작하기 전에 컬렉션 일시 중지 옵션을 사용하도록 설정하면 진단 세션 보기에서 레코드 단추를 선택할 때까지 데이터가 수집되지 않습니다.

    메모

    도구를 보다 효율적으로 만드는 방법에 대한 자세한 내용은 프로파일러 설정 최적화 참조하세요.

  4. 앱이 시작되면 진단 세션이 시작되고 CPU 사용률 데이터가 표시됩니다. 데이터 수집을 마쳤으면 수집 중지을 선택합니다.

    CPU 사용량 데이터 수집 중지를 보여 주는 스크린샷

    CPU 사용량 데이터 수집 중지를 보여 주는 스크린샷

    CPU 사용량 도구는 데이터를 분석하고 보고서를 표시합니다. 데이터를 수집하거나 표시하는 데 문제가 있는 경우 프로파일링 오류 문제 해결 및문제 해결을 참조하세요.

    CPU 사용량 보고서를 보여 주는 스크린샷 . CPU 사용량 보고서.

    CPU 사용량 보고서를 보여 주는 스크린샷 . CPU 사용량 보고서.

    필터 드롭다운을 사용하여 표시할 스레드를 선택하거나 선택 취소하고 검색 상자를 사용하여 특정 스레드 또는 노드를 검색합니다.

CPU 사용률의 데이터 열

이름 묘사
총 CPU [단위, %] Total % 데이터 수식

선택한 시간 범위에서 함수에 대한 호출 및 함수에서 호출하는 함수에 사용되는 CPU 계산 시간 및 CPU 백분율(밀리초)입니다. 이는 시간 범위의 총 CPU 작업과 사용 가능한 총 CPU를 비교하는 CPU 사용률 타임라인 그래프와 다릅니다.
자체 CPU [단위, %] 자체 % 수식

선택한 시간 범위에서 함수를 호출하는 데 사용되는 CPU 계산 시간 및 CPU 백분율(함수에서 호출한 함수 제외)의 밀리초입니다.
모듈 일부 보기에서는 함수가 포함된 모듈의 이름을 표시하는 모듈 열이 표시됩니다.

CPU 인사이트 분석

Top Insights 섹션에 인사이트가 표시되는 경우 제공된 링크를 사용하여 식별된 문제에 대한 자세한 정보를 가져옵니다. 또한 코필로트를 사용하는 경우 코필로트 요청 단추가 코필로 채팅 창을 열고, 코필로트는 코드 및 식별된 문제에 따라 제안을 제공합니다.

자세한 내용은 CPU 인사이트참조하세요.

CPU 사용률 분석

CPU 사용량 보고서를 분석하려면 세부 정보열기를 클릭하거나 최상위 함수 중 하나를 클릭하여 함수 보기를 엽니다.

이 보고서는 진단 데이터의 다양한 보기를 제공합니다.

보기 묘사
호출자/호출 수신자 특정 함수의 CPU 시간, 이를 호출한 함수 및 호출하는 함수에 대한 자세한 보기입니다. 성능 데이터는 데이터 수집 기간 동안 집계됩니다. 호출 함수와 피호출 함수를 선택하여 호출 경로를 탐색할 수 있습니다.
호출 트리 함수 호출 경로의 계층적 뷰입니다. CPU 시간이 가장 많이 걸리는 호출 경로(핫 경로)를 식별하는 데 사용됩니다.
모듈 데이터 수집 기간 동안 집계된 개별 모듈에서 소요된 CPU 시간의 보기입니다. 높은 호출 수 및/또는 성능 문제의 조합으로 인해 성능 병목 상태일 수 있는 모듈을 식별하는 데 사용됩니다.
기능 데이터 수집 기간 동안 집계된 개별 함수에 소요된 CPU 시간의 보기입니다. 높은 호출 수 및/또는 성능 문제의 조합으로 인해 성능 병목 상태일 수 있는 함수를 식별하는 데 사용됩니다.
화염 그래프 화염 그래프 시각화에서 함수 호출 경로의 계층적 뷰입니다. CPU 시간이 가장 많이 걸리는 호출 경로(핫 경로)를 식별하는 데 사용됩니다.

보고서를 분석하려면 자세한 보고서 만들기클릭합니다.

이 보고서는 진단 데이터의 다양한 보기를 제공합니다.

  • 호출자/호출 수신자
  • 호출 트리

호출자/호출 수신자를 제외한 모든 보기에서는 진단 보고서가 총 CPU 을 기준으로 높은 순에서 낮은 순으로 정렬됩니다. 열 머리글을 선택하여 정렬 순서 또는 정렬 열을 변경합니다. 관심 있는 함수를 두 번 클릭하면 함수의 원본과 해당 함수에서 소요되는 시간을 보여 주는 강조 표시가 표시됩니다. 표는 호출된 함수를 포함하여 함수에서 소요된 시간(총 CPU)과 관련된 데이터가 있는 열을 보여 주며, 호출된 함수를 제외하고 함수 자체에서 소요된 시간(자체 CPU)을 보여 주는 두 번째 열도 포함되어 있습니다.

이 데이터는 함수 자체가 성능 병목 상태인지 여부를 평가하는 데 도움이 될 수 있습니다. 타사 코드 또는 런타임 라이브러리가 엔드포인트가 느리거나 리소스 사용량이 많은 이유인지 확인하기 위해 메서드가 표시하는 데이터의 양을 결정합니다.

화염 그래프 사용에 대한 자세한 내용은 불꽃 그래프사용하여 핫 경로 식별을 참조하세요.

CPU 사용량 호출 트리

호출 트리를 보려면 보고서에서 부모 노드를 선택합니다. 기본적으로 CPU 사용량 페이지가 호출자/호출 수신자 보기로 열립니다. 현재 보기 드롭다운에서 호출 트리 선택합니다.

핫 경로 확장 클릭하고 핫 경로 표시 단추를 클릭하여 호출 트리 보기에서 CPU의 가장 높은 비율을 사용하는 함수 호출을 볼 수 있습니다.

호출 트리 구조

호출 트리 구조를 보여 주는 스크린샷

호출 트리 구조를 보여 주는 스크린샷

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

외부 코드

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

외부 코드의 호출 경로를 보려면 기본 보고서 요약 페이지(오른쪽 창)에서 설정 드롭다운에서 내 코드만 표시의 선택을 취소한 다음 적용을 선택합니다. (설정 드롭다운은 자세한 보기가 아니라 기본 보고서 요약 페이지에서 사용할 수 있습니다.)

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

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

외부 코드의 호출 경로를 보려면 기본 진단 보고서 페이지(오른쪽 창)에서 필터 드롭다운에서 외부 코드 표시를 선택한 다음, 적용선택합니다. CPU 사용량 페이지의 호출 트리 보기는 외부 코드 호출을 확장합니다. (필터 드롭다운은 자세한 보기가 아니라 기본 진단 페이지에서만 사용할 수 있습니다.)

외부 코드 표시를 보여주는 스크린샷

내 코드만 표시을 비활성화하면 CPU 사용량 페이지의 호출 트리 보기에서 외부 코드 호출이 확장됩니다.

많은 외부 코드 호출 체인은 깊이 중첩되어 있으므로 체인의 너비가 함수 이름 열의 표시 너비를 초과할 수 있습니다. 그런 다음 함수 이름은 다음 이미지와 같이 표시됩니다.

호출 트리에 중첩된 외부 코드를 보여 주는 스크린샷.

많은 외부 코드 호출 체인은 깊이 중첩되어 있으므로 체인의 너비가 함수 이름 열의 표시 너비를 초과할 수 있습니다. 그런 다음 함수 이름이 ...나타납니다.

호출 트리에 중첩된 외부 코드를 보여 주는 스크린샷.

찾으려는 함수 이름을 찾으려면 검색 상자를 사용합니다. 선택한 줄 위로 마우스를 가져가거나 가로 스크롤 막대를 사용하여 데이터를 봅니다.

중첩된 외부 코드 검색 과정을 보여주는 스크린샷

중첩된 외부 코드 검색 과정을 보여주는 스크린샷

CPU 사용량 호출 트리의 비동기 함수

컴파일러가 비동기 메서드를 발견하면 숨겨진 클래스를 만들어 메서드의 실행을 제어합니다. 개념적으로 클래스는 상태 컴퓨터입니다. 클래스에는 원래 메서드를 비동기적으로 호출하는 컴파일러 생성 함수와 콜백, 스케줄러 및 반복기를 실행하는 데 필요한 함수가 있습니다. 부모 메서드가 원래 메서드를 호출할 때 컴파일러는 부모의 실행 컨텍스트에서 메서드를 제거하고 앱 실행을 제어하는 시스템 및 프레임워크 코드의 컨텍스트에서 숨겨진 클래스 메서드를 실행합니다. 비동기 메서드는 하나 이상의 다른 스레드에서 실행되는 경우가 많지만 항상 실행되는 것은 아닙니다. 이 코드는 CPU 사용량 호출 트리에 트리의 위쪽 노드 바로 아래에 [외부 코드] 노드의 자식으로 표시됩니다.

다음 예제에서 [외부 코드] 아래의 처음 두 노드는 상태 컴퓨터 클래스의 컴파일러 생성 메서드입니다. 세 번째 노드는 원래 메서드에 대한 호출입니다.

비동기 노드를 보여 주는 스크린샷. 비동기 노드

생성된 메서드를 확장하여 진행 중인 작업을 표시합니다.

확장된 비동기 노드를 보여 주는 Screenshot that shows expanded asynchronous node.스크린샷 확장된 비동기 노드Expanded asynchronous node

확장된 비동기 노드를 보여 주는 Screenshot that shows expanded asynchronous node.스크린샷 확장된 비동기 노드Expanded asynchronous node

  • MainPage::GetMaxNumberAsyncButton_Click 작업 값 목록을 관리하고, 결과의 최대값을 계산하고, 출력을 표시합니다.

  • MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNextGetNumberAsync호출을 감싸는 48개 작업을 예약하고 시작하기 위해 필요한 활동을 보여 줍니다.

  • MainPage::<GetNumberAsync>b__b GetNumber호출하는 작업의 활동을 보여 줍니다.

호출 수 수집(.NET)

함수 보기에서 호출 수를 보려면 프로파일러를 시작하기 전에 설정을 사용하도록 설정할 수 있습니다. 이 설정은 .NET 프로젝트 형식에 대해 지원되며 프로파일러에서 프로세스를 시작해야 합니다. 연결 시나리오는 지원되지 않습니다.

  1. 성능 프로파일러에서 CPU 사용량에 대한 설정 아이콘을 선택합니다.

    CPU 사용량에 대한 설정 아이콘을 보여 주는 스크린샷 CPU 사용량에 대한

  2. 호출 수 수집(.NET에만 해당) 옵션을 사용하도록 설정합니다.

    CPU 사용량에 대한 설정을 보여 주는 스크린샷

  3. CPU 사용량 현황 데이터를 수집합니다.

  4. 함수 보기를 연 다음 호출 개수 열이 표시되도록 설정되어 있는지 확인합니다.

    열이 표시되지 않으면 열 머리글을 마우스 오른쪽 단추로 클릭하여 표시되는 열을 선택합니다.

    호출 개수 데이터를 보여 주는 스크린샷