Investigar contadores de desempenho (dotnet-counters)

Este artigo se aplica ao: ✔️ dotnet-counters versão 3.0.47001 e versões posteriores

Instalar

Há duas maneiras de baixar e instalar o dotnet-counters:

  • Ferramenta global dotnet:

    Para instalar a última versão de lançamento do dotnet-counterspacote NuGet, use o comando dotnet tool install:

    dotnet tool install --global dotnet-counters
    
  • Download direto:

    Baixe o executável da ferramenta que corresponde à sua plataforma:

    Sistema operacional Plataforma
    Windows x86 | x64 | Arm | Arm-x64
    Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64

Observação

Para usar dotnet-counters em um aplicativo x86, você precisa de uma versão x86 correspondente da ferramenta.

Sinopse

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

Descrição

O dotnet-counters é uma ferramenta de monitoramento de desempenho para monitoramento de integridade de primeiro nível e investigação de desempenho. Ele pode observar valores de contador de desempenho publicados por meio da API EventCounter ou da API Meter. Por exemplo, você pode monitorar rapidamente coisas como o uso da CPU ou a taxa de exceções que estão sendo geradas em seu aplicativo .NET Core para ver se há algo suspeito antes de mergulhar em uma investigação de desempenho mais séria usando PerfView ou dotnet-trace.

Opções

  • --version

    Exibe a versão do utilitário de contadores dotnet.

  • -h|--help

    Mostra a ajuda da linha de comando.

Comandos

Comando
dotnet-counters collect
dotnet-counters list
dotnet-counters monitor
dotnet-counters ps

dotnet-counters collect

Colete periodicamente os valores de contador selecionados e exporte-os para um formato de arquivo especificado para pós-processamento.

Sinopse

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

Opções

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

    A ID do processo do qual coletar dados do contador.

  • -n|--name <name>

    O nome do processo do qual coletar dados do contador.

  • --diagnostic-port

    O nome da porta de diagnóstico a ser criada. Consulte Usar porta de diagnóstico para utilizar essa opção para iniciar o monitoramento de contadores da inicialização do aplicativo.

  • --refresh-interval <SECONDS>

    O número de segundos de atraso entre a atualização dos contadores exibidos

  • --counters <COUNTERS>

    Lista de contadores separados por vírgulas. Contadores podem ser especificados provider_name[:counter_name]. Se o provider_name for usado sem uma lista qualificada de contadores, todos os contadores do provedor serão mostrados. Para descobrir nomes de provedores e contadores, use o comando dotnet-counters list. Para EventCounters, provider_name é o nome do EventSource e, para Meters, provider_name é o nome do Medidor.

  • --format <csv|json>

    O formato a ser exportado. Atualmente disponível: csv, json.

  • -o|--output <output>

    O nome do arquivo de saída.

  • -- <command> (para aplicativos de destino que executam somente .NET 5 ou posterior)

    Após os parâmetros de configuração de coleção, o usuário pode acrescentar -- seguido por um comando para iniciar um aplicativo .NET com pelo menos um runtime 5.0. dotnet-counters iniciará um processo com o comando fornecido e coletará as métricas solicitadas. Normalmente, isso é útil para coletar métricas para o caminho de inicialização do aplicativo e pode ser usado para diagnosticar ou monitorar problemas que ocorrem cedo ou pouco depois do ponto de entrada principal.

    Observação

    Usar essa opção monitora o primeiro processo do .NET 5 que se comunica novamente com a ferramenta, o que significa que, se o comando iniciar vários aplicativos .NET, ele coletará apenas o primeiro aplicativo. Portanto, é recomendável usar essa opção em aplicativos autocontidos ou usar a opção dotnet exec <app.dll>.

    Observação

    Iniciar um executável .NET por meio de contadores dotnet fará com que sua entrada/saída seja redirecionada e você não poderá interagir com seu stdin/stdout. Sair da ferramenta por meio de CTRL+C ou SIGTERM encerrará com segurança a ferramenta e o processo filho. Se o processo filho for encerrado antes da ferramenta, a ferramenta também será encerrada e o rastreamento será exibido com segurança. Se você precisar usar stdin/stdout, poderá usar a opção --diagnostic-port. Consulte Usar porta de diagnóstico para obter mais informações.

Observação

No Linux e no macOS, esse comando espera que o aplicativo de destino e dotnet-counters compartilhem a mesma variável de ambiente TMPDIR. Caso contrário, o comando terá um tempo limite.

Observação

Para coletar métricas usando dotnet-counters, ele precisa ser executado como o mesmo usuário que o usuário que executa o processo de destino ou como raiz. Caso contrário, a ferramenta não estabelecerá uma conexão com o processo de destino.

Exemplos

  • Colete todos os contadores em um intervalo de atualização de 3 segundos e gere um csv como saída:

    > 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.
    
  • Comece dotnet mvc.dll como um processo filho e comece a coletar contadores de runtime e ASP.NET Core Contadores de hospedagem da inicialização e salve-os como uma saída 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 list

Exibe uma lista de nomes e descrições de contadores, agrupados por provedor.

Sinopse

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

Exemplo

> dotnet-counters list
Showing well-known counters only. Specific processes may support additional counters.

System.Runtime
    cpu-usage                                    Amount of time the process has utilized the CPU (ms)
    working-set                                  Amount of working set used by the process (MB)
    gc-heap-size                                 Total heap size reported by the GC (MB)
    gen-0-gc-count                               Number of Gen 0 GCs per interval
    gen-1-gc-count                               Number of Gen 1 GCs per interval
    gen-2-gc-count                               Number of Gen 2 GCs per interval
    time-in-gc                                   % time in GC since the last GC
    gen-0-size                                   Gen 0 Heap Size
    gen-1-size                                   Gen 1 Heap Size
    gen-2-size                                   Gen 2 Heap Size
    loh-size                                     LOH Heap Size
    alloc-rate                                   Allocation Rate
    assembly-count                               Number of Assemblies Loaded
    exception-count                              Number of Exceptions per interval
    threadpool-thread-count                      Number of ThreadPool Threads
    monitor-lock-contention-count                Monitor Lock Contention Count
    threadpool-queue-length                      ThreadPool Work Items Queue Length
    threadpool-completed-items-count             ThreadPool Completed Work Items Count
    active-timer-count                           Active Timers Count

Microsoft.AspNetCore.Hosting
    requests-per-second                  Request rate
    total-requests                       Total number of requests
    current-requests                     Current number of requests
    failed-requests                      Failed number of requests

Observação

Os contadores Microsoft.AspNetCore.Hosting são exibidos quando há processos identificados que dão suporte a esses contadores, por exemplo; quando um aplicativo ASP.NET Core está em execução no computador host.

dotnet-counters monitor

Exibe valores atualizados periodicamente de contadores selecionados.

Sinopse

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

Opções

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

    A ID do processo a ser monitorado.

  • -n|--name <name>

    O nome do processo a ser monitorado.

  • --diagnostic-port

    O nome da porta de diagnóstico a ser criada. Consulte Usar porta de diagnóstico para utilizar essa opção para iniciar o monitoramento de contadores da inicialização do aplicativo.

  • --refresh-interval <SECONDS>

    O número de segundos de atraso entre a atualização dos contadores exibidos

  • --counters <COUNTERS>

    Lista de contadores separados por vírgulas. Contadores podem ser especificados provider_name[:counter_name]. Se o provider_name for usado sem uma lista qualificada de contadores, todos os contadores do provedor serão mostrados. Para descobrir nomes de provedores e contadores, use o comando dotnet-counters list. Para EventCounters, provider_name é o nome do EventSource e, para Meters, provider_name é o nome do Medidor.

-- <command> (para aplicativos de destino que executam somente .NET 5 ou posterior)

Após os parâmetros de configuração de coleção, o usuário pode acrescentar -- seguido por um comando para iniciar um aplicativo .NET com pelo menos um runtime 5.0. dotnet-counters iniciará um processo com o comando fornecido e monitorará as métricas solicitadas. Normalmente, isso é útil para coletar métricas para o caminho de inicialização do aplicativo e pode ser usado para diagnosticar ou monitorar problemas que ocorrem cedo ou pouco depois do ponto de entrada principal.

Observação

Usar essa opção monitora o primeiro processo do .NET 5 que se comunica novamente com a ferramenta, o que significa que, se o comando iniciar vários aplicativos .NET, ele coletará apenas o primeiro aplicativo. Portanto, é recomendável usar essa opção em aplicativos autocontidos ou usar a opção dotnet exec <app.dll>.

Observação

Iniciar um executável .NET por meio de contadores dotnet fará com que sua entrada/saída seja redirecionada e você não poderá interagir com seu stdin/stdout. Sair da ferramenta por meio de CTRL+C ou SIGTERM encerrará com segurança a ferramenta e o processo filho. Se o processo filho for encerrado antes da ferramenta, a ferramenta também será encerrada. Se você precisar usar stdin/stdout, poderá usar a opção --diagnostic-port. Consulte Usar porta de diagnóstico para obter mais informações.

Observação

No Linux e no macOS, esse comando espera que o aplicativo de destino e dotnet-counters compartilhem a mesma variável de ambiente TMPDIR.

Observação

Para monitorar métricas usando dotnet-counters, ele precisa ser executado como o mesmo usuário que o usuário que executa o processo de destino ou como raiz.

Observação

Se você vir uma mensagem de erro semelhante à seguinte: [ERROR] System.ComponentModel.Win32Exception (299): A 32 bit processes cannot access modules of a 64 bit process., você está tentando usar dotnet-counters que tenha bits incompatíveis com o processo de destino. Baixe o número de bit correto da ferramenta no link de instalação.

Exemplos

  • Monitore todos os contadores de System.Runtime em um intervalo de atualização de 3 segundos:

    > dotnet-counters monitor --process-id 1902  --refresh-interval 3 --counters System.Runtime
    Press p to pause, r to resume, q to quit.
        Status: Running
    
    [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
    
  • Monitore apenas o uso da CPU e o tamanho do heap do GC de System.Runtime:

    > dotnet-counters monitor --process-id 1902 --counters System.Runtime[cpu-usage,gc-heap-size]
    
    Press p to pause, r to resume, q to quit.
      Status: Running
    
    [System.Runtime]
        CPU Usage (%)                                 24
        GC Heap Size (MB)                            811
    
  • Monitorar valores EventCounter de EventSource definidos pelo usuário. Para obter mais informações, consulte Tutorial: Medir o desempenho usando EventCounters no .NET Core.

    > dotnet-counters monitor --process-id 1902 --counters Samples-EventCounterDemos-Minimal
    
    Press p to pause, r to resume, q to quit.
        request                                      100
    
  • Exiba todos os contadores conhecidos que estão disponíveis em dotnet-counters:

    > dotnet-counters list
    
    Showing well-known counters for .NET (Core) version 3.1 only. Specific processes may support additional counters.
    System.Runtime
        cpu-usage                          The percent of process' CPU usage relative to all of the system CPU resources [0-100]
        working-set                        Amount of working set used by the process (MB)
        gc-heap-size                       Total heap size reported by the GC (MB)
        gen-0-gc-count                     Number of Gen 0 GCs between update intervals
        gen-1-gc-count                     Number of Gen 1 GCs between update intervals
        gen-2-gc-count                     Number of Gen 2 GCs between update intervals
        time-in-gc                         % time in GC since the last GC
        gen-0-size                         Gen 0 Heap Size
        gen-1-size                         Gen 1 Heap Size
        gen-2-size                         Gen 2 Heap Size
        loh-size                           LOH Size
        alloc-rate                         Number of bytes allocated in the managed heap between update intervals
        assembly-count                     Number of Assemblies Loaded
        exception-count                    Number of Exceptions / sec
        threadpool-thread-count            Number of ThreadPool Threads
        monitor-lock-contention-count      Number of times there were contention when trying to take the monitor lock between update intervals
        threadpool-queue-length            ThreadPool Work Items Queue Length
        threadpool-completed-items-count   ThreadPool Completed Work Items Count
        active-timer-count                 Number of timers that are currently active
    
    Microsoft.AspNetCore.Hosting
        requests-per-second                Number of requests between update intervals
        total-requests                     Total number of requests
        current-requests                   Current number of requests
        failed-requests                    Failed number of requests
    
  • Exiba todos os contadores conhecidos que estão disponíveis em dotnet-counters para aplicativos .NET 5:

    > dotnet-counters list --runtime-version 5.0
    
    Showing well-known counters for .NET (Core) version 5.0 only. Specific processes may support additional counters.
    System.Runtime
        cpu-usage                          The percent of process' CPU usage relative to all of the system CPU resources [0-100]
        working-set                        Amount of working set used by the process (MB)
        gc-heap-size                       Total heap size reported by the GC (MB)
        gen-0-gc-count                     Number of Gen 0 GCs between update intervals
        gen-1-gc-count                     Number of Gen 1 GCs between update intervals
        gen-2-gc-count                     Number of Gen 2 GCs between update intervals
        time-in-gc                         % time in GC since the last GC
        gen-0-size                         Gen 0 Heap Size
        gen-1-size                         Gen 1 Heap Size
        gen-2-size                         Gen 2 Heap Size
        loh-size                           LOH Size
        poh-size                           POH (Pinned Object Heap) Size
        alloc-rate                         Number of bytes allocated in the managed heap between update intervals
        gc-fragmentation                   GC Heap Fragmentation
        assembly-count                     Number of Assemblies Loaded
        exception-count                    Number of Exceptions / sec
        threadpool-thread-count            Number of ThreadPool Threads
        monitor-lock-contention-count      Number of times there were contention when trying to take the monitor lock between update intervals
        threadpool-queue-length            ThreadPool Work Items Queue Length
        threadpool-completed-items-count   ThreadPool Completed Work Items Count
        active-timer-count                 Number of timers that are currently active
        il-bytes-jitted                    Total IL bytes jitted
        methods-jitted-count               Number of methods jitted
    
    Microsoft.AspNetCore.Hosting
        requests-per-second   Number of requests between update intervals
        total-requests        Total number of requests
        current-requests      Current number of requests
        failed-requests       Failed number of requests
    
    Microsoft-AspNetCore-Server-Kestrel
        connections-per-second      Number of connections between update intervals
        total-connections           Total Connections
        tls-handshakes-per-second   Number of TLS Handshakes made between update intervals
        total-tls-handshakes        Total number of TLS handshakes made
        current-tls-handshakes      Number of currently active TLS handshakes
        failed-tls-handshakes       Total number of failed TLS handshakes
        current-connections         Number of current connections
        connection-queue-length     Length of Kestrel Connection Queue
        request-queue-length        Length total HTTP request queue
    
    System.Net.Http
        requests-started        Total Requests Started
        requests-started-rate   Number of Requests Started between update intervals
        requests-aborted        Total Requests Aborted
        requests-aborted-rate   Number of Requests Aborted between update intervals
        current-requests        Current Requests
    
  • Inicie my-aspnet-server.exe e monitore o número de assemblies carregados de sua inicialização (somente.NET 5 ou posterior):

    Importante

    Isso funciona apenas para aplicativos que executam o .NET 5 ou posterior.

    > dotnet-counters monitor --counters System.Runtime[assembly-count] -- my-aspnet-server.exe
    
    Press p to pause, r to resume, q to quit.
      Status: Running
    
    [System.Runtime]
        Number of Assemblies Loaded                   24
    
  • Inicie my-aspnet-server.exe com arg1 e arg2 como argumentos de linha de comando e monitore seu conjunto de trabalho e o tamanho do heap do GC a partir de sua inicialização (.NET 5 ou somente posterior):

    Importante

    Isso funciona apenas para aplicativos que executam o .NET 5 ou posterior.

    > dotnet-counters monitor --counters System.Runtime[working-set,gc-heap-size] -- my-aspnet-server.exe arg1 arg2
    
    Press p to pause, r to resume, q to quit.
      Status: Running
    
    [System.Runtime]
        GC Heap Size (MB)                                 39
        Working Set (MB)                                  59
    

dotnet-counters ps

Lista os processos de dotnet que podem ser monitorados por dotnet-counters. dotnet-countersdotnet-gcdump 6.0.320703 e posteriores também exibem os argumentos de linha de comando com os quais cada processo foi iniciado, se disponível.

Sinopse

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

Exemplo

Suponha que você inicie um aplicativo de longa execução usando o comando dotnet run --configuration Release. Em outra janela, execute o aplicativo de longa execução usando o comando dotnet-counters ps. A saída que você verá é a seguinte. Os argumentos de linha de comando, se houver, são mostrados no dotnet-counters versão 6.0.320703 e posterior.

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

Usar porta de diagnóstico

Importante

Isso funciona apenas para aplicativos que executam o .NET 5 ou posterior.

A porta de diagnóstico é um recurso de runtime adicionado no .NET 5 que permite que você comece a monitorar ou coletar contadores da inicialização do aplicativo. Para fazer isso usando dotnet-counters, você pode usar dotnet-counters <collect|monitor> -- <command> conforme descrito nos exemplos acima ou usar a opção --diagnostic-port.

Usar dotnet-counters <collect|monitor> -- <command> para iniciar o aplicativo como um processo filho é a maneira mais simples de monitorá-lo rapidamente de sua inicialização.

No entanto, quando você quiser obter um controle mais fino sobre o tempo de vida do aplicativo que está sendo monitorado (por exemplo, monitore o aplicativo somente nos primeiros 10 minutos e continue executando) ou se você precisar interagir com o aplicativo usando a CLI, o uso da opção --diagnostic-port permite controlar o aplicativo de destino que está sendo monitorado e dotnet-counters.

  1. O comando a seguir faz com que os contadores de dotnet criem um soquete de diagnóstico nomeado myport.sock e aguardem uma conexão.

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

    Saída:

    Waiting for connection on myport.sock
    Start an application with the following environment variable: DOTNET_DiagnosticPorts=/home/user/myport.sock
    
  2. Em um console separado, inicie o aplicativo de destino com a variável de ambiente DOTNET_DiagnosticPorts definida como o valor na saída dotnet-counters.

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

    Em seguida, isso deve habilitar dotnet-counters para começar a coleta de contadores em 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.
    

    Importante

    Iniciar seu aplicativo com dotnet run pode ser problemático porque a CLI dotnet pode gerar muitos processos filho que não são seu aplicativo e eles podem se conectar a dotnet-counters antes do seu aplicativo, deixando seu aplicativo para ser suspenso em tempo de execução. É recomendável que você use diretamente uma versão independente do aplicativo ou use dotnet exec para iniciar o aplicativo.