EventPipe
EventPipe는 ETW 또는 perf_events처럼 추적 데이터를 수집하는 데 사용할 수 있는 런타임 구성 요소입니다. EventPipe의 목표는 .NET 개발자가 ETW 또는 perf_events처럼 플랫폼별 높은 권한 구성 요소를 사용하지 않고도 .NET 애플리케이션을 쉽게 추적할 수 있도록 하는 것입니다.
EventPipe는 많은 진단 도구에서 사용되는 메커니즘으로, 런타임에서 내보낸 이벤트뿐만 아니라 EventSource로 작성된 사용자 지정 이벤트를 사용하는 데 사용할 수 있습니다.
이 문서는 EventPipe에 대한 개략적인 개요입니다. EventPipe를 사용하는 시기와 방법, 필요에 가장 적합하도록 구성하는 방법에 대해 설명합니다.
EventPipe 기본 사항
EventPipe는 Just-In-Time 컴파일러나 가비지 수집기와 같은 런타임 구성 요소에서 내보낸 이벤트와 라이브러리 및 사용자 코드에서 EventSource 인스턴스로 작성된 이벤트를 집계합니다.
그런 다음 이벤트는 .nettrace
파일 형식으로 직렬화되고 파일에 직접 기록되거나 프로세스 외부 사용량을 위해 진단 포트를 통해 스트리밍될 수 있습니다.
EventPipe serialization 형식에 대한 자세한 내용은 EventPipe format documentation(EventPipe 형식 설명서)을 참조하세요.
EventPipe 대 ETW/perf_events
EventPipe는 .NET 런타임의 일부이며 .NET Core에서 지원하는 모든 플랫폼에서 동일한 방식으로 작동하도록 설계되었습니다. 따라서 dotnet-counters
, dotnet-gcdump
, dotnet-trace
같은 EventPipe 기반 추적 도구가 여러 플랫폼에서 원활하게 작동할 수 있습니다.
그러나 EventPipe는 런타임 기본 제공 구성 요소이기 때문에 범위는 관리 코드와 런타임 자체로 제한됩니다. EventPipe 이벤트에는 관리 코드 프레임 정보만 있는 스택 추적이 포함되어 있습니다. 관리되지 않는 다른 사용자 모드 라이브러리, 네이티브 코드용 CPU 샘플링 또는 커널 이벤트에서 생성된 이벤트가 필요한 경우에는 ETW 또는 perf_events 같은 OS별 추적 도구를 사용해야 합니다. Linux에서 perfcollect 도구는 perf_events 및 LTTng 사용을 자동화하는 데 도움이 됩니다.
EventPipe와 ETW/perf_events의 또 다른 주요 차이점은 관리자/루트 권한 요구 사항입니다. ETW 또는 perf_events를 사용하여 애플리케이션을 추적하려면 관리자/루트여야 합니다. 추적 프로그램(예: dotnet-trace
)이 애플리케이션을 시작한 사용자와 동일한 사용자로 실행되는 한 EventPipe를 사용하여 애플리케이션을 추적할 수 있습니다.
다음 표에서는 EventPipe와 ETW/perf_events의 차이점을 요약합니다.
기능 | EventPipe | ETW | perf_events |
---|---|---|---|
플랫폼 간 | 예 | 아니요(Windows에서만) | 아니요(지원되는 Linux 배포판에서만) |
관리자/루트 권한 필요 | 예 | 예 | 예 |
OS/커널 이벤트를 가져올 수 있음 | 예 | 예 | 예 |
기본 호출 스택을 확인할 수 있음 | 예 | 예 | 예 |
EventPipe를 사용하여 .NET 애플리케이션 추적
EventPipe를 사용하여 다음과 같은 여러 가지 방법으로 .NET 애플리케이션을 추적할 수 있습니다.
EventPipe를 기반으로 빌드되는 진단 도구 중 하나를 사용합니다.
Microsoft.Diagnostics.NETCore.Client 라이브러리를 사용하여 EventPipe 세션을 구성하고 시작하는 고유한 도구를 작성합니다.
환경 변수를 사용하여 EventPipe를 시작합니다.
EventPipe 이벤트를 포함하는 nettrace
파일을 생성한 후에는 PerfView 또는 Visual Studio에서 파일을 볼 수 있습니다. Windows가 아닌 플랫폼에서는 dotnet-trace convert 명령을 사용하여 nettrace
파일을 speedscope
또는 Chromium
추적 형식으로 변환하고 speedscope 또는 Chrome DevTools를 사용하여 볼 수 있습니다.
TraceEvent를 사용하여 프로그래밍 방식으로 EventPipe 추적을 분석할 수도 있습니다.
EventPipe를 사용하는 도구
EventPipe를 사용하여 애플리케이션을 추적하는 가장 쉬운 방법입니다. 이러한 각 도구를 사용하는 방법에 대한 자세한 내용은 각 도구의 설명서를 참조하세요.
dotnet-counters를 사용하면 .NET 런타임 및 핵심 라이브러리에서 내보낸 다양한 메트릭뿐만 아니라 직접 작성할 수 있는 사용자 지정 메트릭을 모니터링하고 수집할 수 있습니다.
dotnet-gcdump를 사용하면 라이브 프로세스의 GC 힙 덤프를 수집하여 애플리케이션의 관리되는 힙을 분석할 수 있습니다.
dotnet-trace를 사용하면 애플리케이션의 추적을 수집하여 성능을 분석할 수 있습니다.
환경 변수를 사용하여 추적
EventPipe를 사용하는 기본 메커니즘은 dotnet-trace 또는 Microsoft.Diagnostics.NETCore.Client 라이브러리를 사용하는 것입니다.
그러나 다음 환경 변수를 사용하여 앱에서 EventPipe 세션을 설정하고 파일에 직접 추적을 기록할 수 있습니다. 추적을 중지하려면 애플리케이션을 종료합니다.
DOTNET_EnableEventPipe
:파일에 직접 기록하는 EventPipe 세션을 시작하려면1
로 설정합니다. 기본값은0
입니다.DOTNET_EventPipeOutputPath
:DOTNET_EnableEventPipe
를 통해 실행하도록 구성된 경우 출력 EventPipe 추적 파일의 경로입니다. 기본값은trace.nettrace
이며, 앱이 실행되는 것과 동일한 디렉터리에 생성됩니다.참고 항목
.NET 6부터
DOTNET_EventPipeOutputPath
에 있는 문자열{pid}
의 인스턴스는 추적 중인 프로세스의 프로세스 ID로 대체됩니다.DOTNET_EventPipeCircularMB
: EventPipe의 내부 버퍼 크기(MB)를 나타내는 16진수 값입니다. 해당 구성 값은 EventPipe가DOTNET_EnableEventPipe
를 통해 실행되도록 구성된 경우에만 사용됩니다. 기본 버퍼 크기는 1,024MB이며0x400
==1024
이므로400
으로 설정되는 해당 환경 변수로 변환됩니다.참고 항목
대상 프로세스가 이벤트를 너무 자주 기록하는 경우 이 버퍼가 오버플로되고 일부 이벤트가 삭제될 수 있습니다. 너무 많은 이벤트가 삭제되는 경우에는 버퍼 크기를 늘려 삭제된 이벤트 수가 감소하는지 확인하세요. 버퍼 크기를 늘려도 삭제된 이벤트 수가 감소하지 않는다면 이는 느린 판독기로 인해 대상 프로세스의 버퍼가 플러시되지 않기 때문일 수 있습니다.
DOTNET_EventPipeProcNumbers
:1
로 설정하여 EventPipe 이벤트 헤더에서 프로세서 번호를 캡처할 수 있도록 합니다. 기본값은0
입니다.DOTNET_EventPipeConfig
:DOTNET_EnableEventPipe
를 사용하여 EventPipe 세션을 시작할 때 EventPipe 세션 구성을 설정합니다. 구문은 다음과 같습니다.<provider>:<keyword>:<level>
쉼표로 연결하여 여러 공급자를 지정할 수도 있습니다.
<provider1>:<keyword1>:<level1>,<provider2>:<keyword2>:<level2>
이 환경 변수는 설정되지 않았지만
DOTNET_EnableEventPipe
에서 EventPipe를 사용하도록 설정한 경우 다음 키워드 및 수준으로 다음 공급자를 사용하도록 설정하여 추적을 시작합니다.Microsoft-Windows-DotNETRuntime:4c14fccbd:5
Microsoft-Windows-DotNETRuntimePrivate:4002000b:5
Microsoft-DotNETCore-SampleProfiler:0:5
.NET의 잘 알려진 몇 가지 공급자에 대해 자세히 알아보려면 잘 알려진 이벤트 공급자를 참조하세요.
참고 항목
.NET 6에서는 .NET 런타임 동작을 구성하는 환경 변수에 대해 COMPlus_
대신 접두사 DOTNET_
을 표준화했습니다. 그러나 COMPlus_
접두사도 계속 작동합니다. 이전 버전의 .NET 런타임을 사용하는 경우에도 환경 변수에 COMPlus_
접두사를 사용해야 합니다.
.NET