Sdílet prostřednictvím


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

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

Čítače je možné číst z aplikací, na kterých běží .NET 5 nebo novější.

Instalace

Existují tři způsoby, jak stáhnout a použít dotnet-counters:

  • Jednostřelové provedení (doporučeno):

    Počínaje rozhraním .NET 10.0.100 můžete spustit dotnet-counters bez trvalé instalace pomocí dnx:

    dnx dotnet-counters [options]
    

    Například:

    dnx dotnet-counters monitor --process-id 1234
    

    Tento přístup automaticky stáhne a spustí nejnovější verzi bez trvalé změny systému.

  • dotnet global tool (globální nástroj dotnet):

    Pokud chcete nainstalovat nejnovější verzi dotnet-countersbalíčku NuGet pro časté použití, použijte příkaz dotnet tool install :

    dotnet tool install --global dotnet-counters
    

    Tento příkaz nainstaluje dotnet-counters binární soubor do cesty nástroje sady .NET SDK, kterou můžete přidat do cesty PATH a snadno vyvolat globálně nainstalované nástroje.

  • Přímé stahování:

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

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

Poznámka:

Pokud chcete použít dotnet-counters v aplikaci x86, potřebujete odpovídající verzi nástroje x86.

Synopse

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

Popis

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

Možnosti

  • --version

    Zobrazí verzi dotnet-counters nástroje.

  • -h|--help

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

Příkazy

Příkaz
dotnet-counters collect
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 pro shromažďování dat čítačů.

    Poznámka:

    V Linuxu a macOS vyžaduje použití této možnosti cílovou aplikaci a dotnet-counters sdílení stejné TMPDIR proměnné prostředí. Jinak vyprší časový limit příkazu.

  • -n|--name <name>

    Název procesu pro shromažďování dat čítačů.

    Poznámka:

    V Linuxu a macOS vyžaduje použití této možnosti cílovou aplikaci a dotnet-counters sdílení stejné TMPDIR proměnné prostředí. Jinak vyprší časový limit příkazu.

  • --diagnostic-port <port-address[,(listen|connect)]>

    Nastaví diagnostický port používaný ke komunikaci s procesem, který se má monitorovat. dotnet-counters a modul runtime .NET v rámci cílového procesu musí souhlasit s adresou portu a jedním nasloucháním a druhým připojením. dotnet-counters automaticky určuje správný port při připojování pomocí --process-id možností nebo --name při spuštění procesu pomocí této -- <command> možnosti. Obvykle je nutné zadat port explicitně při čekání na proces, který se spustí v budoucnu, nebo komunikovat s procesem spuštěným v kontejneru, který není součástí oboru názvů aktuálního procesu.

    Liší se port-address podle operačního systému:

    • Linux a macOS – cesta k soketu domény Unixu, například /foo/tool1.socket.
    • Windows – cesta k pojmenované svislé sadě, například \\.\pipe\my_diag_port1.
    • Android, iOS a tvOS – IP:port, například 127.0.0.1:9000.

    Ve výchozím nastavení dotnet-counters naslouchá na zadané adrese. Místo toho můžete požádat o dotnet-counters připojení připojením ,connect za adresou. Připojí se například --diagnostic-port /foo/tool1.socket,connect k procesu modulu runtime .NET, který naslouchá soketu domény unixu /foo/tool1.socket .

    Informace o tom, jak tuto možnost použít ke spuštění čítačů monitorování při 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>

    Čárkami oddělený seznam čítačů. Lze zadat provider_name[:counter_name]čítače . provider_name Pokud se použije bez opravňujícího seznamu čítačů, zobrazí se všechny čítače od poskytovatele. Pokud chcete zjistit názvy zprostředkovatelů a čítačů, podívejte se na předdefinované metriky. Pro EventCountersprovider_name je název EventSource a pro měřiče, provider_name je název měřiče.

  • --format <csv|json>

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

  • -o|--output <output>

    Název výstupního souboru

  • -- <command>

    Po parametrech konfigurace kolekce může uživatel připojit -- následovaný příkazem pro spuštění aplikace .NET. dotnet-counters spustí proces pomocí poskytnuté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 lze je použít k diagnostice nebo monitorování problémů, ke kterým dochází dříve nebo krátce po hlavním vstupním bodu.

    Poznámka:

    Tato možnost monitoruje první proces .NET, který komunikuje zpět s nástrojem, což znamená, že pokud váš příkaz spustí více aplikací .NET, bude shromažďovat pouze první aplikaci. Proto se doporučuje tuto možnost použít u samostatných aplikací nebo použití této dotnet exec <app.dll> možnosti.

    Poznámka:

    Pokud spustíte spustitelný soubor .NET prostřednictvím dotnet-counters, jeho vstup/výstup se přesměruje a nebudete moct pracovat s jeho stdin/stdout. Nástroj můžete ukončit pomocí Ctrl+C nebo SIGTERM a bezpečně ukončit nástroj i podřízený proces. Pokud se podřízený proces ukončí před nástrojem, nástroj se ukončí také. Pokud potřebujete použít stdin/stdout, můžete použít tuto --diagnostic-port možnost. Další informace najdete v tématu Použití diagnostického portu.

Poznámka:

Aby bylo možné shromažďovat metriky pomocí dotnet-counters, musí být spuštěn jako stejný uživatel jako uživatel, který spouští cílový proces nebo jako kořen. Jinak se nástroj nepodaří navázat spojení s cílovým procesem.

Příklady

  • Shromážděte všechny čítače v intervalu aktualizace 3 sekundy a vygenerujte jako výstup sdílený svazek clusteru:

    > 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.
    
  • Začněte dotnet mvc.dll jako podřízený proces a začněte shromažďovat čítače modulu runtime a ASP.NET čítače hostování jádra 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 monitor

Zobrazuje pravidelně obnovující 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 diagnostického portu, který se má vytvořit. Informace o použití této možnosti ke spuštění čítačů monitorování od spuštění aplikace najdete na diagnostickém portu .

  • --refresh-interval <SECONDS>

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

  • --counters <COUNTERS>

    Čárkami oddělený seznam čítačů. Lze zadat provider_name[:counter_name]čítače . provider_name Pokud se použije bez opravňujícího seznamu čítačů, zobrazí se všechny čítače od poskytovatele. Pokud chcete zjistit názvy zprostředkovatelů a čítačů, podívejte se na předdefinované metriky. Pro EventCountersprovider_name je název EventSource a pro měřiče, provider_name je název měřiče.

  • -- <command>

    Po parametrech konfigurace kolekce můžete připojit a potom příkaz -- pro spuštění aplikace .NET. dotnet-counters spustí proces pomocí poskytnutého příkazu a bude monitorovat požadované metriky. To je často užitečné ke shromažďování metrik pro spouštěcí cestu aplikace a lze je použít k diagnostice nebo monitorování problémů, ke kterým dochází dříve nebo krátce po hlavním vstupním bodu.

    Poznámka:

    Tato možnost monitoruje první proces .NET, který komunikuje zpět s nástrojem, což znamená, že pokud váš příkaz spustí více aplikací .NET, bude shromažďovat pouze první aplikaci. Proto se doporučuje tuto možnost použít u samostatných aplikací nebo použití této dotnet exec <app.dll> možnosti.

    Poznámka:

    Spuštění spustitelného souboru .NET přesměruje dotnet-counters jeho vstup/výstup a nebudete moct pracovat s jeho stdin/stdout. Nástroj můžete ukončit pomocí Ctrl+C nebo SIGTERM a bezpečně ukončit nástroj i podřízený proces. Pokud se podřízený proces ukončí před nástrojem, nástroj se ukončí také. Pokud potřebujete použít stdin/stdout, můžete použít tuto --diagnostic-port možnost. 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 proměnnou TMPDIR prostředí.

Poznámka:

Pokud chcete monitorovat metriky pomocí dotnet-counters, 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 neshodu bitů s cílovým procesem. Nezapomeňte stáhnout správnou bitovou verzi nástroje na instalačním odkazu.

Příklady

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

    > 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
    

    Poznámka:

    Pokud aplikace používá .NET verze 8 nebo nižší, měřič System.Runtime v těchto verzích neexistuje a dotnet-counters vrátí se k zobrazení starších objektů EventCounters system.Runtime . Uživatelské rozhraní vypadá trochu jinak, jak je znázorněno tady.

    [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
    
  • Monitorujte pouze uvolňování paměti a přidělení haldy uvolňování paměti z 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
    
    
  • Monitorování EventCounter hodnot z uživatelem definovaného EventSource. Další informace naleznete 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
    
  • Spusťte a sledujte my-aspnet-server.exe počet sestavení načtených z jeho spuštění:

    > 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
    
  • Spusťte my-aspnet-server.exe příkazový řádek a arg1arg2 jako argumenty příkazového řádku a sledujte jeho pracovní sadu a velikost haldy GC od spuštění:

    > 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

Zobrazí seznam procesů dotnet, které lze monitorovat dotnet-counterspomocí . dotnet-counters Verze 6.0.320703 a novější také zobrazí argumenty příkazového řádku, se kterými byly jednotlivé procesy spuštěny, pokud jsou 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ě spustíte dotnet-counters ps příkaz. Výstup, který vidíte, je následující. Argumenty příkazového řádku( pokud existují) 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

Diagnostický port je funkce modulu runtime, která umožňuje spustit monitorování nebo shromažďování čítačů od spuštění aplikace. K tomu dotnet-countersmůžete použít buď použití dotnet-counters <collect|monitor> -- <command> , jak je popsáno v předchozích příkladech, 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 spuštění.

Pokud ale chcete získat přehlednější kontrolu nad životností monitorované aplikace (například monitorujte aplikaci pouze po dobu prvních 10 minut a pokračujte v provádění) nebo pokud potřebujete s aplikací pracovat pomocí rozhraní příkazového řádku, můžete pomocí --diagnostic-port možnosti řídit jak monitorovanou dotnet-counterscílovou aplikaci, tak i .

  1. Následující příkaz vytvoří dotnet-counters diagnostický soket s názvem myport.sock a počká 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 umožňuje dotnet-counters začít shromažďovat čítače pro 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 dotnet run 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 připojit dotnet-counters před vaší aplikací a nechat aplikaci pozastavenou za běhu. Doporučujeme přímo použít samostatnou verzi aplikace nebo ji spustit dotnet exec .