Magas processzorhasználat hibakeresése a .NET Core-ban
Ez a cikk a következőre vonatkozik: ✔️ .NET Core 3.1 SDK és újabb verziók
Ebben az oktatóanyagban megtudhatja, hogyan lehet hibakeresést végezni egy túlzott processzorhasználati forgatókönyvben. A megadott példa ASP.NET Core webalkalmazás forráskódtárával szándékosan okozhat holtpontot. A végpont nem válaszol, és tapasztalja a szál felhalmozódását. Megtudhatja, hogyan diagnosztizálhatja ezt a forgatókönyvet különböző eszközökkel a diagnosztikai adatok több kulcsfontosságú elemével.
Az oktatóanyag során az alábbi lépéseket fogja végrehajtani:
- Magas processzorhasználat vizsgálata
- Cpu-használat meghatározása dotnet-counters használatával
- Dotnet-trace használata nyomkövetési generáláshoz
- Profilteljesítmény a PerfView-ban
- A túlzott processzorhasználat diagnosztizálása és megoldása
Előfeltételek
Az oktatóanyag a következőket használja:
- .NET Core 3.1 SDK vagy újabb verzió.
- Hibakeresési célminta a forgatókönyv aktiválásához.
- dotnet-trace a folyamatok listázásához és profil létrehozásához.
- dotnet-counters a processzorhasználat monitorozásához.
CPU-számlálók
A diagnosztikai adatok gyűjtésének megkísérlése előtt magas CPU-kondíciót kell megfigyelnie. Futtassa a mintaalkalmazást a projekt gyökérkönyvtárának következő parancsával.
dotnet run
A folyamatazonosító megkereséséhez használja a következő parancsot:
dotnet-trace ps
Jegyezze fel a parancs kimenetéből származó folyamatazonosítót. A folyamatazonosítónk az volt 22884
, de az Ön adatai eltérőek lesznek. Az aktuális processzorhasználat ellenőrzéséhez használja a dotnet-counters eszköz parancsot:
dotnet-counters monitor --refresh-interval 1 -p 22884
A refresh-interval
processzorértékeket lekérdező számláló között eltelt másodpercek száma. A kimenet az alábbihoz hasonló lesz:
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
Ha a webalkalmazás fut, közvetlenül az indítás után a rendszer nem használja fel a processzort, és a rendszer a következő címen 0%
jelenti: . Navigáljon az api/diagscenario/highcpu
útvonalhoz 60000
útvonalparaméterként:
https://localhost:5001/api/diagscenario/highcpu/60000
Most futtassa újra a dotnet-counters parancsot. Ha csak a számlálót szeretné figyelni, adja hozzá a cpu-usage
"--counters System.Runtime[cpu-usage]" parancsot az előző parancshoz. Nem tudjuk biztosan, hogy a processzor használatban van-e, ezért a számlálók fenti listájának monitorozásával ellenőrizzük, hogy a számlálóértékek az alkalmazás várható tartományán belül vannak-e.
dotnet-counters monitor -p 22884 --refresh-interval 1
Az alábbiakban látható módon növelnie kell a processzorhasználatot (a gazdagéptől függően eltérő processzorhasználat várható):
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
A kérelem teljes időtartama alatt a processzorhasználat a megnövekedett százalék körül mozog.
Tipp.
A még magasabb processzorhasználat megjelenítéséhez ezt a végpontot egyszerre több böngészőlapon is gyakorolhatja.
Ezen a ponton nyugodtan mondhatja, hogy a processzor a vártnál magasabban fut. A probléma hatásainak azonosítása kulcsfontosságú az ok megtalálásához. A probléma okának megtalálásához a diagnosztikai eszközök mellett a magas processzorhasználat hatását is használjuk.
Magas processzorhasználat elemzése a Profilerrel
A magas processzorhasználattal rendelkező alkalmazások elemzésekor egy diagnosztikai eszközre van szükség, amely betekintést nyújt a kód tevékenységébe. A szokásos választás egy profilkészítő, és különböző profilkészítő lehetőségek közül választhat. dotnet-trace
minden operációs rendszeren használható, azonban a biztonságos és a csak felügyelt hívások korlátozásai általánosabb információkat eredményeznek, mint a kernelérzékeny profilkészítők, például a Linux esetében a "perf" vagy a Windows ETW. Ha a teljesítményvizsgálat csak felügyelt kódot tartalmaz, általában dotnet-trace
elegendő lesz.
Az perf
eszköz használható .NET Core-alkalmazásprofilok létrehozásához. Bemutatjuk ezt az eszközt, bár a dotnet-trace is használható. Lépjen ki a hibakeresési mintapéldány előző példányából.
Állítsa be a DOTNET_PerfMapEnabled
környezeti változót, hogy a .NET-alkalmazás hozzon létre egy map
fájlt a /tmp
könyvtárban. Ez map
a fájl a CPU-címek JIT által létrehozott függvények név szerinti leképezésére szolgál perf
. További információ: Perf térképek és jit-memóriaképek exportálása.
Megjegyzés:
A .NET 6 az előtagon DOTNET_
szabványosítja a .NET futásidejű viselkedést konfiguráló környezeti változók helyett COMPlus_
. Az COMPlus_
előtag azonban továbbra is működni fog. Ha a .NET-futtatókörnyezet egy korábbi verzióját használja, akkor is használja a COMPlus_
környezeti változók előtagját.
Futtassa a minta hibakeresési célt ugyanabban a terminál munkamenetben.
export DOTNET_PerfMapEnabled=1
dotnet run
Gyakorolja újra a magas CPU API-végpontot (https://localhost:5001/api/diagscenario/highcpu/60000
). Amíg az 1 perces kérelemben fut, futtassa a parancsot a perf
folyamatazonosítóval:
sudo perf record -p 2266 -g
A perf
parancs elindítja a teljesítménygyűjtési folyamatot. Futtassa körülbelül 20–30 másodpercig, majd nyomja le a Ctrl+C billentyűkombinációt a gyűjtési folyamatból való kilépéshez. Ugyanezzel perf
a paranccsal megtekintheti a nyomkövetés kimenetét.
sudo perf report -f
A lángdiagramot az alábbi parancsokkal is létrehozhatja:
git clone --depth=1 https://github.com/BrendanGregg/FlameGraph
sudo perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > flamegraph.svg
Ez a parancs létrehoz egy olyan parancsot flamegraph.svg
, amelyet a böngészőben tekinthet meg a teljesítményproblémák kivizsgálásához:
Magas cpu-adatok elemzése a Visual Studióval
Minden *.nettrace-fájl elemezhető a Visual Studióban. Linux *.nettrace-fájl Visual Studióban való elemzéséhez a *.nettrace fájlt a többi szükséges dokumentum mellett át kell vinnie egy Windows-gépre, majd nyissa meg a *.nettrace fájlt a Visual Studióban. További információ: Processzorhasználati adatok elemzése.
Kapcsolódó információk
- dotnet-trace to list processes
- dotnet-counters a felügyelt memóriahasználat ellenőrzéséhez
- dotnet-dump a memóriaképfájl gyűjtéséhez és elemzéséhez
- dotnet/diagnostics