다음을 통해 공유


.NET Framework Windows 성능 카운터에서 .NET 메트릭으로 마이그레이션

Windows에서만 실행되는 .NET Framework 애플리케이션은 Windows 성능 카운터를 사용하여 애플리케이션 상태 및 성능을 모니터링할 수 있습니다. 그러나 .NET Core 이상 버전에서 플랫폼은 EventCountersSystem.Diagnostics.Metrics API를 통해 플랫폼 간 대안을 제공합니다.

이 문서에서는 Windows 성능 카운터에서 최신 .NET 버전에서 사용할 수 있는 최신 메트릭 시스템으로 마이그레이션하는 방법에 대한 지침을 제공합니다.

.NET 메트릭의 짧은 기록

.NET 버전 및 플랫폼에 따라 다른 메커니즘을 사용하여 .NET 애플리케이션을 모니터링할 수 있습니다.

  • .NET Framework: 주로 Windows 성능 카운터를 사용합니다(Windows만 해당).
  • .NET Core 3.0-3.1, .NET 5 이상: 이러한 API를 사용하여 EventCounters(플랫폼 간) 및 기본 제공 런타임 메트릭, 네트워킹 메트릭ASP.NET 메트릭 을 도입했습니다.
  • .NET 6 이상: System.Diagnostics.Metrics API 추가됨(플랫폼 간, OpenTelemetry 호환)
  • .NET 8 이상: 새 System.Diagnostics.Metrics API를 사용하여 기본 제공 네트워킹 메트릭 및 ASP.NET 메트릭 추가
  • .NET 9 이상: 새 System.Diagnostics.Metrics API를 사용하여 기본 제공 런타임 메트릭 이 추가됨

최신 메트릭 시스템은 다음과 같은 몇 가지 이점을 제공합니다.

  • 플랫폼 간 작업: Windows, Linux, macOS에서 작동
  • 컨테이너 친화적: 컨테이너화된 환경에서 작동
  • 최신 도구: OpenTelemetry 및 관찰성 플랫폼과 통합
  • xcopy 설치 지원: 추가 설치 단계 또는 권한이 필요하지 않음

자세한 내용은 메트릭 API 비교를 참조하세요.

최신 .NET 애플리케이션에서 메트릭 수집

메트릭을 수집하고 분석하려면 System.Diagnostics.MetricsEventCounters 가이드를 참조하세요.

일반적인 Windows 성능 카운터를 최신 메트릭에 매핑

.NET Framework 애플리케이션에 대한 모니터링 시스템에서 런타임 제공 Windows 성능 카운터를 사용하는 경우 대신 대체 EventCounters 또는 System.Diagnostics.Metrics 기반 메트릭을 선택해야 합니다. 다음 표에서는 많은 일반적인 카운터에 대한 대안을 보여 줍니다. 모든 .NET Framework 카운터가 새로운 대안으로 이식된 것은 아닙니다. 경우에 따라 자주 사용되지 않는 카운터가 중단되었고, 다른 경우에는 플랫폼의 구현 변경으로 인해 특정 카운터가 무관하게 됩니다.

메모리 카운터

Windows 성능 카운터 EventCounter 해당 메트릭 API 해당
.NET CLR Memory\# Bytes in all Heaps System.Runtime\GC Heap Size(gc-heap-size) System.Runtime\dotnet.gc.last_collection.heap.size
.NET CLR Memory\# Gen 0 Collections System.Runtime\Gen 0 GC Count(gen-0-gc-count) System.Runtime\dotnet.gc.collections with 특성 gc.heap.generation=gen0
.NET CLR Memory\# Gen 1 Collections System.Runtime\Gen 1 GC Count(gen-1-gc-count) System.Runtime\dotnet.gc.collections with 특성 gc.heap.generation=gen1
.NET CLR Memory\# Gen 2 Collections System.Runtime\Gen 2 GC Count(gen-2-gc-count) System.Runtime\dotnet.gc.collections with 특성 gc.heap.generation=gen2
.NET CLR Memory\% Time in GC System.Runtime\% Time in GC since last GC(time-in-gc) System.Runtime\dotnet.gc.pause.time (총 시간의 백분율로 계산)
.NET CLR Memory\# Total committed Bytes 없음 System.Runtime\dotnet.gc.last_collection.memory.committed_size
.NET CLR Memory\Large Object Heap Size System.Runtime\LOH Size(loh-size) System.Runtime\dotnet.gc.last_collection.heap.size with 특성 gc.heap.generation=loh
.NET CLR Memory\Allocated Bytes/sec System.Runtime\Allocation Rate(alloc-rate) 에서 속도 계산 System.Runtime\dotnet.gc.heap.total_allocated

비고

dotnet.gc.pause.time 는 이전 % Time in GC 메트릭에서 바람직하지 않은 동작을 방지하는 향상된 계산을 허용합니다. % Time in GC 계산된 100 * pause_time_in_most_recent_GC / time_between_most_recent_two_GCs. 경우에 따라 두 개의 GC가 매우 가깝게 발생하여 전체 시간 간격의 작은 비 대표 부분을 기반으로 높은 값을 생성합니다. gc.heap.pause.time 는 GC가 지금까지 프로세스에서 애플리케이션 스레드를 일시 중지한 총 시간을 누적하므로 측정된 시간 간격 동안 GC 일시 중지 시간을 계산할 수 있습니다. 이는 GC 오버헤드의 실제 측정값이지만 계산의 변경은 기본 GC 동작이 변경되지 않은 경우에도 메트릭이 일치하지 않을 수 있음을 의미합니다.

JIT 및 로드 카운터

Windows 성능 카운터 EventCounter 해당 메트릭 API 해당
.NET CLR Jit\# of Methods Jitted System.Runtime\Methods Jitted Count(methods-jitted-count) System.Runtime\dotnet.jit.compiled_methods
.NET CLR Jit\IL Bytes Jitted System.Runtime\IL Bytes Jitted(il-bytes-jitted) System.Runtime\dotnet.jit.compiled_il.size
.NET CLR Loading\Current Assemblies System.Runtime\Number of Assemblies Loaded(assembly-count) System.Runtime\dotnet.assembly.count
.NET CLR Jit\Total # of IL Bytes Jitted System.Runtime\IL Bytes Jitted(il-bytes-jitted) System.Runtime\dotnet.jit.compiled_il.size

스레딩 카운터

Windows 성능 카운터 EventCounter 해당 메트릭 API 해당
.NET CLR LocksAndThreads\Current Queue Length System.Runtime\ThreadPool Queue Length(threadpool-queue-length) System.Runtime\dotnet.thread_pool.queue.length
.NET CLR LocksAndThreads\Contention Rate / sec System.Runtime\Monitor Lock Contention Count(monitor-lock-contention-count) 에서 속도 계산 System.Runtime\dotnet.monitor.lock_contentions

예외 카운터

Windows 성능 카운터 EventCounter 해당 메트릭 API 해당
.NET CLR Exceptions\# of Exceps Thrown / sec System.Runtime\Exception Count(exception-count) 에서 속도 계산 System.Runtime\dotnet.exceptions
.NET CLR Exceptions\# of Exceps Thrown 없음 System.Runtime\dotnet.exceptions

소켓 네트워킹 카운터

Windows 성능 카운터 EventCounter 해당 메트릭 API 해당
.NET CLR Networking\Bytes Received System.Net.Sockets\Bytes Received(bytes-received) 없음
.NET CLR Networking\Bytes Sent System.Net.Sockets\Bytes Sent(bytes-sent) 없음
.NET CLR Networking\Connections Established System.Net.Sockets\Outgoing Connections Established(outgoing-connections-established) 없음
.NET CLR Networking\Datagrams Received System.Net.Sockets\Datagrams Received(datagrams-received) 없음
.NET CLR Networking\Datagrams Sent System.Net.Sockets\Datagrams Sent(datagrams-sent) 없음

DNS 네트워킹 카운터

Windows 성능 카운터 EventCounter 해당 메트릭 API 해당
.NET CLR Networking\DNS Lookups System.Net.NameResolution\DNS Lookups Requested(dns-lookups-requested) 에서 히스토그램 버킷 합계 System.Net.NameResolution\dns.lookup.duration
.NET CLR Networking\DNS Resolution Time System.Net.NameResolution\Average DNS Lookup Duration(dns-lookups-duration) System.Net.NameResolution\dns.lookup.duration

HttpWebRequest 카운터

HttpWebRequest 가 대체되었습니다 HttpClient. 기본 제공되는 메트릭에 대해 알아보려면 HttpClient EventCountersSystem.Diagnostics.Metrics를 참조하세요.

ASP.NET 카운터

ASP.NET .NET Framework와 .NET Core 간에 크게 변경되었습니다. 많은 카운터가 사용되지 않거나 과거와 다르게 측정됩니다. 기본 제공되는 메트릭을 알아보려면 ASP.NET EventCountersSystem.Diagnostics.Metrics를 참조하세요.

다음 단계