Zkoumání čítačů výkonu (dotnet-counters)

Tento článek se vztahuje na: ✔️ dotnet-counters verze 3.0.47001 a novější verze

Instalace

Existují dva způsoby stažení a instalace dotnet-counters:

  • globální nástroj dotnet:

    Pokud chcete nainstalovat nejnovější vydanou dotnet-counters verzi balíčku NuGet, použijte příkaz dotnet install:

    dotnet tool install --global dotnet-counters
    
  • Přímé stažení:

    Stáhněte spustitelný soubor nástroje, který odpovídá vaší platformě:

    Operační systém Platforma
    Windows x86 | x64 | Rameno | ARM-x64
    Linux x64 | Rameno | Arm64 | musl-x64 | musl-Arm64

Poznámka

K použití dotnet-counters v aplikaci x86 potřebujete odpovídající verzi nástroje x86.

Synopse

dotnet-counters [-h|--help] [--version] <command>

Description

dotnet-counters je nástroj pro monitorování výkonu pro ad hoc monitorování stavu a šetření výkonu na první úrovni. Může sledovat hodnoty čítačů výkonu EventCounter publikované prostřednictvím rozhraní API nebo Meter rozhraní API. Můžete například rychle monitorovat věci, jako je využití procesoru nebo míra výjimek, které se v aplikaci .NET Core vyvolaly, abyste zjistili, jestli není něco podezřelého, než se ponoříte do vážnějšího šetření výkonu pomocí PerfView nebo dotnet-trace.

Možnosti

  • --version

    Zobrazí verzi nástroje dotnet-counters.

  • -h|--help

    Zobrazuje nápovědu k příkazovému řádku.

Příkazy

Příkaz
dotnet-counters collect
dotnet-counters list
dotnet-counters monitor
dotnet-counters ps

dotnet-counters collect

Pravidelně shromážděte vybrané hodnoty čítačů a exportujte je do zadaného formátu souboru pro následné zpracování.

Synopse

dotnet-counters collect [-h|--help] [-p|--process-id] [-n|--name] [--diagnostic-port] [--refresh-interval] [--counters <COUNTERS>] [--format] [-o|--output] [-- <command>]

Možnosti

  • -p|--process-id <PID>

    ID procesu, ze který se mají shromažďovat data čítačů.

  • -n|--name <name>

    Název procesu, ze který se mají shromažďovat data čítačů.

  • --diagnostic-port

    Název portu diagnostiky, který chcete vytvořit. Informace o použití této možnosti ke spuštění čítačů monitorování od spuštění aplikace najdete v tématu Použití diagnostického portu .

  • --refresh-interval <SECONDS>

    Počet sekund zpoždění mezi aktualizací zobrazených čítačů

  • --counters <COUNTERS>

    Seznam čítačů oddělený čárkami. Lze zadat provider_name[:counter_name]čítače . provider_name Pokud se používá bez opravňujícího seznamu čítačů, zobrazí se všechny čítače od poskytovatele. Pokud chcete zjistit názvy zprostředkovatelů a čítačů, použijte příkaz dotnet-counters list . Pro EventCountersprovider_name je název EventSource a pro Měřičeprovider_name je název měřiče.

  • --format <csv|json>

    Formát, který se má exportovat. Aktuálně dostupné: csv, json.

  • -o|--output <output>

    Název výstupního souboru

  • -- <command> (pouze pro cílové aplikace s .NET 5 nebo novějším)

    Po konfiguračních parametrech kolekce může uživatel připojit -- a následně příkaz pro spuštění aplikace .NET s alespoň modulem runtime 5.0. dotnet-counters spustí proces pomocí zadaného příkazu a shromáždí požadované metriky. To je často užitečné ke shromažďování metrik pro spouštěcí cestu aplikace a dá se použít k diagnostice nebo monitorování problémů, ke kterým dochází v rané fázi před nebo krátce po hlavním vstupním bodu.

    Poznámka

    Při použití této možnosti se monitoruje první proces .NET 5, který komunikuje zpět s nástrojem, což znamená, že pokud příkaz spustí více aplikací .NET, shromáždí pouze první aplikaci. Proto doporučujeme tuto možnost použít u samostatných aplikací nebo ji použít dotnet exec <app.dll> .

    Poznámka

    Spuštění spustitelného souboru .NET prostřednictvím dotnet-counters způsobí přesměrování vstupu a výstupu a nebudete moct pracovat s jeho stdin/stdout. Ukončení nástroje pomocí kombinace kláves CTRL+C nebo SIGTERM bezpečně ukončí jak nástroj, tak podřízený proces. Pokud se podřízený proces ukončí před nástrojem, nástroj se také ukončí a trasování by mělo být bezpečně zobrazitelné. Pokud potřebujete použít stdin/stdout, můžete použít možnost --diagnostic-port . Další informace najdete v tématu Použití diagnostického portu .

Poznámka

V Linuxu a macOS tento příkaz očekává cílovou aplikaci a dotnet-counters bude sdílet stejnou TMPDIR proměnnou prostředí. V opačném případě vyprší časový limit příkazu.

Poznámka

Pokud chcete shromažďovat metriky pomocí dotnet-countersnástroje , musí být spuštěná jako stejný uživatel jako uživatel, který spouští cílový proces, nebo jako root. V opačném případě se nástroji nepodaří navázat spojení s cílovým procesem.

Příklady

  • Shromážděte všechny čítače v intervalu aktualizace 3 sekund a jako výstup vygenerujte csv:

    > 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.
    
  • Spusťte dotnet mvc.dll jako podřízený proces a začněte shromažďovat čítače modulu runtime a ASP.NET Core čítače hostování od spuštění a uložte ho jako výstup 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

Zobrazí seznam názvů a popisů čítačů seskupených podle poskytovatele.

Synopse

dotnet-counters list [-h|--help]

Příklad

> 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

Poznámka

Microsoft.AspNetCore.Hosting Čítače se zobrazí, pokud jsou identifikovány procesy, které tyto čítače podporují, například když na hostitelském počítači běží ASP.NET Core aplikace.

dotnet-counters monitor

Zobrazí pravidelně aktualizované hodnoty vybraných čítačů.

Synopse

dotnet-counters monitor [-h|--help] [-p|--process-id] [-n|--name] [--diagnostic-port] [--refresh-interval] [--counters] [-- <command>]

Možnosti

  • -p|--process-id <PID>

    ID procesu, který se má monitorovat.

  • -n|--name <name>

    Název procesu, který se má monitorovat.

  • --diagnostic-port

    Název portu diagnostiky, který chcete vytvořit. Informace o použití této možnosti ke spuštění čítačů monitorování od spuštění aplikace najdete v tématu Použití diagnostického portu .

  • --refresh-interval <SECONDS>

    Počet sekund zpoždění mezi aktualizací zobrazených čítačů

  • --counters <COUNTERS>

    Seznam čítačů oddělený čárkami. Lze zadat provider_name[:counter_name]čítače . provider_name Pokud se používá bez opravňujícího seznamu čítačů, zobrazí se všechny čítače od poskytovatele. Pokud chcete zjistit názvy zprostředkovatelů a čítačů, použijte příkaz dotnet-counters list . Pro EventCountersprovider_name je název EventSource a pro Měřičeprovider_name je název měřiče.

-- <command> (pouze pro cílové aplikace s .NET 5 nebo novějším)

Po konfiguračních parametrech kolekce může uživatel připojit -- a následně příkaz pro spuštění aplikace .NET s alespoň modulem runtime 5.0. dotnet-counters spustí proces s poskytnutým příkazem a monitoruje požadované metriky. To je často užitečné ke shromažďování metrik pro spouštěcí cestu aplikace a dá se použít k diagnostice nebo monitorování problémů, ke kterým dochází v rané fázi před nebo krátce po hlavním vstupním bodu.

Poznámka

Při použití této možnosti se monitoruje první proces .NET 5, který komunikuje zpět s nástrojem, což znamená, že pokud příkaz spustí více aplikací .NET, shromáždí pouze první aplikaci. Proto doporučujeme tuto možnost použít u samostatných aplikací nebo ji použít dotnet exec <app.dll> .

Poznámka

Spuštění spustitelného souboru .NET prostřednictvím dotnet-counters způsobí přesměrování vstupu a výstupu a nebudete moct pracovat s jeho stdin/stdout. Ukončení nástroje pomocí kombinace kláves CTRL+C nebo SIGTERM bezpečně ukončí jak nástroj, tak podřízený proces. Pokud se podřízený proces ukončí před nástrojem, nástroj se také ukončí. Pokud potřebujete použít stdin/stdout, můžete použít možnost --diagnostic-port . Další informace najdete v tématu Použití diagnostického portu .

Poznámka

V Linuxu a macOS tento příkaz očekává cílovou aplikaci a dotnet-counters bude sdílet stejnou TMPDIR proměnnou prostředí.

Poznámka

Pokud chcete monitorovat metriky pomocí dotnet-countersnástroje , musí být spuštěná jako stejný uživatel jako uživatel, který spouští cílový proces, nebo jako root.

Poznámka

Pokud se zobrazí chybová zpráva podobná následující: [ERROR] System.ComponentModel.Win32Exception (299): A 32 bit processes cannot access modules of a 64 bit process., pokoušíte se použít dotnet-counters bitovou neshodu s cílovým procesem. Ujistěte se, že jste si na instalačním odkazu stáhli správnou bitovou verzi nástroje.

Příklady

  • Monitorujte všechny čítače z System.Runtime v intervalu aktualizace 3 sekund:

    > 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
    
  • Monitorování pouze využití procesoru a velikosti haldy GC z 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
    
  • Monitorování EventCounter hodnot z uživatelem definované EventSourcehodnoty Další informace najdete v tématu Kurz: Měření výkonu pomocí EventCounters v .NET Core.

    > dotnet-counters monitor --process-id 1902 --counters Samples-EventCounterDemos-Minimal
    
    Press p to pause, r to resume, q to quit.
        request                                      100
    
  • Zobrazit všechny dobře známé čítače, které jsou k dispozici v 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
    
  • Podívejte se na všechny dobře známé čítače, které jsou dostupné v dotnet-counters aplikacích .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
    
  • Spusťte my-aspnet-server.exe a monitorujte počet sestavení načtených po spuštění (pouze .NET 5 nebo novější):

    Důležité

    To funguje jenom pro aplikace s .NET 5 nebo novějším.

    > 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
    
  • Spusťte my-aspnet-server.exe s arg1 argumenty příkazového řádku a arg2 jako argumenty a monitorujte její pracovní sadu a velikost haldy GC od spuštění (pouze .NET 5 nebo novější):

    Důležité

    To funguje jenom pro aplikace s .NET 5 nebo novějším.

    > 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

Obsahuje seznam procesů dotnet, které lze monitorovat pomocí .dotnet-counters dotnet-counters verze 6.0.320703 a novější také zobrazují argumenty příkazového řádku, se kterými byl každý proces zahájen, pokud je k dispozici.

Synopse

dotnet-counters ps [-h|--help]

Příklad

Předpokládejme, že spustíte dlouhotrvající aplikaci pomocí příkazu dotnet run --configuration Release. V jiném okně spusťte dotnet-counters ps příkaz . Výstup, který uvidíte, je následující. Případné argumenty příkazového řádku se zobrazují ve dotnet-counters verzi 6.0.320703 a novější.

> dotnet-counters ps
  
  21932 dotnet     C:\Program Files\dotnet\dotnet.exe   run --configuration Release
  36656 dotnet     C:\Program Files\dotnet\dotnet.exe

Použití diagnostického portu

Důležité

To funguje jenom pro aplikace s .NET 5 nebo novějším.

Diagnostický port je funkce modulu runtime přidaná v .NET 5, která umožňuje spustit monitorování nebo shromažďování čítačů při spuštění aplikace. Chcete-li to provést pomocí dotnet-counters, můžete buď použít dotnet-counters <collect|monitor> -- <command> , jak je popsáno v příkladech výše, nebo použít --diagnostic-port možnost .

Použití dotnet-counters <collect|monitor> -- <command> ke spuštění aplikace jako podřízeného procesu je nejjednodušší způsob, jak ji rychle monitorovat od jejího spuštění.

Pokud ale chcete získat jemnější kontrolu nad životností monitorované aplikace (například monitorovat aplikaci pouze prvních 10 minut a pokračovat v provádění) nebo pokud potřebujete s aplikací pracovat pomocí rozhraní příkazového řádku, pomocí možnosti můžete řídit jak cílovou aplikaci, která se monitoruje, --diagnostic-port tak dotnet-counters.

  1. Následující příkaz vytvoří dotnet-counters diagnostický soket s názvem myport.sock a čeká na připojení.

    dotnet-counters collect --diagnostic-port myport.sock
    

    Výstup:

    Waiting for connection on myport.sock
    Start an application with the following environment variable: DOTNET_DiagnosticPorts=/home/user/myport.sock
    
  2. V samostatné konzole spusťte cílovou aplikaci s proměnnou DOTNET_DiagnosticPorts prostředí nastavenou na hodnotu ve výstupu dotnet-counters .

    export DOTNET_DiagnosticPorts=/home/user/myport.sock
    ./my-dotnet-app arg1 arg2
    

    To by pak mělo umožnit dotnet-counters začít shromažďovat čítače na 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.
    

    Důležité

    Spuštění aplikace pomocí dotnet run nástroje může být problematické, protože rozhraní příkazového řádku dotnet může vytvořit mnoho podřízených procesů, které nejsou vaší aplikací, a můžou se k dotnet-counters nim připojit před vaší aplikací, takže aplikace se za běhu pozastaví. Doporučujeme použít přímo samostatnou verzi aplikace nebo ji spustit dotnet exec .