Laufende .NET-Prozesse beobachten

Laufende .NET-Prozesse beobachten

- Matt

Ein Dienst verhält sich in Produktion seltsam, und ein Profiler ist keine Option.

dotnet tool install --global dotnet-counters
dotnet-counters ps
dotnet-counters monitor --process-id 1234 --counters System.Runtime

Das zeigt live Speicherverbrauch, Anzahl der Garbage Collections pro Generation, Ausnahmen pro Sekunde und die Auslastung des Thread-Pools. Ohne Neustart, ohne Codeänderung.

Besonders aufschlussreich ist ThreadPool Queue Length. Steht die dauerhaft über null, blockiert irgendwo synchroner Code einen Thread-Pool-Thread. Das ist fast immer ein .Result oder .Wait() an einer Stelle, an der jemand die Async-Kette abgeschnitten hat.