Investigación de los contadores de rendimiento (dotnet-counters)

Este artículo se aplica a: ✔️ dotnet-counters versión 3.0.47001 y posteriores

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 usa provider_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> (solo para aplicaciones de destino que ejecutan .NET 5 o versiones posteriores)

    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 de .NET con un entorno de ejecución de 5.0 como mínimo. 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

    El uso de esta opción supervisa el primer proceso de .NET 5 que se comunica con la herramienta, lo que significa que, si el comando inicia varias aplicaciones de .NET, solo recopilará la primera. 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 archivo ejecutable de .NET por medio de dotnet-counters redirigirá su entrada o 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, la herramienta también se cerrará y el seguimiento se debe poder ver de forma segura. 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 usa provider_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> (solo para aplicaciones de destino que ejecutan .NET 5 o versiones posteriores)

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 de .NET con un entorno de ejecución de 5.0 como mínimo. 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

El uso de esta opción supervisa el primer proceso de .NET 5 que se comunica con la herramienta, lo que significa que, si el comando inicia varias aplicaciones de .NET, solo recopilará la primera. 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 archivo ejecutable de .NET por medio de dotnet-counters redirigirá su entrada o 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 elemento EventSource 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 que se cargan desde su inicio (solo para .NET 5 o versiones posteriores):

    Importante

    Esto solo funciona para las aplicaciones que ejecutan .NET 5 o una versión 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 con arg1 y arg2 como argumentos de la línea de comandos y supervise su espacio de trabajo y el tamaño del montón de GC desde su inicio (solo para .NET 5 o versiones posteriores):

    Importante

    Esto solo funciona para las aplicaciones que ejecutan .NET 5 o una versión 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

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

Importante

Esto solo funciona para las aplicaciones que ejecutan .NET 5 o una versión posterior.

El puerto de diagnóstico es una característica del entorno de ejecución que se ha agregado en .NET 5 y permite iniciar la supervisión o la recopilación de 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.

  1. 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
    
  2. En una consola independiente, inicie la aplicación de destino con la variable de entorno DOTNET_DiagnosticPorts establecida en el valor de la salida de dotnet-counters.

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

    Esto debe habilitar dotnet-counters para empezar a recopilar contadores en 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 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 a dotnet-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 o dotnet exec para iniciar la aplicación.