Esettanulmány: Teljesítményproblémák elkülönítése (C#, Visual Basic, F#)

Ez az esettanulmány bemutatja, hogyan használható a Visual Studio profilkészítési eszközei egy mintaalkalmazás teljesítményproblémáinak azonosítására és megoldására ASP.NET. A profilkészítési eszközök összehasonlításához lásd: Melyik eszközt válasszam?

Az oktatóanyagból a következőket sajátíthatja el:

  • A Visual Studio profilkészítési eszközeinek használata az alkalmazás teljesítményének elemzéséhez.
  • Profilkészítési adatok értelmezése szűk keresztmetszetek megtalálásához.
  • Gyakorlati stratégiák a kód .NET-számlálókkal, hívásszámokkal és időzítési adatokkal való optimalizálásához.

Alkalmazza ezeket a technikákat saját alkalmazásai fejlesztéséhez.

Teljesítményproblémák esettanulmányának elkülönítése

A minta ASP.NET alkalmazás lekérdezéseket futtat szimulált adatbázison, és a diagnosztikai mintán alapul.

Fő teljesítménytünetek:

  • Alacsony processzorhasználat: Nem a cpu a szűk keresztmetszet.
  • Magas ThreadPool-szálszám: A szálak száma folyamatosan emelkedik, ami azt jelzi, hogy a szálkészlet éhezik.
  • Lassú alkalmazásválasz: Az alkalmazás lassan válaszol a rendelkezésre álló szálak hiánya miatt.

Ez az esettanulmány a Visual Studio profilkészítési eszközeivel rögzíti és kezeli ezeket a problémákat, így gyorsabban és hatékonyabbá teheti a kódot.

Kihívás

A problémák megoldása több kihívást is magában foglal:

  • Szűk keresztmetszetek diagnosztizálása: Az alacsony processzorhasználat lassú teljesítmény mellett több oka is lehet. A profilkészítési eszközök hatékony használata és kimenetük értelmezése elengedhetetlen.
  • Tudás- és erőforráskorlátok: A profilkészítés és az optimalizálás speciális készségeket és tapasztalatokat igényel, amelyek nem mindig érhetők el.

A profilkészítési eszközöket, a műszaki ismereteket és a gondos tesztelést kombináló stratégiai megközelítés kulcsfontosságú ezeknek a kihívásoknak a leküzdéséhez.

Stratégia

Ebben az esettanulmányban a megközelítés magas szintű nézete látható:

  • Kezdje a .NET számlálómetrikáinak figyelésével a teljesítményadatok gyűjtése közben. A Visual Studio .NET Counters eszköze jó kiindulópont.
  • A mélyebb elemzések érdekében gyűjtsön nyomkövetéseket további profilkészítési eszközökkel, például a hívásszámlálási és időzítési adatokhoz használható Instrumentation eszközzel.

Az adatgyűjtéshez a következő feladatok szükségesek:

  • Állítsa be az alkalmazást release buildre.
  • Válassza ki a .NET Számlálók eszközt a Teljesítményprofil-kezelőben (Alt+F2).
  • Indítsa el az alkalmazást, és gyűjtsön egy nyomkövetést.

Teljesítményszámlálók ellenőrzése

Az alkalmazás futtatása közben megfigyeljük a számlálókat a .NET Számlálók eszközben. A kezdeti vizsgálatokhoz néhány fontos metrikát érdemes szem előtt tartani:

  • CPU Usage. Ebből a számlálóból megtudhatja, hogy magas vagy alacsony processzorhasználattal kapcsolatos teljesítményproblémák lépnek-e fel. Ez a teljesítményproblémák bizonyos típusaira utalhat. Például:
    • Magas processzorhasználat esetén a CPU-használat eszközzel azonosíthatja azokat a területeket, ahol optimalizálni tudjuk a kódot. Erről a Esettanulmány: Kezdő útmutató a kódoptimalizálásához.
    • Alacsony processzorhasználat esetén a Instrumentation eszközzel azonosíthatja a hívásszámokat és az átlagos függvényidőt a falióra-idő alapján. Ez segíthet azonosítani az olyan problémákat, mint a versengés vagy a szálkészlet éhezése.
  • Allocation Rate. A kéréseket kiszolgáló webalkalmazások esetében az aránynak viszonylag egyenletesnek kell lennie.
  • GC Heap Size. Ebből a számlálóból megtudhatja, hogy a memóriahasználat folyamatosan növekszik-e, és esetleg kiszivárog. Ha magasnak tűnik, használja a memóriahasználati eszközök egyikét.
  • Threadpool Thread Count. A kéréseket kiszolgáló webalkalmazások esetében tekintse meg ezt a számlálót, és ellenőrizze, hogy a szálszám állandó vagy állandó ütemben emelkedik-e.

Íme egy példa a CPU Usage alacsony, míg a ThreadPool Thread Count viszonylag magas.

A .NET Számlálók eszközben megjelenő számlálók képernyőképe.

Az alacsony PROCESSZORhasználattal rendelkező, folyamatosan növekvő szálak száma a szálkészlet éhezésének jelzése lehet. A szálkészletnek folyamatosan új szálakat kell pörgetnie. A szálkészlet éhezése akkor fordul elő, ha a készlet nem rendelkezik olyan szállal, amely új munkaelemeket dolgozna fel, és gyakran az alkalmazások lassan válaszolnak.

Az alacsony CPU-használat és a viszonylag magas szálszám alapján, valamint a szálkészlet éhezésének lehetséges eseteinek elméletén dolgozva váltson a Instrumentation eszköz használatára.

Hívások számának és időzítési adatainak vizsgálata

Vessünk egy pillantást a Instrumentation eszköz nyomaira, hogy megtudjuk, megpróbálhatunk-e többet megtudni arról, hogy mi történik a szálakkal.

Miután begyűjtöttünk egy nyomkövetést a Instrumentation eszközzel, és betöltöttük a Visual Studióba, először ellenőrizzük a kezdeti .diagsession jelentésoldalt, amely összegzett adatokat jelenít meg. Az összegyűjtött nyomkövetésben a jelentésben a Részletek megtekintése hivatkozást használjuk, majd kiválasztjuk a Flame Graphopciót.

Flame Graph képernyőképe a Instrumentation eszközben.

A Flame Graph-vizualizáció azt mutatja, hogy a QueryCustomerDB függvény (sárga színnel) felelős az alkalmazás futási idejének jelentős részéért.

Kattintson a jobb gombbal a QueryCustomerDB függvényre, és válassza a Megtekintés hívásfábanlehetőséget.

A Hívásfa képernyőképe az Instrumentation eszközben.

Az alkalmazás legnagyobb processzorhasználattal rendelkező kódútvonalát gyakori elérési útnak nevezzük. A gyakori elérésű útvonal láng ikonja (Képernyőkép, amelyen a Gyakori elérésű útvonal ikon látható.) segítségével gyorsan azonosíthatók a javítható teljesítményproblémák.

A Hívásfa nézetben láthatja, hogy a forró útvonal tartalmazza a QueryCustomerDB függvényt, amely egy lehetséges teljesítményproblémára utal.

A függvény Önálló és QueryCustomerDB értékei a más függvényekben töltött időhöz képest nagyon magasak. Ellentétben Total és Avg Totalértékekkel, a Saját értékek kizárják a más függvényekben töltött időt, így ez egy jó hely a teljesítmény szűk keresztmetszetének megtalálásához.

Borravaló

Ha az saját értékek a magas helyett viszonylag alacsonyak voltak, valószínűleg szeretne megnézni a QueryCustomerDB függvény által hívott konkrét lekérdezéseket.

Kattintson duplán a QueryCustomerDB függvényre a függvény forráskódjának megjelenítéséhez.

public ActionResult<string> QueryCustomerDB()
{
    Customer c = QueryCustomerFromDbAsync("Dana").Result;
    return "success:taskwait";
}

Csinálunk egy kis kutatást. Másik lehetőségként időt takaríthatunk meg, és hagyhatjuk, hogy Copilot végezze el a kutatást.

Ha a Copilot-ot használjuk, válassza a Copilot megkérdezése lehetőséget a helyi menüben, és írja be a következő kérdést:

Can you identify a performance issue in the QueryCustomerDB method?

Borravaló

Perjelparancsokat használhat, például /optimalizálni, hogy jó kérdéseket tehessen fel a Copilot számára.

A Copilot azt mondja, hogy ez a kód egy aszinkron API-t hív meg várakozás nélkül. Ez a sync-over-async kódminta, amely a szálkészlet kimerülésének gyakori oka, és blokkolhatja a szálakat.

A megoldáshoz használja az await függvényt. Ebben a példában a Copilot a következő kódjavaslatot adja meg a magyarázattal együtt.

public async Task<ActionResult<string>> QueryCustomerDB()
{
    Customer c = await QueryCustomerFromDbAsync("Dana");
    return "success:taskwait";
}

Ha az adatbázis-lekérdezésekkel kapcsolatos teljesítményproblémák jelennek meg, az Adatbázis eszköz segítségével megvizsgálhatja, hogy bizonyos hívások lassabbak-e. Ezek az adatok a lekérdezések optimalizálásának lehetőségét jelezhetik. Az adatbázis-eszköz teljesítményproblémák vizsgálatához való használatát bemutató oktatóanyagért tekintse meg Esettanulmány: Kezdő útmutató a kódoptimalizálásához. Az Adatbázis eszköz támogatja a .NET Core-t ADO.NET vagy Entity Framework Core használatával.

Ha vizualizációkat szeretne kapni a Visual Studio-ban az egyes szálak viselkedéséről, a hibakeresés során használhatja a Párhuzamos verem ablakot. Ez az ablak az egyes szálakat, valamint információkat jelenít meg a várakozó szálakról, azokról a szálakról, amelyeken várakoznak, és a holtpontokról .

További információ a szálak éhezéséről a szálkészletben az alábbi hivatkozáson található: A szálkészlet éhezés észlelése.

Következő lépések

Az alábbi cikkek és blogbejegyzések további információkat nyújtanak a Visual Studio teljesítményeszközök hatékony használatának elsajátításához.