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:

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:

Flame graph SVG image

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

További lépések