Investigar contadores de desempenho (dotnet-counters)
Este artigo aplica-se a: ✔️ dotnet-counters
versão 3.0.47001 e versões posteriores.
Os contadores podem ser lidos a partir de aplicativos que executam o .NET 5 ou posterior.
Instalar
Há duas maneiras de baixar e instalar o dotnet-counters
:
Ferramenta global dotnet:
Para instalar a versão mais recente do
dotnet-counters
pacote 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 oprovider_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>
Após os parâmetros de configuração da coleção, o usuário pode acrescentar
--
seguido de um comando para iniciar um aplicativo .NET.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
O uso dessa opção monitora o primeiro processo do .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 autocontidos ou usar a opção
dotnet exec <app.dll>
.Observação
Iniciar um executável .NET via contadores dotnet redirecionará sua entrada/saída 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
. 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 oprovider_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>
Após os parâmetros de configuração da coleção, o usuário pode acrescentar --
seguido de um comando para iniciar um aplicativo .NET. 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
O uso dessa opção monitora o primeiro processo do .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 autocontidos ou usar a opção dotnet exec <app.dll>
.
Observação
Iniciar um executável .NET via contadores dotnet redirecionará sua entrada/saída 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
deEventSource
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 # de assemblies carregados a partir de sua inicialização:> 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
comarg1
earg2
como argumentos de linha de comando e monitore seu conjunto de trabalho e o tamanho do heap GC a partir de sua inicialização:> 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-counters
dotnet-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
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-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
.
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
Em um console separado, inicie o aplicativo de destino com a variável de ambiente
DOTNET_DiagnosticPorts
definida como o valor na saídadotnet-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 emmy-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 adotnet-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 usedotnet exec
para iniciar o aplicativo.