Condividi tramite


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 tre modi per scaricare e usare dotnet-counters:

  • Esecuzione one-shot (scelta consigliata):

    A partire da .NET 10.0.100, è possibile eseguire dotnet-counters senza installazione permanente usando dnx:

    dnx dotnet-counters [options]
    

    Per esempio:

    dnx dotnet-counters monitor --process-id 1234
    

    Questo 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-counters
    

    Questo comando installa un dotnet-counters file 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

  • --version

    Visualizza la versione dell'utilità dotnet-counters .

  • -h|--help

    Mostra 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-counters condividere la stessa TMPDIR variabile 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-counters condividere la stessa TMPDIR variabile 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-counters e il runtime .NET all'interno del processo di destinazione devono concordare l'indirizzo della porta, con uno in ascolto e l'altro connessione. dotnet-counters determina automaticamente la porta corretta durante il collegamento utilizzando le --process-id opzioni o --name o 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-counters rimane in ascolto dell'indirizzo specificato. È possibile richiedere dotnet-counters invece di connettersi aggiungendo ,connect dopo l'indirizzo. Ad esempio, --diagnostic-port /foo/tool1.socket,connect si connetterà a un processo di runtime .NET in ascolto del socket di /foo/tool1.socket dominio Unix.

    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, 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-counters avvia 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.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
    

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-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, 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-counters avvierà 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-counters reindirizzerà 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.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
    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})                                     124
    

    Nota

    Se l'app usa .NET versione 8 o precedente, System.Runtime Meter non esiste in tali versioni e dotnet-counters eseguirà 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)                                              19
    
  • Monitorare 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,384
    
    
  • 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
    
  • Avviare my-aspnet-server.exe e 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})      11
    
  • 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[dotnet.process.memory.working_set,dotnet.gc.last_collection.heap.size] -- my-aspnet-server.exe arg1 arg2
    
    Name                                             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.

  1. Il comando seguente crea dotnet-counters un socket di diagnostica denominato myport.sock e attende 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
    

    In questo modo è possibile dotnet-counters iniziare a raccogliere i 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 potrebbe generare molti processi figlio che non sono l'app e possono connettersi prima dell'app dotnet-counters , lasciando l'app sospesa in fase di esecuzione. È consigliabile usare direttamente una versione autonoma dell'app o usare dotnet exec per avviare l'applicazione.