Partilhar via


Investigar contadores de desempenho (contadores de pontos)

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

Os contadores podem ser lidos a partir de aplicações que executam o .NET 5 ou posterior.

Instalar

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

  • Execução one-shot (recomendado):

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

    dnx dotnet-counters [options]
    

    Por exemplo:

    dnx dotnet-counters monitor --process-id 1234
    

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

  • Ferramenta global dotnet:

    Para instalar a versão mais recente do dotnet-counterspacote NuGet para uso frequente, use o comando dotnet tool install :

    dotnet tool install --global dotnet-counters
    

    Este 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 as ferramentas instaladas globalmente.

  • Download direto:

    Faça o download do executável da ferramenta que corresponde à sua plataforma:

    SO Plataforma
    Windows
    Linux x64 | Braço | Arm64 | musl-x64 | musl-Arm64

Nota

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>

Description

dotnet-counters é uma ferramenta de monitoramento de desempenho para monitoramento de integridade ad hoc e investigação de desempenho de primeiro nível. Ele pode observar valores de contadores de desempenho que são publicados por meio da EventCounter API ou da Meter API. Por exemplo, você pode monitorar rapidamente coisas como o uso da CPU ou a taxa de exceções que estão sendo lançadas em seu aplicativo .NET Core para ver se há algo suspeito antes de mergulhar em investigações de desempenho mais sérias 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
contadores-dotnet coletam
Monitor de contadores de pontos
contadores de pontos ps

contadores-dotnet coletam

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 para coletar dados do contador.

    Nota

    No Linux e 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 atingirá o tempo limite.

  • -n|--name <name>

    O nome do processo para coletar dados do contador.

    Nota

    No Linux e 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 atingirá o 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 tempo de execução do .NET dentro do processo de destino deve concordar com o endereço da porta, com um ouvindo e o outro se conectando. dotnet-counters determina automaticamente a porta correta ao anexar usando as --process-id opções ou --name ou ao iniciar um processo usando a -- <command> opção. Normalmente, só é necessário especificar a porta explicitamente ao aguardar um processo que será iniciado no futuro ou ao se comunicar com um processo que está sendo executado dentro de um contêiner que não faz parte do namespace do processo atual.

    O port-address difere por SO:

    • 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 - uma porta IP:, como 127.0.0.1:9000.

    Por padrão, dotnet-counters ouve no endereço especificado. Em vez disso, você pode solicitar dotnet-counters a conexão anexando ,connect após o endereço. Por exemplo, --diagnostic-port /foo/tool1.socket,connect se conectará a um processo de tempo de execução .NET que está ouvindo o soquete de /foo/tool1.socket domínio Unix.

    Para obter informações sobre como usar essa opção para começar a monitorar contadores a partir da inicialização do aplicativo, consulte Usando porta de diagnóstico.

  • --refresh-interval <SECONDS>

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

  • --counters <COUNTERS>

    Uma lista de contadores separados por vírgula. 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, consulte métricas internas. Para EventCounters, provider_name é o nome do EventSource e para Meters, provider_name é o nome do Meter.

  • --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 acontecem antes ou logo após o ponto de entrada principal.

    Nota

    O uso dessa opção monitora o primeiro processo .NET que se comunica 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 autônomos ou usando a dotnet exec <app.dll> opção.

    Nota

    Se você iniciar um executável .NET via dotnet-counters, sua entrada/saída será redirecionada e você não poderá interagir com seu stdin/stdout. Você pode sair da ferramenta via Ctrl+C ou SIGTERM para encerrar com segurança a ferramenta e o processo filho. Se o processo filho sair antes da ferramenta, a ferramenta também será encerrada. Se você precisar usar stdin / stdout, você pode usar a --diagnostic-port opção. Para obter mais informações, consulte Usando porta de diagnóstico.

Nota

Para coletar métricas usando dotnet-counterso , ele precisa ser executado como o mesmo usuário que o usuário que executa o processo de destino ou como root. Caso contrário, a ferramenta não conseguirá 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 tempo de execução e contadores de hospedagem principal ASP.NET da inicialização e salve-o 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 de pontos

Exibe valores de atualização periódica dos 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>

    O 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 Usando a porta de diagnóstico para saber como usar essa opção para começar a monitorar 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>

    Uma lista de contadores separados por vírgula. 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, consulte métricas internas. Para EventCounters, provider_name é o nome do EventSource e para Meters, provider_name é o nome do Meter.

  • -- <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 acontecem antes ou logo após o ponto de entrada principal.

    Nota

    O uso dessa opção monitora o primeiro processo .NET que se comunica 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 autônomos ou usando a dotnet exec <app.dll> opção.

    Nota

    Iniciar um executável .NET via dotnet-counters redirecionará sua entrada/saída e você não poderá interagir com seu stdin/stdout. Você pode sair da ferramenta via Ctrl+C ou SIGTERM para encerrar com segurança a ferramenta e o processo filho. Se o processo filho sair antes da ferramenta, a ferramenta também será encerrada. Se você precisar usar stdin / stdout, você pode usar a --diagnostic-port opção. Para obter mais informações, consulte Usando porta de diagnóstico.

Nota

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

Nota

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

Nota

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 tem bitness incompatível com o processo de destino. Certifique-se de baixar o bitness correto da ferramenta no link de instalação .

Exemplos

  • Monitore todos os contadores a partir de um intervalo de System.Runtime 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
    

    Nota

    Se o aplicativo usa o .NET versão 8 ou inferior, o System.Runtime Meter não existe nessas versões e dotnet-counters voltará para exibir os Contadores de Eventos System.Runtime mais antigos. A interface do usuário parece ligeiramente diferente, como 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 as coletas de lixo e a alocação de pilha 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
    
    
  • Monitore EventCounter valores de EventSource. 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 o tamanho do 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
    
    

contadores de pontos ps

Lista os processos dotnet que podem ser monitorados pelo 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, você executa o dotnet-counters ps comando. A saída que você vê é a seguinte. Os argumentos de linha de comando, se houver, são mostrados na 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

Usando a porta de diagnóstico

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

Usar dotnet-counters <collect|monitor> -- <command> para iniciar o aplicativo como um processo filho é a maneira mais simples de monitorá-lo rapidamente desde 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, monitorar o aplicativo apenas nos primeiros 10 minutos e continuar executando) ou se precisar interagir com o aplicativo usando a CLI, usar --diagnostic-port a opção permite controlar o aplicativo de destino que está sendo monitorado e dotnet-counters.

  1. O comando a seguir faz com que dotnet-counters crie um soquete de diagnóstico chamado myport.sock e aguarde 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 DOTNET_DiagnosticPorts de ambiente definida como o valor na dotnet-counters saída.

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

    Isso permite dotnet-counters começar a coletar 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

    Abrir a sua aplicação pode dotnet run ser problemático porque a CLI dotnet pode gerar muitos processos filhos que não são a sua aplicação e a que podem ligar-se dotnet-counters antes da sua aplicação, deixando a sua aplicação suspensa 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.