Application Insights Profiler 데이터 보기

웹 성능 테스트를 실행 중이라고 가정해 보겠습니다. 이 경우 추적을 통해 로드 발생 시 웹앱의 실행 방식을 파악해야 합니다. 이 문서에서는 다음을 수행합니다.

  • 웹 성능 테스트를 시작하거나 Profiler 주문형 세션을 시작하여 웹앱에 대한 트래픽을 생성합니다.
  • 로드 테스트 또는 Profiler 세션 후에 Profiler를 봅니다.
  • Profiler 성능 데이터 및 호출 스택을 읽는 방법을 알아봅니다.

Azure 서비스에 대한 트래픽 생성

Profiler에서 추적을 업로드하려면 서비스가 요청을 적극적으로 처리해야 합니다.

Profiler를 새로 사용하는 경우 짧은 로드 테스트를 실행합니다.

Azure 서비스에 이미 들어오는 트래픽이 있거나 트래픽을 수동으로 생성하려는 경우 로드 테스트를 건너뛰고 Profiler 주문형 세션을 시작합니다.

  1. Azure 서비스에 대한 Application Insights 개요 페이지의 왼쪽 메뉴에서 성능을 선택합니다.

  2. 성능 창의 Profiler 설정 상단 메뉴에서 Profiler를 선택합니다.

    성능 창의 프로파일러 단추 스크린샷

  3. Profiler 설정 페이지가 로드되면 지금 프로파일링을 선택합니다.

    Profiler 페이지 기능 및 설정의 스크린샷.

추적 보기

  1. Profiler 세션 실행이 끝나면 성능 창으로 돌아갑니다.

  2. 드릴 인...에서 Profiler 추적을 선택하여 추적을 봅니다.

    추적 탐색기 페이지의 스크린샷.

추적 탐색기에서 다음 정보를 표시합니다.

Assert 설명
프로필 트리 v. 플레임 그래프 추적을 트리 또는 그래프 형식으로 봅니다.
핫 경로 가장 큰 리프 노드를 열려면 선택합니다. 대부분의 경우에서 이 노드는 성능 병목에 인접한 상태가 됩니다.
프레임워크 종속성 추적과 연관된 추적된 각 프레임워크 종속성을 보려면 선택합니다.
이벤트 숨기기 추적 보기에서 숨길 문자열을 입력합니다. 제안을 보려면 추천 이벤트를 선택합니다.
이벤트 이벤트 또는 함수 이름입니다. 트리는 발생한 코드와 이벤트의 혼합을 보여 줍니다(예: SQL 및 HTTP 이벤트). 최상위 이벤트는 전체 요청 기간을 나타냅니다.
모듈 추적된 이벤트 또는 함수가 발생한 모듈입니다.
스레드 시간 작업의 시작과 끝 간의 시간 간격입니다.
타임라인 함수 또는 이벤트가 다른 함수와 관련해서 실행된 시기입니다.

성능 데이터를 읽는 방법

Profiler는 샘플링 메서드와 계측의 조합을 사용하여 애플리케이션의 성능을 분석합니다. 세부 컬렉션을 수행하는 동안 Profiler는 다음을 수행합니다.

  • 각 컴퓨터 CPU의 명령 포인터를 밀리초마다 샘플링합니다.
    • 각 샘플은 스레드의 전체 호출 스택을 캡처하여 상위 수준과 하위 수준의 추상화에서 모두 자세한 정보를 제공합니다.
  • 다음과 같은 활동 상관 관계 및 인과 관계를 추적하는 이벤트를 수집합니다.
    • 컨텍스트 전환 이벤트
    • TPL(작업 병렬 라이브러리) 이벤트
    • 스레드 풀 이벤트

타임라인 보기에 표시되는 호출 스택은 샘플링 및 계측의 결과입니다. 각 샘플은 스레드의 전체 호출 스택을 캡처하므로, Microsoft .NET Framework의 코드뿐만 아니라 참조하는 다른 프레임워크의 코드를 포함합니다.

개체 할당(clr!JIT_New 또는 clr!JIT_Newarr1)

clr!JIT_Newclr!JIT_Newarr1은 관리되는 힙에서 메모리를 할당하는 .NET Framework의 도우미 함수입니다.

  • clr!JIT_New는 개체가 할당될 때 호출됩니다.
  • clr!JIT_Newarr1은 개체 배열이 할당될 때 호출됩니다.

이 두 함수는 일반적으로 빠르게 작동합니다. 타임라인에서 clr!JIT_New 또는 clr!JIT_Newarr1에 작동 시간이 소요되면 코드는 많은 개체를 할당하고 많은 양의 메모리를 사용하고 있는 것일 수 있습니다.

코드 로드(clr!ThePreStub)

clr!ThePreStub은 일반적으로 JIT(Just-In-Time) 컴파일을 포함하는 초기 실행을 위해 코드를 준비하는 .NET Framework의 도우미 함수입니다. 각 C# 메서드의 경우 clr!ThePreStub은 프로세스 동안 최대 한 번만 호출되어야 합니다.

clr!ThePreStub이 요청에 대해 추가 시간이 걸리는 경우 해당 메서드를 실행하는 첫 번째 요청입니다. .NET Framework 런타임은 첫 번째 메서드를 로드하는 데 상당한 시간이 걸립니다. 고려할 사항은 다음과 같습니다.

  • 사용자가 액세스하기 전에 코드의 해당 부분을 실행하는 준비 프로세스를 사용합니다.
  • 어셈블리에서 네이티브 이미지 생성기(ngen.exe)를 실행합니다.

잠금 경합(clr!JITutil_MonContention 또는 clr!JITutil_MonEnterWorker)

clr!JITutil_MonContention 또는 clr!JITutil_MonEnterWorker는 현재 스레드가 잠금 해제를 기다리고 있음을 나타냅니다. 이 텍스트는 다음과 같은 경우에 자주 표시됩니다.

  • C# LOCK 문을 실행하거나,
  • Monitor.Enter 메서드를 호출하거나,
  • MethodImplOptions.Synchronized 특성을 사용하여 메서드를 호출합니다.

잠금 경합은 일반적으로 스레드 A가 잠금을 획득하고 스레드 B가 스레드 A가 잠금을 해제하기 전에 동일한 잠금을 획득하려고 하는 경우에 발생합니다.

코드 로드([COLD])

.NET Framework 런타임이 처음으로 최적화되지 않은 코드를 실행하는 경우 메서드 이름에 [COLD]가 포함됩니다.

mscorlib.ni![COLD]System.Reflection.CustomAttribute.IsDefined

각 메서드는 프로세스 중에 최대 한 번만 표시되어야 합니다.

요청에 대해 코드를 로드하는 데 상당한 시간이 걸리는 경우 메서드의 최적화되지 않은 부분에 대한 요청의 시작 실행입니다. 사용자가 액세스하기 전에 코드의 해당 부분을 실행하는 준비 프로세스를 고려할 수 있습니다.

HTTP 요청 보내기

HttpClient.Send와 같은 메서드는 코드가 HTTP 요청이 완료되기를 기다리고 있음을 나타냅니다.

데이터베이스 작업

SqlCommand.Execute와 같은 메서드는 코드가 데이터베이스 작업이 완료되기를 기다리고 있음을 나타냅니다.

대기 중(AWAIT_TIME)

AWAIT_TIME은 코드가 다른 작업이 완료되기를 기다리고 있음을 나타냅니다. 이 지연은 C# AWAIT 문에서 발생합니다. 코드가 C# AWAIT를 수행하는 경우:

  • 스레드는 해제하고 스레드 풀에 제어를 반환합니다.
  • AWAIT가 완료되기를 기다리는 차단된 스레드가 없습니다.

그러나 논리적으로 AWAIT를 수행한 스레드는 작업이 완료되길 기다리는 것이 "차단"됩니다. AWAIT_TIME 문은 작업이 완료되기를 기다리는 차단된 시간을 나타냅니다.

차단된 시간

BLOCKED_TIME은 코드가 다른 리소스를 사용할 수 있을 때까지 기다리고 있음을 나타냅니다. 예를 들어 다음을 기다리고 있을 수 있습니다.

  • 동기화 개체
  • 사용할 수 있는 스레드
  • 완료 요청

관리되지 않는 비동기

스레드에서 비동기 호출을 추적하기 위해 .NET Framework는 ETW 이벤트를 내보내고 스레드 간에 활동 ID를 전달합니다. 비관리(네이티브) 코드와 일부 이전 스타일의 비동기 코드에는 이러한 이벤트와 활동 ID가 없기 때문에 Profiler는 스레드와 스레드에서 실행되는 함수를 추적할 수 없습니다. 호출 스택에서 관리되지 않는 비동기로 레이블이 지정됩니다. 자세한 인사이트를 보려면 ETW 파일을 다운로드하여 PerfView를 사용합니다.

CPU 시간

CPU는 명령을 실행 중입니다.

디스크 시간

애플리케이션은 디스크 작업을 수행 중입니다.

네트워크 시간

애플리케이션은 네트워크 작업을 수행 중입니다.

때 열

시기 열은 시간 경과에 따라 노드에 대해 수집된 다양한 포함 샘플을 시각화한 것입니다. 요청의 총 범위는 노드의 포괄적인 샘플이 누적되는 32개의 시간 버킷으로 나뉩니다. 각 버킷은 막대로 표시됩니다. 막대의 높이는 크기 조정된 값을 나타냅니다. 다음 노드의 경우 막대는 버킷 동안 리소스 중 하나의 사용량을 나타냅니다.

  • CPU_TIME 또는 BLOCKED_TIME으로 표시된 노드.
  • 리소스 소비와 명백한 관계가 있는 노드(예: CPU, 디스크 또는 스레드).

이러한 메트릭의 경우 여러 리소스를 사용하여 100%보다 큰 값을 얻을 수 있습니다. 예를 들어 평균적으로 간격 동안 2개의 CPU를 사용하면 200%를 얻습니다.

다음 단계

방법 알아보기...