Analizzare i contatori delle prestazioni (dotnet-counters)

Questo articolo si applica a: ✔️ dotnet-counters versione 3.0.47001 e versioni successive.

I contatori possono essere letti dalle applicazioni che eseguono .NET 5 o versione successiva.

Installare

Esistono due modi per scaricare e installare dotnet-counters:

Nota

Per usare dotnet-counters in un'app x86, è necessaria una versione x86 corrispondente dello strumento.

Riepilogo

dotnet-counters [-h|--help] [--version] <command>

Descrizione

dotnet-counters è uno strumento di monitoraggio delle prestazioni per il monitoraggio ad hoc dello stato e l'analisi delle prestazioni di primo livello. Può osservare i valori dei contatori delle prestazioni pubblicati tramite l'API EventCounter o l'API Meter. Ad esempio, puoi monitorare rapidamente elementi come l'utilizzo della CPU o la frequenza delle eccezioni generate nell'applicazione .NET Core per verificare l’eventuale presenza di elementi sospetti prima di approfondire l'analisi delle prestazioni usando PerfView o dotnet-trace.

Opzioni

  • --version

    Visualizza la versione dell'utilità dotnet-counters.

  • -h|--help

    Mostra la Guida della riga di comando.

Comandi

Comando
dotnet-counters collect
dotnet-counters list
dotnet-counters monitor
dotnet-counters ps

dotnet-counters collect

Raccogliere periodicamente i valori dei contatori selezionati ed esportarli in un formato di file specificato per la post-elaborazione.

Riepilogo

dotnet-counters collect [-h|--help] [-p|--process-id] [-n|--name] [--diagnostic-port] [--refresh-interval] [--counters <COUNTERS>] [--format] [-o|--output] [-- <command>]

Opzioni

  • -p|--process-id <PID>

    ID del processo da cui raccogliere i dati del contatore.

  • -n|--name <name>

    Nome del processo da cui raccogliere i dati del contatore.

  • --diagnostic-port

    Nome della porta di diagnostica da creare. Per informazioni su come usare questa opzione per avviare il monitoraggio dei contatori dall'avvio dell'app, vedere Uso della porta di diagnostica.

  • --refresh-interval <SECONDS>

    Numero di secondi di ritardo tra l'aggiornamento dei contatori visualizzati

  • --counters <COUNTERS>

    Elenco dei contatori, delimitati da virgole. È possibile specificare provider_name[:counter_name] per i contatori. Se l'oggetto provider_name viene utilizzato senza un elenco qualificato di contatori, vengono visualizzati tutti i contatori del provider. Per individuare i nomi dei provider e dei contatori, usare il comando dotnet-counters list. Per EventCounters, provider_name è il nome di EventSource e per Meters, provider_name è il nome del contatore.

  • --format <csv|json>

    Formato da esportare. Attualmente disponibile: csv, json.

  • -o|--output <output>

    Nome del file di output.

  • -- <command>

    Dopo i parametri di configurazione della raccolta, l'utente può accodare -- seguito da un comando per avviare un'applicazione .NET. dotnet-counters avvierà un processo con il comando fornito e raccoglierà le metriche richieste. Ciò spesso è utile per raccogliere le metriche del percorso di avvio dell'applicazione e può essere usato per diagnosticare o monitorare i problemi che si verificano prima o poco dopo il punto di ingresso principale.

    Nota

    L'uso di questa opzione monitora il primo processo .NET che comunica di nuovo allo strumento, ovvero se il comando avvia più applicazioni .NET, raccoglierà solo la prima app. Pertanto, è consigliabile usare questa opzione nelle applicazioni autonome o usando l'opzione dotnet exec <app.dll>.

    Nota

    L'avvio di un eseguibile .NET tramite dotnet-counters reindirizzerà l'input/output e non sarà possibile interagire con il relativo stdin/stdout. L'uscita dallo strumento tramite CTRL+C o SIGTERM terminerà in modo sicuro sia lo strumento che il processo figlio. Se il processo figlio viene chiuso prima dello strumento, lo strumento verrà chiuso. Se è necessario usare stdin/stdout, è possibile usare l'opzione --diagnostic-port. Per altre informazioni, vedi Uso della porta di diagnostica.

Nota

In Linux e macOS questo comando prevede che l'applicazione di destinazione e dotnet-counters condividano la stessa variabile di ambiente TMPDIR. In caso contrario, il comando raggiungerà il timeout.

Nota

Per raccogliere le metriche utilizzando dotnet-counters, è necessario che venga eseguito come stesso utente che esegue il processo target o come radice. In caso contrario, lo strumento non riuscirà a stabilire una connessione con il processo di destinazione.

Esempi

  • Raccogliere tutti i contatori con un intervallo di aggiornamento di 3 secondi e generare un csv come output:

    > 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.
    
  • Avvia dotnet mvc.dll come processo figlio e inizia a raccogliere contatori di runtime e contatori di hosting ASP.NET Core dall'avvio e salvali come output 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

Visualizza un elenco di nomi e descrizioni dei contatori, raggruppati per provider.

Riepilogo

dotnet-counters list [-h|--help]

Esempio

> 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

I contatori Microsoft.AspNetCore.Hosting vengono visualizzati quando sono presenti processi identificati che supportano tali contatori, ad esempio quando un'applicazione ASP.NET Core è in esecuzione nel computer host.

dotnet-counters monitor

Visualizza i valori di aggiornamento periodico dei contatori selezionati.

Riepilogo

dotnet-counters monitor [-h|--help] [-p|--process-id] [-n|--name] [--diagnostic-port] [--refresh-interval] [--counters] [-- <command>]

Opzioni

  • -p|--process-id <PID>

    ID del processo da monitorare.

  • -n|--name <name>

    Nome del processo da monitorare.

  • --diagnostic-port

    Nome della porta di diagnostica da creare. Per informazioni su come usare questa opzione per avviare il monitoraggio dei contatori dall'avvio dell'app, vedere Uso della porta di diagnostica.

  • --refresh-interval <SECONDS>

    Numero di secondi di ritardo tra l'aggiornamento dei contatori visualizzati

  • --counters <COUNTERS>

    Elenco dei contatori, delimitati da virgole. È possibile specificare provider_name[:counter_name] per i contatori. Se l'oggetto provider_name viene utilizzato senza un elenco qualificato di contatori, vengono visualizzati tutti i contatori del provider. Per individuare i nomi dei provider e dei contatori, usare il comando dotnet-counters list. Per EventCounters, provider_name è il nome di EventSource e per Meters, provider_name è il nome del contatore.

-- <command>

Dopo i parametri di configurazione della raccolta, l'utente può accodare -- seguito da un comando per avviare un'applicazione .NET. dotnet-counters avvierà un processo con il comando fornito e monitorerà le metriche richieste. Ciò spesso è utile per raccogliere le metriche del percorso di avvio dell'applicazione e può essere usato per diagnosticare o monitorare i problemi che si verificano prima o poco dopo il punto di ingresso principale.

Nota

L'uso di questa opzione monitora il primo processo .NET che comunica di nuovo allo strumento, ovvero se il comando avvia più applicazioni .NET, raccoglierà solo la prima app. Pertanto, è consigliabile usare questa opzione nelle applicazioni autonome o usando l'opzione dotnet exec <app.dll>.

Nota

L'avvio di un eseguibile .NET tramite dotnet-counters reindirizzerà l'input/output e non sarà possibile interagire con il relativo stdin/stdout. L'uscita dallo strumento tramite CTRL+C o SIGTERM terminerà in modo sicuro sia lo strumento che il processo figlio. Se il processo figlio viene chiuso prima dello strumento, lo strumento verrà chiuso. Se è necessario usare stdin/stdout, è possibile usare l'opzione --diagnostic-port. Per altre informazioni, vedi Uso della porta di diagnostica.

Nota

In Linux e macOS questo comando prevede che l'applicazione di destinazione e dotnet-counters condividano la stessa variabile di ambiente TMPDIR.

Nota

Per monitorare le metriche utilizzando dotnet-counters, è necessario che venga eseguito come stesso utente che esegue il processo target o come radice.

Nota

Se vedi un messaggio di errore simile al seguente: [ERROR] System.ComponentModel.Win32Exception (299): A 32 bit processes cannot access modules of a 64 bit process., stai tentanto di usare dotnet-counters con un numero di bit non che non corrisponde al processo di destinazione. Assicurati di scaricare il numero di bit corretto dello strumento nel collegamento installazione.

Esempi

  • Monitorare tutti i contatori da System.Runtime a un intervallo di aggiornamento di 3 secondi:

    > 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
    
  • Monitorare solo l'utilizzo della CPU e le dimensioni dell'heap GC da 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
    
  • Monitorare i EventCounter valori da EventSource definito dall’utente. Per altre informazioni, vedi Esercitazione: Misurare le prestazioni con EventCounters in .NET Core.

    > dotnet-counters monitor --process-id 1902 --counters Samples-EventCounterDemos-Minimal
    
    Press p to pause, r to resume, q to quit.
        request                                      100
    
  • Visualizzare tutti i contatori noti disponibili in 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
    
  • Visualizzare tutti i contatori noti disponibili in dotnet-counters per le app .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
    
  • Avviare my-aspnet-server.exe e monitorare il numero di assembly caricati dall'avvio:

    > 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
    
  • Avviare my-aspnet-server.exe con arg1 e arg2 come argomenti della riga di comando e monitorare il set di lavoro e le dimensioni dell'heap GC dall'avvio:

    > 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

Elenca i processi dotnet che possono essere monitorati da dotnet-counters. dotnet-counters versione 6.0.320703 e versioni successive mostrano anche gli argomenti della riga di comando con cui è stato avviato ogni processo, se disponibile.

Riepilogo

dotnet-counters ps [-h|--help]

Esempio

Si supponga di avviare un'app a esecuzione prolungata usando il comando dotnet run --configuration Release. In un'altra finestra si esegue il comando dotnet-counters ps. L'output visualizzato è il seguente. Gli argomenti della riga di comando, se presenti, vengono visualizzati nella versione 6.0.320703 di dotnet-counters e versioni successive.

> dotnet-counters ps
  
  21932 dotnet     C:\Program Files\dotnet\dotnet.exe   run --configuration Release
  36656 dotnet     C:\Program Files\dotnet\dotnet.exe

Uso della porta di diagnostica

La porta di diagnostica è una funzionalità di runtime che consente di avviare il monitoraggio o la raccolta di contatori dall'avvio dell'app. A tale scopo, usando dotnet-counters, è possibile usare dotnet-counters <collect|monitor> -- <command> come descritto negli esempi precedenti oppure usare l'opzione --diagnostic-port.

L'uso di dotnet-counters <collect|monitor> -- <command> per avviare l'applicazione come processo figlio è il modo più semplice per monitorarla rapidamente dall'avvio.

Tuttavia, quando si vuole ottenere un controllo più preciso sulla durata dell'app monitorata (ad esempio, monitorare l'app solo per i primi 10 minuti e continuare l'esecuzione) o se è necessario interagire con l'app usando l'interfaccia della riga di comando, l'opzione --diagnostic-port ti consente di controllare sia l'app di destinazione monitorata che dotnet-counters.

  1. Il comando seguente fa sì che dotnet-counters crei un socket di diagnostica denominato myport.sock e attenda una connessione.

    dotnet-counters collect --diagnostic-port myport.sock
    

    Output:

    Waiting for connection on myport.sock
    Start an application with the following environment variable: DOTNET_DiagnosticPorts=/home/user/myport.sock
    
  2. In una console separata, avvia l'applicazione di destinazione con la variabile di ambiente DOTNET_DiagnosticPorts impostata sul valore nell'output dotnet-counters.

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

    Questo dovrebbe abilitare dotnet-counters ad avviare la raccolta dei contatori in 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

    L'avvio dell'app con dotnet run può essere problematico perché l'interfaccia della riga di comando dotnet può generare molti processi figlio che non sono l'app e questi possono connettersi a dotnet-counters prima dell'app, lasciandola sospesa in fase di esecuzione. È consigliabile usare direttamente una versione autonoma dell'app o usare dotnet exec per avviare l'applicazione.