다음을 통해 공유


성능 카운터 조사(dotnet-counters)

이 문서는 버전 3.0.47001 이상 버전에 적용됩니다 ✔️ dotnet-counters .

.NET 5 이상을 실행하는 애플리케이션에서 카운터를 읽을 수 있습니다.

설치

다운로드하고 사용하는 dotnet-counters세 가지 방법이 있습니다.

  • 원샷 실행(권장):

    .NET 10.0.100부터 다음을 사용하여 dotnet-counters영구 설치 없이 실행할 dnx 수 있습니다.

    dnx dotnet-counters [options]
    

    다음은 그 예입니다.

    dnx dotnet-counters monitor --process-id 1234
    

    이 방법은 시스템을 영구적으로 수정하지 않고 최신 버전을 자동으로 다운로드하고 실행합니다.

  • dotnet 전역 도구:

    자주 사용할 수 있도록 최신 버전의 dotnet-countersNuGet 패키지를 설치하려면 dotnet 도구 설치 명령을 사용합니다.

    dotnet tool install --global dotnet-counters
    

    이 명령은 .NET SDK 도구 경로에 이진 파일을 설치 dotnet-counters 합니다. 이 경로를 PATH에 추가하여 전역적으로 설치된 도구를 쉽게 호출할 수 있습니다.

  • 직접 다운로드:

    플랫폼에 맞는 도구 실행 파일을 다운로드합니다.

    OS 플랫폼
    Windows x86 | x64 | | Arm-x64
    Linux x64 | | Arm64 | musl-x64 | musl-Arm64

참고 항목

x86 앱에서 dotnet-counters를 사용하려면 해당하는 x86 버전의 도구가 필요합니다.

개요

dotnet-counters [-h|--help] [--version] <command>

설명

dotnet-counters는 임시 상태 모니터링 및 1단계 수준 성능 조사를 위한 성능 모니터링 도구입니다. EventCounter API 또는 Meter API를 통해 게시된 성능 카운터 값을 관찰할 수 있습니다. 예를 들어, PerfView 또는 dotnet-trace를 사용하여 보다 심각한 성능 조사를 살펴보기 전에 의심스러운 내용이 있는지 확인하기 위해 .NET Core 애플리케이션에서 throw되는 CPU 사용량 또는 예외 비율과 같은 항목을 신속하게 모니터링할 수 있습니다.

옵션

  • --version

    유틸리티의 dotnet-counters 버전을 표시합니다.

  • -h|--help

    명령줄 도움말을 표시합니다.

명령

명령
dotnet-counters collect
dotnet-counters 모니터
dotnet-counters ps

dotnet-counters collect

선택한 카운터 값을 주기적으로 수집하고 후처리를 위해 지정된 파일 형식으로 내보냅니다.

개요

dotnet-counters collect [-h|--help] [-p|--process-id] [-n|--name] [--diagnostic-port] [--refresh-interval] [--counters <COUNTERS>] [--format] [-o|--output] [-- <command>]

옵션

  • -p|--process-id <PID>

    카운터 데이터를 수집할 프로세스의 ID입니다.

    참고 항목

    Linux 및 macOS에서 이 옵션을 사용하려면 대상 애플리케이션과 dotnet-counters 동일한 TMPDIR 환경 변수를 공유해야 합니다. 그러지 않으면 명령 시간이 초과됩니다.

  • -n|--name <name>

    카운터 데이터를 수집할 프로세스의 이름입니다.

    참고 항목

    Linux 및 macOS에서 이 옵션을 사용하려면 대상 애플리케이션과 dotnet-counters 동일한 TMPDIR 환경 변수를 공유해야 합니다. 그러지 않으면 명령 시간이 초과됩니다.

  • --diagnostic-port <port-address[,(listen|connect)]>

    모니터링할 프로세스와 통신하는 데 사용되는 진단 포트 를 설정합니다. dotnet-counters 대상 프로세스 내의 .NET 런타임은 하나의 수신 대기 및 다른 연결이 있는 포트 주소에 동의해야 합니다. dotnet-counters는 옵션을 사용하여 연결할 때 또는 --process-id 옵션을 사용하여 --name-- <command> 프로세스를 시작할 때 올바른 포트를 자동으로 결정합니다. 일반적으로 나중에 시작될 프로세스를 기다리거나 현재 프로세스 네임스페이스에 속하지 않는 컨테이너 내에서 실행되는 프로세스와 통신할 때만 포트를 명시적으로 지정해야 합니다.

    port-address OS의 차이점은 다음과 같습니다.

    • Linux 및 macOS - Unix 도메인 소켓에 대한 경로(예: /foo/tool1.socket.
    • Windows - 명명된 파이프 경로(예: \\.\pipe\my_diag_port1.
    • Android, iOS 및 tvOS - IP:port(예: 127.0.0.1:9000.

    기본적으로 dotnet-counters 지정된 주소에서 수신 대기합니다. 대신 주소 뒤를 dotnet-counters 추가하여 연결을 요청할 ,connect 수 있습니다. 예를 들어 --diagnostic-port /foo/tool1.socket,connect Unix 도메인 소켓을 수신 대기하는 .NET 런타임 프로세스에 /foo/tool1.socket 연결합니다.

    이 옵션을 사용하여 앱 시작에서 카운터 모니터링을 시작하는 방법에 대한 자세한 내용은 진단 포트 사용을 참조하세요.

  • --refresh-interval <SECONDS>

    표시된 카운터 업데이트 사이의 지연 시간(초)입니다.

  • --counters <COUNTERS>

    쉼표로 구분된 카운터 목록입니다. 카운터는 provider_name[:counter_name]을 지정할 수 있습니다. 적격 카운터 목록 없이 provider_name이 사용되는 경우 공급자의 모든 카운터가 표시됩니다. 공급자 및 카운터 이름을 검색하려면 기본 제공 메트릭을 참조하세요. EventCountersprovider_name의 경우 EventSource의 이름이며 미터provider_name의 이름은 미터의 이름입니다.

  • --format <csv|json>

    내보낼 형식입니다. 현재 csv와 json을 사용할 수 있습니다.

  • -o|--output <output>

    출력 파일의 이름입니다.

  • -- <command>

    컬렉션 구성 매개 변수 후에 사용자는 명령을 추가하여 -- .NET 애플리케이션을 시작할 수 있습니다. dotnet-counters 는 제공된 명령을 사용하여 프로세스를 시작하고 요청된 메트릭을 수집합니다. 이는 애플리케이션의 시작 경로에 대한 메트릭을 수집하는 데 유용하며 주 진입점 이전 또는 직후에 발생하는 문제를 진단하거나 모니터링하는 데 사용할 수 있습니다.

    참고 항목

    이 옵션을 사용하면 도구와 다시 통신하는 첫 번째 .NET 프로세스를 모니터링합니다. 즉, 명령이 여러 .NET 애플리케이션을 시작하는 경우 첫 번째 앱만 수집합니다. 따라서 자체 포함 애플리케이션에서 이 옵션을 사용하거나 이 옵션을 사용하는 dotnet exec <app.dll> 것이 좋습니다.

    참고 항목

    .NET 실행 파일을 통해 dotnet-counters시작하면 해당 입력/출력이 리디렉션되고 해당 stdin/stdout과 상호 작용할 수 없습니다. Ctrl+C 또는 SIGTERM을 통해 도구를 종료하여 도구와 자식 프로세스를 모두 안전하게 종료할 수 있습니다. 자식 프로세스가 도구보다 먼저 종료되면 도구도 종료됩니다. Stdin/stdout을 사용해야 하는 경우 --diagnostic-port 옵션을 사용할 수 있습니다. 자세한 내용은 진단 포트 사용을 참조하세요.

참고 항목

dotnet-counters를 사용하여 메트릭을 수집하려면 대상 프로세스를 실행하는 사용자와 동일한 사용자 또는 루트로 실행해야 합니다. 그러지 않으면 도구는 대상 프로세스와 연결을 설정하지 못합니다.

예제

  • 3초의 새로 고침 간격으로 모든 카운터를 수집하고 csv를 출력으로 생성합니다.

    > dotnet-counters collect --process-id 1902 --refresh-interval 3 --format csv
    
    --counters is unspecified. Monitoring System.Runtime counters by default.
    Starting a counter session. Press Q to quit.
    
  • dotnet mvc.dll을 자식 프로세스로 시작하고 시작에서 런타임 카운터 및 ASP.NET Core 호스팅 카운터 수집을 시작하여 JSON 출력으로 저장합니다.

    > dotnet-counters collect --format json --counters System.Runtime,Microsoft.AspNetCore.Hosting -- dotnet mvc.dll
    Starting a counter session. Press Q to quit.
    File saved to counter.json
    

dotnet-counters 모니터

선택한 카운터의 값을 주기적으로 새로 고치는 방법을 표시합니다.

개요

dotnet-counters monitor [-h|--help] [-p|--process-id] [-n|--name] [--diagnostic-port] [--refresh-interval] [--counters] [-- <command>]

옵션

  • -p|--process-id <PID>

    모니터링할 프로세스의 ID입니다.

  • -n|--name <name>

    모니터링할 프로세스의 이름입니다.

  • --diagnostic-port

    만들 진단 포트의 이름입니다. 이 옵션을 사용하여 앱 시작부터 카운터 모니터링을 시작하는 방법은 진단 포트 사용을 참조하세요.

  • --refresh-interval <SECONDS>

    표시된 카운터 업데이트 사이의 지연 시간(초)입니다.

  • --counters <COUNTERS>

    쉼표로 구분된 카운터 목록입니다. 카운터는 provider_name[:counter_name]을 지정할 수 있습니다. 적격 카운터 목록 없이 provider_name이 사용되는 경우 공급자의 모든 카운터가 표시됩니다. 공급자 및 카운터 이름을 검색하려면 기본 제공 메트릭을 참조하세요. EventCountersprovider_name의 경우 EventSource의 이름이며 미터provider_name의 이름은 미터의 이름입니다.

  • -- <command>

    컬렉션 구성 매개 변수 뒤에 명령을 추가하여 -- .NET 애플리케이션을 시작할 수 있습니다. dotnet-counters는 제공된 명령을 사용하여 프로세스를 시작하고 요청된 메트릭을 모니터링합니다. 이는 애플리케이션의 시작 경로에 대한 메트릭을 수집하는 데 유용하며 주 진입점 이전 또는 직후에 발생하는 문제를 진단하거나 모니터링하는 데 사용할 수 있습니다.

    참고 항목

    이 옵션을 사용하면 도구와 다시 통신하는 첫 번째 .NET 프로세스를 모니터링합니다. 즉, 명령이 여러 .NET 애플리케이션을 시작하는 경우 첫 번째 앱만 수집합니다. 따라서 자체 포함 애플리케이션에서 이 옵션을 사용하거나 이 옵션을 사용하는 dotnet exec <app.dll> 것이 좋습니다.

    참고 항목

    .NET 실행 파일을 통해 dotnet-counters 시작하면 입력/출력이 리디렉션되며 해당 stdin/stdout과 상호 작용할 수 없습니다. Ctrl+C 또는 SIGTERM을 통해 도구를 종료하여 도구와 자식 프로세스를 모두 안전하게 종료할 수 있습니다. 자식 프로세스가 도구보다 먼저 종료되면 도구도 종료됩니다. Stdin/stdout을 사용해야 하는 경우 --diagnostic-port 옵션을 사용할 수 있습니다. 자세한 내용은 진단 포트 사용을 참조하세요.

참고 항목

Linux 및 macOS에서 해당 명령은 대상 애플리케이션 및 dotnet-counters가 동일한 TMPDIR 환경 변수를 공유할 것으로 예상합니다.

참고 항목

dotnet-counters를 사용하여 메트릭을 모니터링하려면 대상 프로세스를 실행하는 사용자와 동일한 사용자 또는 루트로 실행해야 합니다.

참고 항목

다음과 [ERROR] System.ComponentModel.Win32Exception (299): A 32 bit processes cannot access modules of a 64 bit process.유사한 오류 메시지가 표시되는 경우 대상 프로세스와 비트가 일치하지 않는 오류 메시지를 사용 dotnet-counters 하려고 합니다. 설치 링크에서 도구의 올바른 비트 수를 다운로드해야 합니다.

예제

  • 3초의 새로 고침 간격으로 System.Runtime의 모든 카운터를 모니터링합니다.

    > dotnet-counters monitor --process-id 1902  --refresh-interval 3 --counters System.Runtime
    Press p to pause, r to resume, q to quit.
        Status: Running
    Name                                              Current Value
    [System.Runtime]
        dotnet.assembly.count ({assembly})                               115
        dotnet.gc.collections ({collection})
            gc.heap.generation
            ------------------
            gen0                                                           5
            gen1                                                           1
            gen2                                                           1
        dotnet.gc.heap.total_allocated (By)                       1.6947e+08
        dotnet.gc.last_collection.heap.fragmentation.size (By)
            gc.heap.generation
            ------------------
            gen0                                                           0
            gen1                                                     348,248
            gen2                                                           0
            loh                                                           32
            poh                                                            0
        dotnet.gc.last_collection.heap.size (By)
            gc.heap.generation
            ------------------
            gen0                                                           0
            gen1                                                  18,010,920
            gen2                                                   5,065,600
            loh                                                       98,384
            poh                                                    3,407,048
        dotnet.gc.last_collection.memory.committed_size (By)      66,842,624
        dotnet.gc.pause.time (s)                                           0.05
        dotnet.jit.compilation.time (s)                                    1.317
        dotnet.jit.compiled_il.size (By)                             574,886
        dotnet.jit.compiled_methods ({method})                         6,008
        dotnet.monitor.lock_contentions ({contention})                   194
        dotnet.process.cpu.count ({cpu})                                  16
        dotnet.process.cpu.time (s)
            cpu.mode
            --------
            system                                                         4.953
            user                                                           6.266
        dotnet.process.memory.working_set (By)                             1.3217e+08
        dotnet.thread_pool.queue.length ({work_item})                      0
        dotnet.thread_pool.thread.count ({thread})                       133
        dotnet.thread_pool.work_item.count ({work_item})              71,188
        dotnet.timer.count ({timer})                                     124
    

    참고 항목

    앱에서 .NET 버전 8 이하를 사용하는 경우 System.Runtime 미터 는 해당 버전 dotnet-counters 에 존재하지 않으며 대신 이전 System.Runtime EventCounters 를 표시하기 위해 대체됩니다. 여기에 표시된 것처럼 UI는 약간 다르게 보입니다.

    [System.Runtime]
          % Time in GC since last GC (%)                                 0
          Allocation Rate (B / 1 sec)                                5,376
          CPU Usage (%)                                                  0
          Exception Count (Count / 1 sec)                                0
          GC Fragmentation (%)                                          48.467
          GC Heap Size (MB)                                              0
          Gen 0 GC Count (Count / 1 sec)                                 1
          Gen 0 Size (B)                                                24
          Gen 1 GC Count (Count / 1 sec)                                 1
          Gen 1 Size (B)                                                24
          Gen 2 GC Count (Count / 1 sec)                                 1
          Gen 2 Size (B)                                           272,000
          IL Bytes Jitted (B)                                       19,449
          LOH Size (B)                                              19,640
          Monitor Lock Contention Count (Count / 1 sec)                  0
          Number of Active Timers                                        0
          Number of Assemblies Loaded                                    7
          Number of Methods Jitted                                     166
          POH (Pinned Object Heap) Size (B)                             24
          ThreadPool Completed Work Item Count (Count / 1 sec)           0
          ThreadPool Queue Length                                        0
          ThreadPool Thread Count                                        2
          Working Set (MB)                                              19
    
  • 다음에서 System.Runtime가비지 수집 및 가비지 수집 힙 할당만 모니터링합니다.

    > dotnet-counters monitor --process-id 1902 --counters System.Runtime[dotnet.gc.collections,dotnet.gc.heap.total_allocated]
    
    Press p to pause, r to resume, q to quit.
    Status: Running
    
    Name                                  Current Value
    [System.Runtime]
        dotnet.gc.collections ({collection})
            gc.heap.generation
            ------------------
            gen0                                0
            gen1                                0
            gen2                                0
        dotnet.gc.heap.total_allocated (By)     9,943,384
    
    
  • 사용자 정의 EventCounter에서 EventSource 값을 모니터링합니다. 자세한 내용은 자습서: .NET Core에서 EventCounters를 사용하여 성능 측정을 참조하세요.

    > dotnet-counters monitor --process-id 1902 --counters Samples-EventCounterDemos-Minimal
    
    Press p to pause, r to resume, q to quit.
        request                                      100
    
  • 시작 시 로드된 어셈블리의 #을 시작하고 my-aspnet-server.exe 모니터링합니다.

    > dotnet-counters monitor --counters System.Runtime[dotnet.assembly.count] -- my-aspnet-server.exe
    Press p to pause, r to resume, q to quit.
    Status: Running
    
    Name                               Current Value
    [System.Runtime]
    dotnet.assembly.count ({assembly})      11
    
  • 명령줄 인수로 my-aspnet-server.exearg1 시작하고 arg2 시작부터 작업 집합 및 GC 힙 크기를 모니터링합니다.

    > dotnet-counters monitor --counters System.Runtime[dotnet.process.memory.working_set,dotnet.gc.last_collection.heap.size] -- my-aspnet-server.exe arg1 arg2
    
    Name                                             Current Value
    [System.Runtime]
        dotnet.gc.last_collection.heap.size (By)
            gc.heap.generation
            ------------------
            gen0                                          560
            gen1                                      462,720
            gen2                                            0
            loh                                             0
            poh                                         8,184
        dotnet.process.memory.working_set (By)     48,431,104
    
    

dotnet-counters ps

dotnet-counters에서 모니터링할 수 있는 dotnet 프로세스를 나열합니다. dotnet-counters 버전 6.0.320703 이상에서는 사용 가능한 경우 각 프로세스가 시작된 명령줄 인수도 표시합니다.

개요

dotnet-counters ps [-h|--help]

예시

dotnet run --configuration Release 명령을 사용하여 장기 실행 앱을 시작한다고 가정해 보겠습니다. 다른 창에서 dotnet-counters ps 명령을 실행합니다. 표시되는 출력은 다음과 같습니다. 명령줄 인수가 있는 경우 dotnet-counters 버전 6.0.320703 이상에서 표시됩니다.

> dotnet-counters ps

  21932 dotnet     C:\Program Files\dotnet\dotnet.exe   run --configuration Release
  36656 dotnet     C:\Program Files\dotnet\dotnet.exe

진단 포트 사용

진단 포트 는 앱 시작에서 카운터 모니터링 또는 수집을 시작할 수 있는 런타임 기능입니다. 이 작업을 사용 dotnet-counters하려면 이전 예제에 설명된 대로 사용 dotnet-counters <collect|monitor> -- <command> 하거나 옵션을 사용할 --diagnostic-port 수 있습니다.

dotnet-counters <collect|monitor> -- <command>를 사용하여 애플리케이션을 자식 프로세스로 실행하는 것이 시작부터 빠르게 모니터링하는 가장 간단한 방법입니다.

하지만 모니터링되는 앱의 수명을 더 세부적으로 제어하거나(예: 처음 10분간만 앱을 모니터링하고 실행 계속) CLI를 사용하여 앱을 조작해야 하는 경우에는 --diagnostic-port 옵션을 사용하여 모니터링되는 대상 앱과 dotnet-counters를 모두 제어할 수 있습니다.

  1. 다음 명령은 dotnet-counters 명명 myport.sock 된 진단 소켓을 만들고 연결을 기다립니다.

    dotnet-counters collect --diagnostic-port myport.sock
    

    출력

    Waiting for connection on myport.sock
    Start an application with the following environment variable: DOTNET_DiagnosticPorts=/home/user/myport.sock
    
  2. 별도의 콘솔에서 DOTNET_DiagnosticPorts 환경 변수를 dotnet-counters 출력의 값으로 설정하고 대상 애플리케이션을 시작합니다.

    export DOTNET_DiagnosticPorts=/home/user/myport.sock
    ./my-dotnet-app arg1 arg2
    

    이렇게 하면 다음에서 카운터 수집을 시작할 수 dotnet-counters 있습니다.my-dotnet-app

    Waiting for connection on myport.sock
    Start an application with the following environment variable: DOTNET_DiagnosticPorts=myport.sock
    Starting a counter session. Press Q to quit.
    

    Important

    dotnet CLI가 앱 dotnet run 이 아닌 많은 자식 프로세스를 생성하고 앱 앞에 연결하여 dotnet-counters 런타임에 앱을 일시 중단하도록 할 수 있기 때문에 앱을 시작하는 것은 문제가 될 수 있습니다. 자체 포함된 버전의 앱을 직접 사용하거나 애플리케이션을 시작하는 데 사용하는 dotnet exec 것이 좋습니다.