Freigeben über


Untersuchen von Leistungsindikatoren (dotnet-counters)

Dieser Artikel bezieht sich auf: ✔️ dotnet-counters Version 3.0.47001 und höhere Versionen.

Leistungsindikatoren können aus Anwendungen mit .NET 5 oder höher gelesen werden.

Installieren

Es gibt drei Möglichkeiten zum Herunterladen und Verwenden dotnet-counters:

  • Einschussausführung (empfohlen):

    Ab .NET 10.0.100 können Sie ohne dauerhafte Installation ausführen dotnet-countersdnx:

    dnx dotnet-counters [options]
    

    Beispiel:

    dnx dotnet-counters monitor --process-id 1234
    

    Dieser Ansatz lädt automatisch die neueste Version herunter und führt sie aus, ohne ihr System dauerhaft zu ändern.

  • Globales dotnet-Tool:

    Um die neueste Version des dotnet-counters für die häufige Verwendung zu installieren, verwenden Sie den Befehl zum Installieren des dotnet-Tools:

    dotnet tool install --global dotnet-counters
    

    Dieser Befehl installiert eine dotnet-counters Binärdatei in Ihrem .NET SDK Tools-Pfad, den Sie Ihrem PATH hinzufügen können, um global installierte Tools auf einfache Weise aufzurufen.

  • 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 dotnet-counters Hilfsprogramms an.

  • -h|--help

    Zeigt die Hilfe für die Befehlszeile an.

Befehle

Befehl
dotnet-counters collect
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.

    Hinweis

    Unter Linux und macOS erfordert die Verwendung dieser Option die Zielanwendung und dotnet-counters die gleiche TMPDIR Umgebungsvariable. Andernfalls führt der Befehl zu einem Timeout.

  • -n|--name <name>

    Der Name des Prozesses, dessen Leistungsindikatordaten erfasst werden sollen.

    Hinweis

    Unter Linux und macOS erfordert die Verwendung dieser Option die Zielanwendung und dotnet-counters die gleiche TMPDIR Umgebungsvariable. Andernfalls führt der Befehl zu einem Timeout.

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

    Legt den Diagnoseport fest, der für die Kommunikation mit dem zu überwachenden Prozess verwendet wird. dotnet-counters und die .NET-Laufzeit innerhalb des Zielprozesses muss sich auf die Portadresse einigen, wobei eine Überwachung und die andere Verbindung erfolgt. dotnet-counters Bestimmt automatisch den richtigen Port beim Anfügen mit den --process-id Optionen oder --name beim Starten eines Prozesses mithilfe der -- <command> Option. Es ist in der Regel nur erforderlich, den Port explizit anzugeben, wenn auf einen Prozess gewartet wird, der in Zukunft gestartet wird, oder eine Kommunikation mit einem Prozess, der in einem Container ausgeführt wird, der nicht Teil des aktuellen Prozessnamespaces ist.

    Die port-address Unterschiede unterscheiden sich vom Betriebssystem:

    • Linux und macOS - ein Pfad zu einem Unix-Domänensocket wie /foo/tool1.socket.
    • Windows – ein Pfad zu einer benannten Pipe, z \\.\pipe\my_diag_port1. B. .
    • Android, iOS und tvOS – ein IP:Port wie 127.0.0.1:9000.

    Lauscht standardmäßig dotnet-counters an der angegebenen Adresse. Sie können dotnet-counters stattdessen eine Verbindung anfordern, indem Sie nach der Adresse anhängen ,connect . Stellt beispielsweise eine Verbindung mit einem .NET-Laufzeitprozess her, --diagnostic-port /foo/tool1.socket,connect der auf den /foo/tool1.socket Unix-Domänensocket lauscht.

    Informationen zur Verwendung dieser Option zum Starten von Überwachungsindikatoren vom App-Start finden Sie unter Verwendung des 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. Informationen zum Ermitteln von Anbieter- und Leistungsindikatorennamen finden Sie unter integrierten Metriken. Für EventCountersprovider_name ist der Name der EventSource und für Meterprovider_name der Name des Zählers.

  • --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>

    Nach den Konfigurationsparametern der Sammlung kann der Benutzer gefolgt von einem Befehl zum Starten einer .NET-Anwendung anhängen -- . dotnet-counters Startet einen Prozess mit dem bereitgestellten Befehl und sammelt die angeforderten Metriken. Dies ist häufig hilfreich, um Metriken für den Startpfad der Anwendung zu sammeln und kann verwendet werden, um Probleme zu diagnostizieren oder zu überwachen, die früh vor oder kurz nach dem Haupteinstiegspunkt auftreten.

    Hinweis

    Wenn Sie diese Option verwenden, wird der erste .NET-Prozess überwacht, der mit dem Tool kommuniziert. Wenn Der Befehl mehrere .NET-Anwendungen startet, erfasst er nur die erste App. Daher wird empfohlen, diese Option für eigenständige Anwendungen oder die Verwendung der dotnet exec <app.dll> Option zu verwenden.

    Hinweis

    Wenn Sie eine .NET-ausführbare Datei über dotnet-countersstarten, wird die Eingabe/Ausgabe umgeleitet, und Sie können nicht mit seinem Stdin/Stdout interagieren. Sie können das Tool über STRG+C oder SIGTERM beenden, um sowohl das Tool als auch den untergeordneten Prozess sicher zu beenden. 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 des Diagnoseports.

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 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. Informationen zum Ermitteln von Anbieter- und Leistungsindikatorennamen finden Sie unter integrierten Metriken. Für EventCountersprovider_name ist der Name der EventSource und für Meterprovider_name der Name des Zählers.

  • -- <command>

    Nach den Konfigurationsparametern der Sammlung können Sie einen Befehl anfügen -- , um eine .NET-Anwendung zu starten. dotnet-counters startet einen Prozess mit dem bereitgestellten Befehl und überwacht die angeforderten Metriken. Dies ist häufig hilfreich, um Metriken für den Startpfad der Anwendung zu sammeln und kann verwendet werden, um Probleme zu diagnostizieren oder zu überwachen, die früh vor oder kurz nach dem Haupteinstiegspunkt auftreten.

    Hinweis

    Wenn Sie diese Option verwenden, wird der erste .NET-Prozess überwacht, der mit dem Tool kommuniziert. Wenn Der Befehl mehrere .NET-Anwendungen startet, erfasst er nur die erste App. Daher wird empfohlen, diese Option für eigenständige Anwendungen oder die Verwendung der dotnet exec <app.dll> Option zu verwenden.

    Hinweis

    Das Starten einer ausführbaren .NET-Datei dotnet-counters über leitet die Eingabe/Ausgabe um, und Sie können nicht mit seinem Stdin/Stdout interagieren. Sie können das Tool über STRG+C oder SIGTERM beenden, um sowohl das Tool als auch den untergeordneten Prozess sicher zu beenden. 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 des 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 ähnlich wie die folgende angezeigt wird: [ERROR] System.ComponentModel.Win32Exception (299): A 32 bit processes cannot access modules of a 64 bit process., versuchen Sie, dies mit nicht übereinstimmender Bitanzahl für den Zielprozess zu verwenden dotnet-counters . 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
    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
    

    Hinweis

    Wenn die App .NET Version 8 oder niedriger verwendet, ist der System.Runtime-Meter in diesen Versionen nicht vorhanden und dotnet-counters greift auf die Anzeige der älteren System.Runtime EventCounters zurück. Die Benutzeroberfläche sieht etwas anders aus, wie hier gezeigt.

    [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 Sie nur Garbage Collections und Garbage Collection Heap-Zuordnung von 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
    
    
  • Ü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
    
  • Starten und überwachen Sie my-aspnet-server.exe die Anzahl der Assemblys, die vom Start geladen wurden:

    > 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
    
  • Starten Sie my-aspnet-server.exe mit arg1 und arg2 als Befehlszeilenargumente, und überwachen Sie ihre Arbeitssatz- und GC-Heapgröße vom Start:

    > 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

Listet die dotnet-Prozesse auf, die von dotnet-counters überwacht werden können. dotnet-counters Version 6.0.320703 und höher zeigt auch die Befehlszeilenargumente an, 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 angezeigte Ausgabe lautet wie folgt. 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

Der Diagnoseport ist ein Laufzeitfeature, mit dem Sie die Überwachung starten oder Leistungsindikatoren vom App-Start sammeln können. dotnet-countersDazu können Sie entweder wie in den vorherigen Beispielen beschrieben oder dotnet-counters <collect|monitor> -- <command> die --diagnostic-port Option 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 erstellt dotnet-counters einen Diagnosesocket namens myport.sock und wartet auf eine Verbindung.

    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
    

    Auf diese Weise können dotnet-counters Sie mit dem Sammeln von Leistungsindikatoren beginnen auf 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.
    

    Wichtig

    Das Starten Ihrer App mit dotnet run kann problematisch sein, da die dotnet CLI möglicherweise viele untergeordnete Prozesse, die nicht Ihre App sind, und sie können vor der App eine Verbindung herstellen dotnet-counters , sodass Ihre App zur Laufzeit angehalten wird. Es wird empfohlen, eine eigenständige Version der App direkt zu verwenden oder dotnet exec die Anwendung zu starten.