Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 tre modi per scaricare e usare dotnet-counters:
Esecuzione one-shot (scelta consigliata):
A partire da .NET 10.0.100, è possibile eseguire
dotnet-counterssenza installazione permanente usandodnx:dnx dotnet-counters [options]Per esempio:
dnx dotnet-counters monitor --process-id 1234Questo approccio scarica automaticamente ed esegue la versione più recente senza modificare definitivamente il sistema.
Strumento globale dotnet:
Per installare la versione più recente del
dotnet-counterspacchetto NuGet per un uso frequente, usare il comando dotnet tool install :dotnet tool install --global dotnet-countersQuesto comando installa un
dotnet-countersfile binario nel percorso degli strumenti di .NET SDK, che è possibile aggiungere al percorso path per richiamare facilmente gli strumenti installati a livello globale.Download diretto:
Scaricare lo strumento eseguibile corrispondente alla piattaforma:
Sistema operativo Piattaforma Finestre x86 | x64 | Braccio | Arm-x64 Linux x64 | Braccio | 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
--versionVisualizza la versione dell'utilità
dotnet-counters.-h|--helpMostra la Guida della riga di comando.
Comandi
| Comando |
|---|
| dotnet-counters collect |
| Monitoraggio dotnet-counters |
| 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.
Nota
In Linux e macOS, l'uso di questa opzione richiede l'applicazione di destinazione e
dotnet-counterscondividere la stessaTMPDIRvariabile di ambiente. In caso contrario, il comando raggiungerà il timeout.-n|--name <name>Nome del processo da cui raccogliere i dati del contatore.
Nota
In Linux e macOS, l'uso di questa opzione richiede l'applicazione di destinazione e
dotnet-counterscondividere la stessaTMPDIRvariabile di ambiente. In caso contrario, il comando raggiungerà il timeout.--diagnostic-port <port-address[,(listen|connect)]>Imposta la porta di diagnostica utilizzata per comunicare con il processo da monitorare.
dotnet-counterse il runtime .NET all'interno del processo di destinazione devono concordare l'indirizzo della porta, con uno in ascolto e l'altro connessione.dotnet-countersdetermina automaticamente la porta corretta durante il collegamento utilizzando le--process-idopzioni o--nameo quando si avvia un processo usando l'opzione-- <command>. In genere è necessario specificare la porta in modo esplicito quando si attende un processo che verrà avviato in futuro o comunicando a un processo in esecuzione all'interno di un contenitore che non fa parte dello spazio dei nomi del processo corrente.Il valore
port-addressè diverso dal sistema operativo:- Linux e macOS: percorso di un socket di dominio Unix,
/foo/tool1.socketad esempio . - Windows: percorso di una named pipe,
\\.\pipe\my_diag_port1ad esempio . - Android, iOS e tvOS: una porta IP, ad esempio
127.0.0.1:9000.
Per impostazione predefinita,
dotnet-countersrimane in ascolto dell'indirizzo specificato. È possibile richiederedotnet-countersinvece di connettersi aggiungendo,connectdopo l'indirizzo. Ad esempio,--diagnostic-port /foo/tool1.socket,connectsi connetterà a un processo di runtime .NET in ascolto del socket di/foo/tool1.socketdominio Unix.Per informazioni su come usare questa opzione per avviare il monitoraggio dei contatori dall'avvio dell'app, vedere Uso della porta di diagnostica.
- Linux e macOS: percorso di un socket di dominio Unix,
--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_nameviene utilizzato senza un elenco qualificato di contatori, vengono visualizzati tutti i contatori del provider. Per individuare i nomi dei provider e dei contatori, vedere Metriche predefinite. Per EventCounters,provider_nameè il nome di EventSource e per Metri,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-countersavvia un processo con il comando fornito e raccoglie le metriche richieste. Ciò è spesso utile per raccogliere le metriche per il 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. È quindi consigliabile usare questa opzione nelle applicazioni autonome o usando l'opzione
dotnet exec <app.dll>.Nota
Se si avvia un eseguibile .NET tramite
dotnet-counters, il relativo input/output verrà reindirizzato e non sarà possibile interagire con il relativo stdin/stdout. È possibile uscire dallo strumento tramite CTRL+C o SIGTERM per terminare 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, vedere Uso della porta di diagnostica.
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.dllcome 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
Monitoraggio dotnet-counters
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-portNome 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_nameviene utilizzato senza un elenco qualificato di contatori, vengono visualizzati tutti i contatori del provider. Per individuare i nomi dei provider e dei contatori, vedere Metriche predefinite. Per EventCounters,provider_nameè il nome di EventSource e per Metri,provider_nameè il nome del contatore.-- <command>Dopo i parametri di configurazione della raccolta, è possibile accodare
--seguito da un comando per avviare un'applicazione .NET.dotnet-countersavvierà un processo con il comando fornito e monitorerà le metriche richieste. Ciò è spesso utile per raccogliere le metriche per il 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. È quindi consigliabile usare questa opzione nelle applicazioni autonome o usando l'opzione
dotnet exec <app.dll>.Nota
L'avvio di un eseguibile .NET tramite
dotnet-countersreindirizzerà l'input/output e non sarà possibile interagire con il relativo stdin/stdout. È possibile uscire dallo strumento tramite CTRL+C o SIGTERM per terminare 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, vedere 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 viene visualizzato un messaggio di errore simile al seguente: [ERROR] System.ComponentModel.Win32Exception (299): A 32 bit processes cannot access modules of a 64 bit process., si sta provando a usare dotnet-counters che presenta un bitness non corrispondente rispetto al processo di destinazione. Assicurati di scaricare il numero di bit corretto dello strumento nel collegamento installazione.
Esempi
Monitorare tutti i contatori da
System.Runtimea 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 Name Current Value [System.Runtime] dotnet.assembly.count ({assembly}) 115 dotnet.gc.collections ({collection}) gc.heap.generation ------------------ gen0 5 gen1 1 gen2 1 dotnet.gc.heap.total_allocated (By) 1.6947e+08 dotnet.gc.last_collection.heap.fragmentation.size (By) gc.heap.generation ------------------ gen0 0 gen1 348,248 gen2 0 loh 32 poh 0 dotnet.gc.last_collection.heap.size (By) gc.heap.generation ------------------ gen0 0 gen1 18,010,920 gen2 5,065,600 loh 98,384 poh 3,407,048 dotnet.gc.last_collection.memory.committed_size (By) 66,842,624 dotnet.gc.pause.time (s) 0.05 dotnet.jit.compilation.time (s) 1.317 dotnet.jit.compiled_il.size (By) 574,886 dotnet.jit.compiled_methods ({method}) 6,008 dotnet.monitor.lock_contentions ({contention}) 194 dotnet.process.cpu.count ({cpu}) 16 dotnet.process.cpu.time (s) cpu.mode -------- system 4.953 user 6.266 dotnet.process.memory.working_set (By) 1.3217e+08 dotnet.thread_pool.queue.length ({work_item}) 0 dotnet.thread_pool.thread.count ({thread}) 133 dotnet.thread_pool.work_item.count ({work_item}) 71,188 dotnet.timer.count ({timer}) 124Nota
Se l'app usa .NET versione 8 o precedente, System.Runtime Meter non esiste in tali versioni e
dotnet-counterseseguirà il fallback per visualizzare invece system.Runtime EventCounters meno recente. L'interfaccia utente è leggermente diversa, come illustrato di seguito.[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) 19Monitorare solo le operazioni di Garbage Collection e l'allocazione dell'heap di Garbage Collection da
System.Runtime:> dotnet-counters monitor --process-id 1902 --counters System.Runtime[dotnet.gc.collections,dotnet.gc.heap.total_allocated] Press p to pause, r to resume, q to quit. Status: Running Name Current Value [System.Runtime] dotnet.gc.collections ({collection}) gc.heap.generation ------------------ gen0 0 gen1 0 gen2 0 dotnet.gc.heap.total_allocated (By) 9,943,384Monitorare i
EventCountervalori daEventSourcedefinito 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 100Avviare
my-aspnet-server.exee monitorare il numero di assembly caricati dall'avvio:> dotnet-counters monitor --counters System.Runtime[dotnet.assembly.count] -- my-aspnet-server.exe Press p to pause, r to resume, q to quit. Status: Running Name Current Value [System.Runtime] dotnet.assembly.count ({assembly}) 11Avviare
my-aspnet-server.execonarg1earg2come 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[dotnet.process.memory.working_set,dotnet.gc.last_collection.heap.size] -- my-aspnet-server.exe arg1 arg2Name Current Value [System.Runtime] dotnet.gc.last_collection.heap.size (By) gc.heap.generation ------------------ gen0 560 gen1 462,720 gen2 0 loh 0 poh 8,184 dotnet.process.memory.working_set (By) 48,431,104
dotnet-counters ps
Elenca i processi dotnet che possono essere monitorati da dotnet-counters.
dotnet-counters La versione 6.0.320703 e successive visualizza 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, è dotnet-counterspossibile 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 crea
dotnet-countersun socket di diagnostica denominatomyport.socke attende una connessione.dotnet-counters collect --diagnostic-port myport.sockOutput:
Waiting for connection on myport.sock Start an application with the following environment variable: DOTNET_DiagnosticPorts=/home/user/myport.sockIn una console separata, avvia l'applicazione di destinazione con la variabile di ambiente
DOTNET_DiagnosticPortsimpostata sul valore nell'outputdotnet-counters.export DOTNET_DiagnosticPorts=/home/user/myport.sock ./my-dotnet-app arg1 arg2In questo modo è possibile
dotnet-countersiniziare a raccogliere i 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 runpuò essere problematico perché l'interfaccia della riga di comando dotnet potrebbe generare molti processi figlio che non sono l'app e possono connettersi prima dell'appdotnet-counters, lasciando l'app sospesa in fase di esecuzione. È consigliabile usare direttamente una versione autonoma dell'app o usaredotnet execper avviare l'applicazione.