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
:
Strumento globale dotnet:
Per installare la versione più recente del
dotnet-counters
pacchetto NuGet, usare il comando dotnet tool install :dotnet tool install --global dotnet-counters
Download diretto:
Scaricare lo strumento eseguibile corrispondente alla piattaforma:
Sistema operativo Piattaforma Finestre x86 | x64 | Arm | Arm-x64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
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'oggettoprovider_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'oggettoprovider_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 daEventSource
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
conarg1
earg2
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
.
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
In una console separata, avvia l'applicazione di destinazione con la variabile di ambiente
DOTNET_DiagnosticPorts
impostata sul valore nell'outputdotnet-counters
.export DOTNET_DiagnosticPorts=/home/user/myport.sock ./my-dotnet-app arg1 arg2
Questo dovrebbe abilitare
dotnet-counters
ad avviare la raccolta dei contatori inmy-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 adotnet-counters
prima dell'app, lasciandola sospesa in fase di esecuzione. È consigliabile usare direttamente una versione autonoma dell'app o usaredotnet exec
per avviare l'applicazione.