Compartilhar via


Investigar contadores de desempenho (dotnet-counters)

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

Os contadores podem ser lidos de aplicativos que executam o .NET 5 ou posterior.

Instalar

Há três maneiras de baixar e usar dotnet-counters:

  • Execução de um tiro (recomendado):

    A partir do .NET 10.0.100, você pode ser executado dotnet-counters sem instalação permanente usando dnx:

    dnx dotnet-counters [options]
    

    Por exemplo:

    dnx dotnet-counters monitor --process-id 1234
    

    Essa abordagem baixa e executa automaticamente a versão mais recente sem modificar permanentemente seu sistema.

  • Ferramenta global dotnet:

    Para instalar a versão de versão mais recente do dotnet-counterspacote NuGet para uso frequente, use o comando de instalação da ferramenta dotnet :

    dotnet tool install --global dotnet-counters
    

    Esse comando instala um dotnet-counters binário no caminho das Ferramentas do SDK do .NET, que você pode adicionar ao SEU PATH para invocar facilmente ferramentas instaladas globalmente.

  • Download direto:

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

    Sistema operacional Plataforma
    Windows x86 | x64 | Braço | Arm-x64
    Linux x64 | Braço | 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 dotnet-counters utilitário.

  • -h|--help

    Mostra a ajuda da linha de comando.

Comandos

Comando
dotnet-counters collect
monitor de contadores dotnet
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.

    Observação

    No Linux e no macOS, usar essa opção requer o aplicativo de destino e dotnet-counters compartilhar a mesma TMPDIR variável de ambiente. Caso contrário, o comando terá um tempo limite.

  • -n|--name <name>

    O nome do processo do qual coletar dados do contador.

    Observação

    No Linux e no macOS, usar essa opção requer o aplicativo de destino e dotnet-counters compartilhar a mesma TMPDIR variável de ambiente. Caso contrário, o comando terá um tempo limite.

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

    Define a porta de diagnóstico usada para se comunicar com o processo a ser monitorado. dotnet-counters e o runtime do .NET dentro do processo de destino deve concordar com o endereço da porta, com um escutando e o outro se conectando. dotnet-countersdetermina automaticamente a porta correta ao anexar usando as opções ou --process-id ou --name ao iniciar um processo usando a opção-- <command>. Geralmente, só é necessário especificar a porta explicitamente ao aguardar um processo que será iniciado no futuro ou se comunicar com um processo em execução dentro de um contêiner que não faz parte do namespace de processo atual.

    As port-address diferenças por sistema operacional:

    • Linux e macOS – um caminho para um soquete de domínio unix, como /foo/tool1.socket.
    • Windows – um caminho para um pipe nomeado, como \\.\pipe\my_diag_port1.
    • Android, iOS e tvOS – um IP:port como 127.0.0.1:9000.

    Por padrão, dotnet-counters escuta no endereço especificado. Em vez disso, você pode solicitar dotnet-counters a conexão acrescentando ,connect após o endereço. Por exemplo, --diagnostic-port /foo/tool1.socket,connect se conectará a um processo de runtime do .NET que está escutando o /foo/tool1.socket soquete de domínio unix.

    Para obter informações sobre como usar essa opção para iniciar o monitoramento de contadores da inicialização do aplicativo, consulte usando a porta de diagnóstico.

  • --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 provedor e contador, consulte métricas internas. Para EventCounters, provider_name é o nome do EventSource e para Medidores, 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>

    Após os parâmetros de configuração da coleção, o usuário pode acrescentar -- seguido por um comando para iniciar um aplicativo .NET. dotnet-counters inicia um processo com o comando fornecido e coleta as métricas solicitadas. Isso geralmente é útil para coletar métricas para o caminho de inicialização do aplicativo e pode ser usado para diagnosticar ou monitorar problemas que ocorrem antes ou logo após o ponto de entrada principal.

    Observação

    O uso dessa opção monitora o primeiro processo do .NET que se comunica de volta com a ferramenta, o que significa que, se o comando iniciar vários aplicativos .NET, ele coletará apenas o primeiro aplicativo. Portanto, é recomendável que você use essa opção em aplicativos autocontidos ou usando a opção dotnet exec <app.dll> .

    Observação

    Se você iniciar um executável do .NET por meio dotnet-countersdele, sua entrada/saída será redirecionada e você não poderá interagir com seu stdin/stdout. Você pode sair da ferramenta por meio de Ctrl+C ou SIGTERM para 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. Para obter mais informações, consulte Usando a porta de diagnóstico.

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
    

monitor de contadores dotnet

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 provedor e contador, consulte métricas internas. Para EventCounters, provider_name é o nome do EventSource e para Medidores, provider_name é o nome do Medidor.

  • -- <command>

    Após os parâmetros de configuração da coleção, você pode acrescentar -- seguido por um comando para iniciar um aplicativo .NET. dotnet-counters iniciará um processo com o comando fornecido e monitorará as métricas solicitadas. Isso geralmente é útil para coletar métricas para o caminho de inicialização do aplicativo e pode ser usado para diagnosticar ou monitorar problemas que ocorrem antes ou logo após o ponto de entrada principal.

    Observação

    O uso dessa opção monitora o primeiro processo do .NET que se comunica de volta com a ferramenta, o que significa que, se o comando iniciar vários aplicativos .NET, ele coletará apenas o primeiro aplicativo. Portanto, é recomendável que você use essa opção em aplicativos autocontidos ou usando a opção dotnet exec <app.dll> .

    Observação

    A inicialização de um executável do .NET por meio dotnet-counters de redirecionará sua entrada/saída e você não poderá interagir com seu stdin/stdout. Você pode sair da ferramenta por meio de Ctrl+C ou SIGTERM para 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. Para obter mais informações, consulte Usando a porta de diagnóstico.

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 um bit incompatível 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
    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
    

    Observação

    Se o aplicativo usar o .NET versão 8 ou inferior, o Medidor System.Runtime não existirá nessas versões e dotnet-counters retornará para exibir os EventCounters do System.Runtime mais antigos. A interface do usuário parece um pouco diferente, conforme mostrado aqui.

    [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 coletas de lixo e alocação de heap de coleta de lixo de 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
    
    
  • 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
    
  • Inicie my-aspnet-server.exe e monitore o # de assemblies carregados desde sua inicialização:

    > 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
    
  • Inicie my-aspnet-server.exe com arg1 e arg2 como argumentos de linha de comando e monitore seu conjunto de trabalho e tamanho de heap GC desde sua inicialização:

    > 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

Lista os processos de dotnet que podem ser monitorados por dotnet-counters. dotnet-counters A versão 6.0.320703 e posterior também exibe 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ê vê é 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

A porta de diagnóstico é um recurso de runtime 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 anteriores 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 cria dotnet-counters um soquete de diagnóstico chamado myport.sock e aguarda 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
    

    Isso permite dotnet-counters iniciar 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 do dotnet pode gerar muitos processos filho que não são seu aplicativo e eles podem se conectar antes dotnet-counters do seu aplicativo, deixando seu aplicativo para ser suspenso em runtime. É recomendável que você use diretamente uma versão independente do aplicativo ou use dotnet exec para iniciar o aplicativo.