Fouten opsporen in hoog CPU-gebruik in .NET Core
Dit artikel is van toepassing op: ✔️ .NET Core 3.1 SDK en latere versies
In deze zelfstudie leert u hoe u fouten kunt opsporen in een overmatig CPU-gebruiksscenario. Met behulp van het opgegeven voorbeeld ASP.NET opslagplaats voor de broncode van de Core-web-app , kunt u opzettelijk een impasse veroorzaken. Het eindpunt reageert niet meer en ondervindt accumulatie van threads. U leert hoe u verschillende hulpprogramma's kunt gebruiken om dit scenario te diagnosticeren met verschillende belangrijke onderdelen van diagnostische gegevens.
In deze zelfstudie leert u het volgende:
- Hoog CPU-gebruik onderzoeken
- CPU-gebruik bepalen met dotnet-tellers
- Dotnet-trace gebruiken voor traceringsgeneratie
- Profielprestaties in PerfView
- Overmatig CPU-gebruik vaststellen en oplossen
Vereisten
In de zelfstudie wordt het volgende gebruikt:
- .NET Core 3.1 SDK of een latere versie.
- Voorbeeld van foutopsporingsdoel om het scenario te activeren.
- dotnet-trace om processen weer te geven en een profiel te genereren.
- dotnet-counters om het CPU-gebruik te bewaken.
CPU-meteritems
Voordat u diagnostische gegevens probeert te verzamelen, moet u een hoge CPU-voorwaarde observeren. Voer de voorbeeldtoepassing uit met behulp van de volgende opdracht uit de hoofdmap van het project.
dotnet run
Gebruik de volgende opdracht om de proces-id te vinden:
dotnet-trace ps
Noteer de proces-id uit de uitvoer van de opdracht. Onze proces-id was 22884
, maar die van jou zal anders zijn. Als u het huidige CPU-gebruik wilt controleren, gebruikt u de opdracht dotnet-counters tool:
dotnet-counters monitor --refresh-interval 1 -p 22884
Het refresh-interval
is het aantal seconden tussen de teller die CPU-waarden peilt. De uitvoer moet er ongeveer als volgt uitzien:
Press p to pause, r to resume, q to quit.
Status: Running
[System.Runtime]
% Time in GC since last GC (%) 0
Allocation Rate / 1 sec (B) 0
CPU Usage (%) 0
Exception Count / 1 sec 0
GC Heap Size (MB) 4
Gen 0 GC Count / 60 sec 0
Gen 0 Size (B) 0
Gen 1 GC Count / 60 sec 0
Gen 1 Size (B) 0
Gen 2 GC Count / 60 sec 0
Gen 2 Size (B) 0
LOH Size (B) 0
Monitor Lock Contention Count / 1 sec 0
Number of Active Timers 1
Number of Assemblies Loaded 140
ThreadPool Completed Work Item Count / 1 sec 3
ThreadPool Queue Length 0
ThreadPool Thread Count 7
Working Set (MB) 63
Wanneer de web-app wordt uitgevoerd, onmiddellijk na het opstarten, wordt de CPU helemaal niet verbruikt en wordt gerapporteerd op 0%
. Navigeer naar de api/diagscenario/highcpu
route met 60000
als de routeparameter:
https://localhost:5001/api/diagscenario/highcpu/60000
Voer nu de opdracht dotnet-counters opnieuw uit. Als u alleen de cpu-usage
teller wilt bewaken, voegt u '-counters System.Runtime[cpu-usage]' toe aan de vorige opdracht. We weten niet zeker of de CPU wordt verbruikt, dus we controleren dezelfde lijst met tellers als hierboven om te controleren of de prestatiemeteritems binnen het verwachte bereik voor onze toepassing vallen.
dotnet-counters monitor -p 22884 --refresh-interval 1
U ziet een toename van het CPU-gebruik, zoals hieronder wordt weergegeven (afhankelijk van de hostcomputer, verwacht u een verschillend CPU-gebruik):
Press p to pause, r to resume, q to quit.
Status: Running
[System.Runtime]
% Time in GC since last GC (%) 0
Allocation Rate / 1 sec (B) 0
CPU Usage (%) 25
Exception Count / 1 sec 0
GC Heap Size (MB) 4
Gen 0 GC Count / 60 sec 0
Gen 0 Size (B) 0
Gen 1 GC Count / 60 sec 0
Gen 1 Size (B) 0
Gen 2 GC Count / 60 sec 0
Gen 2 Size (B) 0
LOH Size (B) 0
Monitor Lock Contention Count / 1 sec 0
Number of Active Timers 1
Number of Assemblies Loaded 140
ThreadPool Completed Work Item Count / 1 sec 3
ThreadPool Queue Length 0
ThreadPool Thread Count 7
Working Set (MB) 63
Gedurende de duur van de aanvraag beweegt het CPU-gebruik de muisaanwijzer rond het verhoogde percentage.
Tip
Als u een nog hoger CPU-gebruik wilt visualiseren, kunt u dit eindpunt tegelijkertijd in meerdere browsertabbladen uitvoeren.
Op dit moment kunt u veilig zeggen dat de CPU hoger is dan verwacht. Het identificeren van de gevolgen van een probleem is essentieel voor het vinden van de oorzaak. We gebruiken het effect van hoog CPU-verbruik naast diagnostische hulpprogramma's om de oorzaak van het probleem te vinden.
Hoge CPU analyseren met Profiler
Bij het analyseren van een app met een hoog CPU-gebruik hebt u een diagnostisch hulpprogramma nodig dat inzicht kan geven in wat de code doet. De gebruikelijke keuze is een profiler en er zijn verschillende profileropties waaruit u kunt kiezen. dotnet-trace
kan worden gebruikt voor alle besturingssystemen, maar de beperkingen van safe-point bias en managed-only callstacks resulteren in meer algemene informatie vergeleken met een kernelbewuste profiler zoals 'perf' voor Linux of ETW voor Windows. Als uw prestatieonderzoek alleen beheerde code omvat, is over het algemeen dotnet-trace
voldoende.
Het perf
hulpprogramma kan worden gebruikt om .NET Core-app-profielen te genereren. We laten dit hulpprogramma zien, hoewel dotnet-trace ook kan worden gebruikt. Sluit het vorige exemplaar van het voorbeeld van het foutopsporingsdoel af.
Stel de DOTNET_PerfMapEnabled
omgevingsvariabele in om ervoor te zorgen dat de .NET-app een map
bestand in de /tmp
map maakt. Dit map
bestand wordt gebruikt om perf
CPU-adressen toe te wijzen aan door JIT gegenereerde functies op naam. Zie Perf-kaarten en jit-dumps exporteren voor meer informatie.
Notitie
.NET 6 standaardiseert het voorvoegsel DOTNET_
in plaats van COMPlus_
voor omgevingsvariabelen die .NET-runtimegedrag configureren. COMPlus_
Het voorvoegsel blijft echter werken. Als u een eerdere versie van de .NET-runtime gebruikt, moet u nog steeds het COMPlus_
voorvoegsel voor omgevingsvariabelen gebruiken.
Voer het voorbeelddoel voor foutopsporing uit in dezelfde terminalsessie.
export DOTNET_PerfMapEnabled=1
dotnet run
Oefen opnieuw het eindpunt van de HOGE CPU-API (https://localhost:5001/api/diagscenario/highcpu/60000
). Voer de opdracht uit met uw perf
proces-id terwijl deze binnen de aanvraag van 1 minuten wordt uitgevoerd:
sudo perf record -p 2266 -g
Met de perf
opdracht wordt het proces voor het verzamelen van prestaties gestart. Laat het ongeveer 20-30 seconden draaien en druk vervolgens op Ctrl+C om het verzamelingsproces af te sluiten. U kunt dezelfde perf
opdracht gebruiken om de uitvoer van de tracering te bekijken.
sudo perf report -f
U kunt ook een vlamgrafiek genereren met behulp van de volgende opdrachten:
git clone --depth=1 https://github.com/BrendanGregg/FlameGraph
sudo perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > flamegraph.svg
Met deze opdracht wordt een flamegraph.svg
gegenereerd die u in de browser kunt bekijken om het prestatieprobleem te onderzoeken:
Hoge CPU-gegevens analyseren met Visual Studio
Alle *.nettrace-bestanden kunnen worden geanalyseerd in Visual Studio. Als u een Linux *.nettrace-bestand in Visual Studio wilt analyseren, brengt u het *.nettrace-bestand, naast de andere benodigde documenten, over naar een Windows-computer en opent u vervolgens het bestand *.nettrace in Visual Studio. Zie Cpu-gebruiksgegevens analyseren voor meer informatie.
Zie ook
- dotnet-trace to list processes
- dotnet-counters om het beheerde geheugengebruik te controleren
- dotnet-dump voor het verzamelen en analyseren van een dumpbestand
- dotnet/diagnostics