Untersuchen von Leistungsindikatoren (dotnet-counters)

Dieser Artikel gilt für: ✔️ dotnet-counters 3.0.47001 und höhere Versionen

Installieren

Es gibt zwei Möglichkeiten, dotnet-counters herunterzuladen und zu installieren:

  • Globales dotnet-Tool:

    Verwenden Sie zum Installieren der neuesten Releaseversion des NuGet-Paketsdotnet-counters den Befehl dotnet tool install:

    dotnet tool install --global dotnet-counters
    
  • Direkter Download:

    Laden Sie die ausführbare Datei für das Tool herunter, die Ihrer Plattform entspricht:

    OS Plattform
    Windows x86 | x64 | Arm | Arm-x64
    Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64

Hinweis

Sie benötigen eine entsprechende x86-Version des Tools, um dotnet-counters für eine x86-App verwenden zu können.

Übersicht

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

Beschreibung

dotnet-counters ist ein Leistungsüberwachungstool zur Ad-hoc-Überwachung der Integrität und zur Leistungsuntersuchung auf erster Ebene. Es kann Leistungsindikatorwerte überwachen, die über die API EventCounter oder Meter veröffentlicht werden. Beispielsweise können Sie schnell die CPU-Auslastung oder die Rate der ausgelösten Ausnahmen in Ihrer .NET Core-Anwendung überwachen, um nach verdächtigen Werten zu suchen, bevor Sie mit PerfView oder dotnet-trace eine umfassendere Leistungsuntersuchung durchführen.

Optionen

  • --version

    Zeigt die Version des Hilfsprogramms dotnet-counters an.

  • -h|--help

    Zeigt die Hilfe für die Befehlszeile an.

Befehle

Befehl
dotnet-counters collect
dotnet-counters list
dotnet-counters monitor
dotnet-counters ps

dotnet-counters collect

Mit diesem Befehl werden regelmäßig counter-Werte gesammelt und zur Nachbearbeitung in das festgelegte Dateiformat exportiert.

Übersicht

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

Optionen

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

    Die ID des Prozesses, dessen Leistungsindikatordaten erfasst werden sollen.

  • -n|--name <name>

    Der Name des Prozesses, dessen Leistungsindikatordaten erfasst werden sollen.

  • --diagnostic-port

    Hierbei handelt es sich um den Namen des zu erstellenden Diagnoseports. Informationen zur Verwendung dieser Option, um die Überwachung von Leistungsindikatoren beim Start der App zu starten, finden Sie unter Verwenden von Diagnoseports.

  • --refresh-interval <SECONDS>

    Die Anzahl von Sekunden, die zwischen Aktualisierungen der angezeigten Indikatoren verstreichen soll.

  • --counters <COUNTERS>

    Eine durch Leerzeichen getrennte Liste von Indikatoren. Zähler können in der Form provider_name[:counter_name] angegeben werden. Wenn provider_name ohne eine qualifizierende Liste von Indikatoren verwendet wird, werden alle Indikatoren des Anbieters angezeigt. Verwenden Sie zum Ermitteln von Anbieter- und Indikatornamen den Befehl dotnet-counters list. Für EventCounters ist provider_name der Name von EventSource, und für Meters ist provider_name der Name der Verbrauchseinheit.

  • --format <csv|json>

    Das zu exportierende Format Derzeit sind die folgenden Formate verfügbar: CSV und JSON.

  • -o|--output <output>

    Der Name der Ausgabedatei.

  • -- <command> (nur für Zielanwendungen, die mit .NET 5 oder höher ausgeführt werden)

    Nach den Sammlungskonfigurationsparametern kann der Benutzer -- gefolgt von einem Befehl anfügen, um eine .NET-Anwendung mit mindestens Common Language Runtime 5.0 zu starten. dotnet-counters startet einen Prozess mit dem angegebenen Befehl und erfasst die angeforderten Metriken. Dies ist bei der Sammlung der Metriken für den Startpfad einer Anwendung oft nützlich und kann verwendet werden, um Probleme kurz vor oder nach dem Haupteinstiegspunkt zu diagnostizieren oder zu überwachen.

    Hinweis

    Mit dieser Option wird der erste .NET 5-Prozess überwacht, der an das Tool zurückmeldet. Das bedeutet: Wenn Ihr Befehl mehrere .NET-Anwendungen startet, wird nur die erste Anwendung erfasst. Sie sollten daher diese Option für eigenständige Anwendungen oder die Option dotnet exec <app.dll> verwenden.

    Hinweis

    Wenn eine ausführbare .NET-Datei über „dotnet-counters“ gestartet wird, werden die Eingaben/Ausgaben umgeleitet, und Sie können nicht mehr mit „stdin/stdout“ interagieren. Wenn Sie das Tool über STRG+C oder SIGTERM beenden, werden sowohl das Tool als auch der untergeordnete Prozess sicher beendet. Wenn der untergeordnete Prozess vor dem Tool beendet wird, wird das Tool ebenfalls beendet, und die Ablaufverfolgung sollte sicher angezeigt werden können. Wenn Sie „stdin/stdout“ verwenden müssen, können Sie die Option --diagnostic-port verwenden. Weitere Informationen finden Sie unter Verwenden von Diagnoseports.

Hinweis

Unter Linux und macOS erwartet dieser Befehl, dass die Zielanwendung und dotnet-counters die gleiche TMPDIR-Umgebungsvariable verwenden. Andernfalls führt der Befehl zu einem Timeout.

Hinweis

Wenn Sie mit dotnet-counters Metriken erfassen möchten, muss der Befehl vom Rootbenutzer oder dem Benutzer ausgeführt werden, der den Zielprozess ausführt. Andernfalls kann das Tool keine Verbindung mit dem Zielprozess herstellen.

Beispiele

  • Im folgenden Beispiel werden alle counter-Werte mit einem Aktualisierungsintervall von 3 Sekunden erfasst und eine CSV-Ausgabedatei wird erstellt:

    > 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.
    
  • Starten Sie dotnet mvc.dll als untergeordneten Prozess, und beginnen Sie von Anfang an mit der Erfassung von Runtimeindikatoren und ASP.NET Core-Hostingindikatoren. Speichern Sie sie als JSON-Ausgabe:

    > 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

Zeigt eine Liste von Zählernamen und -beschreibungen gruppiert nach Anbieter an.

Übersicht

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

Beispiel

> 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

Hinweis

Die Microsoft.AspNetCore.Hosting-Leistungsindikatoren werden angezeigt, wenn bestimmte Prozesse identifiziert werden, die diese Leistungsindikatoren unterstützen, etwa wenn eine ASP.NET Core-Anwendung auf dem Hostcomputer ausgeführt wird.

dotnet-counters monitor

Zeigt regelmäßig aktualisierte Werte ausgewählter Zähler an.

Übersicht

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

Optionen

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

    Die ID des zu überwachenden Prozesses.

  • -n|--name <name>

    Dies ist der Name des Prozesses, der überwacht werden soll.

  • --diagnostic-port

    Hierbei handelt es sich um den Namen des zu erstellenden Diagnoseports. Informationen zur Verwendung dieser Option, um die Überwachung von Leistungsindikatoren beim Start der App zu starten, finden Sie unter Verwenden von Diagnoseports.

  • --refresh-interval <SECONDS>

    Die Anzahl von Sekunden, die zwischen Aktualisierungen der angezeigten Indikatoren verstreichen soll.

  • --counters <COUNTERS>

    Eine durch Leerzeichen getrennte Liste von Indikatoren. Zähler können in der Form provider_name[:counter_name] angegeben werden. Wenn provider_name ohne eine qualifizierende Liste von Indikatoren verwendet wird, werden alle Indikatoren des Anbieters angezeigt. Verwenden Sie zum Ermitteln von Anbieter- und Indikatornamen den Befehl dotnet-counters list. Für EventCounters ist provider_name der Name von EventSource, und für Meters ist provider_name der Name der Verbrauchseinheit.

-- <command> (nur für Zielanwendungen, die mit .NET 5 oder höher ausgeführt werden)

Nach den Sammlungskonfigurationsparametern kann der Benutzer -- gefolgt von einem Befehl anfügen, um eine .NET-Anwendung mit mindestens Common Language Runtime 5.0 zu starten. dotnet-counters startet einen Prozess mit dem bereitgestellten Befehl und überwacht die angeforderten Metriken. Dies ist bei der Sammlung der Metriken für den Startpfad einer Anwendung oft nützlich und kann verwendet werden, um Probleme kurz vor oder nach dem Haupteinstiegspunkt zu diagnostizieren oder zu überwachen.

Hinweis

Mit dieser Option wird der erste .NET 5-Prozess überwacht, der an das Tool zurückmeldet. Das bedeutet: Wenn Ihr Befehl mehrere .NET-Anwendungen startet, wird nur die erste Anwendung erfasst. Sie sollten daher diese Option für eigenständige Anwendungen oder die Option dotnet exec <app.dll> verwenden.

Hinweis

Wenn eine ausführbare .NET-Datei über „dotnet-counters“ gestartet wird, werden die Eingaben/Ausgaben umgeleitet, und Sie können nicht mehr mit „stdin/stdout“ interagieren. Wenn Sie das Tool über STRG+C oder SIGTERM beenden, werden sowohl das Tool als auch der untergeordnete Prozess sicher beendet. Wenn der untergeordnete Prozess vor dem Tool beendet wird, wird das Tool ebenfalls beendet. Wenn Sie „stdin/stdout“ verwenden müssen, können Sie die Option --diagnostic-port verwenden. Weitere Informationen finden Sie unter Verwenden von Diagnoseports.

Hinweis

Unter Linux und macOS erwartet dieser Befehl, dass die Zielanwendung und dotnet-counters die gleiche TMPDIR-Umgebungsvariable verwenden.

Hinweis

Wenn Sie mit dotnet-counters Metriken überwachen möchten, muss der Befehl vom Rootbenutzer oder dem Benutzer ausgeführt werden, der den Zielprozess ausführt.

Hinweis

Wenn eine Fehlermeldung wie die folgende angezeigt wird: [ERROR] System.ComponentModel.Win32Exception (299): A 32 bit processes cannot access modules of a 64 bit process., versuchen Sie dotnet-counters mit nicht übereinstimmender Bitanzahl für den Zielprozess zu verwenden. Stellen Sie sicher, dass Sie die richtige Bitanzahl des Tools im Link für die Installation herunterladen.

Beispiele

  • Überwachen aller Zähler von System.Runtime in einem Aktualisierungsintervall von 3 Sekunden:

    > 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
    
  • Überwachen nur der CPU-Auslastung und der GC-Heapgröße von 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
    
  • Überwachen von EventCounter-Werten von benutzerdefinierten EventSource. Weitere Informationen finden Sie unter Tutorial: Messen der Leistung mithilfe von 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
    
  • Anzeigen aller bekannten Zähler, die in dotnet-counters verfügbar sind:

    > 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
    
  • Anzeigen aller bekannten Zähler, die in dotnet-counters für .NET 5-Apps verfügbar sind:

    > 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
    
  • Starten Sie my-aspnet-server.exe, und überwachen Sie die Anzahl der geladenen Assemblys ab dem Start (nur .NET 5 oder höher):

    Wichtig

    Das funktioniert nur bei Anwendungen mit .NET 5 oder höher.

    > 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
    
  • Starten Sie my-aspnet-server.exe mit arg1 und arg2 als Befehlszeilenargumente, und überwachen Sie den Arbeitssatz und die GC-Heapgröße ab dem Start (nur .NET 5 oder höher):

    Wichtig

    Das funktioniert nur bei Anwendungen mit .NET 5 oder höher.

    > 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

Listet die dotnet-Prozesse auf, die von dotnet-counters überwacht werden können. Ab dotnet-counters-Version 6.0.320703 werden auch die Befehlszeilenargumente angezeigt, mit denen jeder Prozess gestartet wurde, sofern verfügbar.

Übersicht

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

Beispiel

Angenommen, Sie starten eine zeitintensive App mit dem Befehl dotnet run --configuration Release. In einem anderen Fenster führen Sie den Befehl dotnet-counters ps aus. Die Ausgabe sieht wie folgt aus. Sofern vorhanden, werden die Befehlszeilenargumente ab dotnet-counters-Version 6.0.320703 angezeigt.

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

Verwenden des Diagnoseports

Wichtig

Das funktioniert nur bei Anwendungen mit .NET 5 oder höher.

Der Diagnoseport ist ein neues .NET 5 hinzugefügtes Runtimefeature, das Ihnen ermöglicht, die Überwachung oder Erfassung von Leistungsindikatoren beim Start der App zu starten. Dies können Sie mit dotnet-counters einrichten, indem Sie dotnet-counters <collect|monitor> -- <command> wie in den Beispielen oben oder die Option --diagnostic-port verwenden.

Die Verwendung von dotnet-counters <collect|monitor> -- <command> zum Starten der Anwendung als untergeordneter Prozess ist die einfachste Möglichkeit, schnell mit der Überwachung ab dem Start zu beginnen.

Wenn Sie allerdings präzisere Kontrolle über die Lebensdauer der überwachten App wünschen (z. B., damit die App nur in den ersten 10 Minuten überwacht und dann weiterhin ausgeführt wird) oder mithilfe der CLI mit der App interagieren müssen, können Sie die Option --diagnostic-port verwenden, um sowohl die überwachte Ziel-App als auch dotnet-counters zu steuern.

  1. Der folgende Befehl sorgt dafür, dass „dotnet-counters“ einen Diagnosesocket namens myport.sock erstellt und auf eine Verbindung wartet.

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

    Ausgabe:

    Waiting for connection on myport.sock
    Start an application with the following environment variable: DOTNET_DiagnosticPorts=/home/user/myport.sock
    
  2. Starten Sie die Zielanwendung in einer separaten Konsole mit der Umgebungsvariable DOTNET_DiagnosticPorts, die Sie auf den Wert in der dotnet-counters-Ausgabe festlegen.

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

    Dadurch sollte dotnet-counters damit beginnen, Leistungsindikatoren von my-dotnet-app zu erfassen:

    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.
    

    Wichtig

    Das Starten Ihrer App mit dotnet run kann sich als problematisch erweisen, da die .NET-CLI viele untergeordnete Prozesse erzeugen kann, bei denen es sich nicht um Ihre App handelt. Diese können vor Ihrer App eine Verbindung mit dotnet-counters herstellen, wodurch Ihre App zur Laufzeit angehalten wird. Es wird empfohlen, dass Sie direkt eine eigenständige Version der App oder dotnet exec verwenden, um die Anwendung zu starten.