Investigación de los contadores de rendimiento (dotnet-counters)
Este artículo se aplica a: ✔️ dotnet-counters
versión 3.0.47001 y versiones posteriores.
Los contadores se pueden leer desde aplicaciones que ejecutan .NET 5 o posterior.
Instalar
Hay dos maneras de descargar e instalar dotnet-counters
:
Herramienta global dotnet:
Para instalar la versión de lanzamiento más reciente del paquete NuGet de
dotnet-counters
, use el comando dotnet tool install:dotnet tool install --global dotnet-counters
Descarga directa:
descargue el archivo ejecutable de la herramienta que coincida con la plataforma:
SO Plataforma Windows x86 | x64 | Arm | Arm-x64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
Nota
Para usar dotnet-counters
en una aplicación x86, necesita la versión x86 correspondiente de la herramienta.
Sinopsis
dotnet-counters [-h|--help] [--version] <command>
Descripción
dotnet-counters
es una herramienta de supervisión de rendimiento diseñada para la investigación del rendimiento y la supervisión del estado de primer nivel ad hoc. Puede observar los valores del contador de rendimiento que se publican a través de la API EventCounter o la API Meter. Por ejemplo, se pueden supervisar rápidamente cosas como el uso de la CPU o la velocidad de las excepciones que se producen en la aplicación .NET Core para ver si hay algo sospechoso antes de profundizar en una investigación de rendimiento más seria mediante PerfView
o dotnet-trace
.
Opciones
--version
Muestra la versión de la utilidad dotnet-counters.
-h|--help
Muestra la ayuda de la línea de comandos.
Comandos
Comando |
---|
dotnet-counters collect |
dotnet-counters list |
dotnet-counters monitor |
dotnet-counters ps |
dotnet-counters collect
Recopila periódicamente los valores de contador seleccionados y los exporta a un formato de archivo especificado para su posterior procesamiento.
Sinopsis
dotnet-counters collect [-h|--help] [-p|--process-id] [-n|--name] [--diagnostic-port] [--refresh-interval] [--counters <COUNTERS>] [--format] [-o|--output] [-- <command>]
Opciones
-p|--process-id <PID>
Id. del proceso del que se van a recopilar datos de contador.
-n|--name <name>
Nombre del proceso del que se van a recopilar datos de contador.
--diagnostic-port
Nombre del puerto de diagnóstico que se va a crear. Vea Uso del puerto de diagnóstico para saber cómo usar esta opción a fin de iniciar los contadores de supervisión desde el inicio de la aplicación.
--refresh-interval <SECONDS>
Número de segundos de retraso entre la actualización de los contadores mostrados.
--counters <COUNTERS>
Una lista de contadores separados por comas. Los contadores pueden ser
provider_name[:counter_name]
especificados. Si se usaprovider_name
sin una lista de contadores que cumplan los requisitos, se mostrarán todos los contadores del proveedor. Para descubrir los nombres del proveedor y del contador, use el comando dotnet-counters list. Para EventCounters,provider_name
es el nombre de EventSource y para Meters,provider_name
es el nombre del medidor.--format <csv|json>
Formato que se va a exportar. Actualmente disponibles: csv, json.
-o|--output <output>
Nombre del archivo de salida.
-- <command>
Después de los parámetros de configuración de la colección, el usuario puede anexar
--
seguido de un comando para iniciar una aplicación .NET.dotnet-counters
iniciará un proceso con el comando proporcionado y recopilará las métricas solicitadas. Esto suele ser útil para recopilar métricas de la ruta de acceso de inicio de la aplicación y se puede usar para diagnosticar o supervisar los problemas que se producen antes o poco después del punto de entrada principal.Nota:
Con esta opción se supervisa el primer proceso de .NET que se comunica de nuevo con la herramienta, lo que significa que si el comando inicia varias aplicaciones .NET, solo recopilará la primera aplicación. Por tanto, se recomienda usar esta opción en aplicaciones independientes, o bien utilizar la opción
dotnet exec <app.dll>
.Nota:
El inicio de un ejecutable de .NET a través de dotnet-counters redirigirá su entrada y salida y no podrá interactuar con su stdin/stdout. La salida de la herramienta por medio de Ctrl + C o SIGTERM finalizará con seguridad la herramienta y el proceso secundario. Si el proceso secundario termina antes que la herramienta, esta también se cerrará. Si necesita usar stdin/stdout, puede usar la opción
--diagnostic-port
. Para obtener más información, vea Uso del puerto de diagnóstico.
Nota
En Linux y macOS, este comando espera que la aplicación de destino y dotnet-counters
compartan la misma variable de entorno TMPDIR
. De lo contrario, se agotará el tiempo de espera del comando.
Nota
Para recopilar métricas mediante dotnet-counters
, debe ejecutarse como el mismo usuario que el que ejecuta el proceso de destino, o bien como usuario raíz. De lo contrario, la herramienta no podrá establecer una conexión con el proceso de destino.
Ejemplos
Recopilación de todos los contadores en un intervalo de actualización de tres segundos y generación de un archivo CSV como salida:
> 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.
Inicie
dotnet mvc.dll
como un proceso secundario y comience a recopilar contadores de tiempo de ejecución y contadores de hospedaje de ASP.NET Core del inicio, y guárdelo como una salida 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
Muestra una lista de nombres y descripciones de contador, agrupada por proveedor.
Sinopsis
dotnet-counters list [-h|--help]
Ejemplo
> 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
Nota
Los contadores de Microsoft.AspNetCore.Hosting
se muestran cuando hay procesos identificados que admiten estos contadores, por ejemplo, cuando una aplicación ASP.NET Core se está ejecutando en el equipo host.
dotnet-counters monitor
Muestra la actualización periódica de los valores de los contadores seleccionados.
Sinopsis
dotnet-counters monitor [-h|--help] [-p|--process-id] [-n|--name] [--diagnostic-port] [--refresh-interval] [--counters] [-- <command>]
Opciones
-p|--process-id <PID>
Id. del proceso que se va a supervisar.
-n|--name <name>
Nombre del proceso que se va a supervisar.
--diagnostic-port
Nombre del puerto de diagnóstico que se va a crear. Vea Uso del puerto de diagnóstico para saber cómo usar esta opción a fin de iniciar los contadores de supervisión desde el inicio de la aplicación.
--refresh-interval <SECONDS>
Número de segundos de retraso entre la actualización de los contadores mostrados.
--counters <COUNTERS>
Una lista de contadores separados por comas. Los contadores pueden ser
provider_name[:counter_name]
especificados. Si se usaprovider_name
sin una lista de contadores que cumplan los requisitos, se mostrarán todos los contadores del proveedor. Para descubrir los nombres del proveedor y del contador, use el comando dotnet-counters list. Para EventCounters,provider_name
es el nombre de EventSource y para Meters,provider_name
es el nombre del medidor.
-- <command>
Después de los parámetros de configuración de la colección, el usuario puede anexar --
seguido de un comando para iniciar una aplicación .NET. dotnet-counters
iniciará un proceso con el comando proporcionado y supervisará las métricas solicitadas. Esto suele ser útil para recopilar métricas de la ruta de acceso de inicio de la aplicación y se puede usar para diagnosticar o supervisar los problemas que se producen antes o poco después del punto de entrada principal.
Nota:
Con esta opción se supervisa el primer proceso de .NET que se comunica de nuevo con la herramienta, lo que significa que si el comando inicia varias aplicaciones .NET, solo recopilará la primera aplicación. Por tanto, se recomienda usar esta opción en aplicaciones independientes, o bien utilizar la opción dotnet exec <app.dll>
.
Nota:
El inicio de un ejecutable de .NET a través de dotnet-counters redirigirá su entrada y salida y no podrá interactuar con su stdin/stdout. La salida de la herramienta por medio de Ctrl + C o SIGTERM finalizará con seguridad la herramienta y el proceso secundario. Si el proceso secundario termina antes que la herramienta, esta también se cerrará. Si necesita usar stdin/stdout, puede usar la opción --diagnostic-port
. Para obtener más información, vea Uso del puerto de diagnóstico.
Nota
En Linux y macOS, este comando espera que la aplicación de destino y dotnet-counters
compartan la misma variable de entorno TMPDIR
.
Nota
Para supervisar métricas mediante dotnet-counters
, debe ejecutarse como el mismo usuario que el que ejecuta el proceso de destino, o bien como usuario raíz.
Nota
Si ve un mensaje de error similar al siguiente: [ERROR] System.ComponentModel.Win32Exception (299): A 32 bit processes cannot access modules of a 64 bit process.
, está intentando usar dotnet-counters
que tiene un valor de bits no coincidente con el proceso de destino. Asegúrese de descargar el valor de bits correcto de la herramienta en el vínculo de instalación.
Ejemplos
Supervisión de todos los contadores de
System.Runtime
con un intervalo de actualización 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
Supervisión de únicamente el uso de la CPU y el tamaño del montón de 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
Supervisión de los valores
EventCounter
del elementoEventSource
definido por el usuario. Para obtener más información, consulte Tutorial: Medición del rendimiento mediante EventCounters en .NET Core.> dotnet-counters monitor --process-id 1902 --counters Samples-EventCounterDemos-Minimal Press p to pause, r to resume, q to quit. request 100
Vea todos los contadores conocidos que están disponibles en
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
Vea todos los contadores conocidos que están disponibles en
dotnet-counters
para aplicaciones de .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
y supervise el número de ensamblados cargados desde su inicio:> 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
conarg1
yarg2
como argumentos de línea de comandos y supervise su tamaño de montón de GC y conjunto de trabajo desde su inicio:> 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
Enumera los procesos dotnet que dotnet-counters
puede supervisar.
dotnet-counters
versión 6.0.320703 y posteriores también muestran los argumentos de la línea de comandos con los que se ha iniciado cada proceso, si están disponibles.
Sinopsis
dotnet-counters ps [-h|--help]
Ejemplo
Imagine que inicia una aplicación de ejecución prolongada con el comando dotnet run --configuration Release
. En otra ventana ejecuta el comando dotnet-counters ps
. La salida que se ve es la siguiente. Los argumentos de la línea de comandos, si los hay, se muestran en dotnet-counters
versión 6.0.320703 y posteriores.
> dotnet-counters ps
21932 dotnet C:\Program Files\dotnet\dotnet.exe run --configuration Release
36656 dotnet C:\Program Files\dotnet\dotnet.exe
Uso del puerto de diagnóstico
El puerto de diagnóstico es una característica en tiempo de ejecución que permite empezar a supervisar o recopilar contadores desde el inicio de la aplicación. Para hacer esto con dotnet-counters
, puede usar dotnet-counters <collect|monitor> -- <command>
, tal como se describe en los ejemplos anteriores, o bien la opción --diagnostic-port
.
El uso de dotnet-counters <collect|monitor> -- <command>
para iniciar la aplicación como un proceso secundario es la manera más sencilla de realizar una supervisión rápida desde el inicio.
Sin embargo, si quiere obtener un control más preciso sobre la vigencia de la aplicación supervisada (por ejemplo, supervisar la aplicación solo durante los primeros 10 minutos y continuar la ejecución), o si necesita interactuar con la aplicación mediante la CLI, el uso de la opción --diagnostic-port
le permite controlar la aplicación de destino que se supervisa y dotnet-counters
.
El comando siguiente hace que dotnet-counters cree un socket de diagnóstico denominado
myport.sock
y que espere a una conexión.dotnet-counters collect --diagnostic-port myport.sock
Salida:
Waiting for connection on myport.sock Start an application with the following environment variable: DOTNET_DiagnosticPorts=/home/user/myport.sock
En una consola independiente, inicie la aplicación de destino con la variable de entorno
DOTNET_DiagnosticPorts
establecida en el valor de la salida dedotnet-counters
.export DOTNET_DiagnosticPorts=/home/user/myport.sock ./my-dotnet-app arg1 arg2
Esto debe habilitar
dotnet-counters
para empezar a recopilar contadores enmy-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 la aplicación con
dotnet run
puede resultar problemático porque la CLI de dotnet puede generar muchos procesos secundarios que no sean de la aplicación. Además, dichos procesos pueden conectarse adotnet-counters
antes que la aplicación, lo que causa que esta se suspenda en tiempo de ejecución. Se recomienda usar directamente una versión independiente de la aplicación odotnet exec
para iniciar la aplicación.