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:

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:

Flame graph SVG image

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

Volgende stappen