Analizzare i contatori delle prestazioni (dotnet-counters)

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

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> (solo per le applicazioni di destinazione che eseguono .NET 5 o versioni successive)

    Dopo i parametri di configurazione della raccolta, l'utente può accodare -- seguito da un comando per avviare un'applicazione .NET con almeno un runtime 5.0. 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 5 che comunica di nuovo allo strumento. Questo significa che 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 comporterà il reindirizzamento dell'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 e la traccia dovrebbe essere visualizzabile in modo sicuro. 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> (solo per le applicazioni di destinazione che eseguono .NET 5 o versioni successive)

Dopo i parametri di configurazione della raccolta, l'utente può accodare -- seguito da un comando per avviare un'applicazione .NET con almeno un runtime 5.0. 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 5 che comunica di nuovo allo strumento. Questo significa che 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 comporterà il reindirizzamento dell'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 (solo .NET 5 o versione successiva):

    Importante

    Questa operazione funziona solo per le app che eseguono .NET 5 o versioni successive.

    > 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 suo working set e le dimensioni dell'heap GC dall'avvio (solo .NET 5 o versioni successive):

    Importante

    Questa operazione funziona solo per le app che eseguono .NET 5 o versioni successive.

    > 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

Importante

Questa operazione funziona solo per le app che eseguono .NET 5 o versioni successive.

La porta di diagnostica è una funzionalità di runtime aggiunta in .NET 5 che ti 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.