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
:
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>
(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'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>
(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 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 (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
conarg1
earg2
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
.
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.
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per