Případová studie: Izolace problému s výkonem (C#, Visual Basic, F#)

Pomocí nástrojů pro profilaci můžete zkoumat problémy s výkonem a izolovat problémové oblasti. Tato případová studie používá ukázkovou aplikaci s problémy s výkonem, aby ukázala, jak pomocí nástrojů pro profilaci zlepšit efektivitu. Pokud chcete porovnat nástroje pro profilaci, podívejte se, který nástroj mám zvolit?

Tato případová studie se zabývá těmito tématy:

  • Použití nástrojů pro profilaci sady Visual Studio k analýze výkonu aplikace
  • Jak interpretovat data poskytovaná těmito nástroji za účelem identifikace kritických bodů výkonu.
  • Jak použít praktické strategie pro optimalizaci kódu, zaměření na čítače .NET, počty volání a data časování.

Postupujte podle pokynů a pak tyto techniky použijte u vlastních aplikací, aby byly efektivnější a nákladově efektivnější.

Izolace případové studie problému s výkonem

Ukázková aplikace v této případové studii je ASP.NET aplikace, která spouští dotazy na simulovanou databázi. Příklad je založený na ukázce diagnostiky.

Primární problém s výkonem ukázkové aplikace spočívá v neefektivních vzorech kódování. Aplikace má kritický bod výkonu, který výrazně ovlivňuje jeho efektivitu. Problém zahrnuje následující příznaky:

  • Nízké využití procesoru: Aplikace zobrazuje nízké využití procesoru, což znamená, že procesor není kritickým bodem.

  • High ThreadPool Thread Count: Počet vláken je relativně vysoký a stále rostoucí, což naznačuje hladování fondu vláken.

  • Pomalá odezva aplikace: Aplikace reaguje pomalu kvůli nedostatku dostupných vláken pro zpracování nových pracovních položek.

Případová studie se zaměřuje na řešení těchto problémů pomocí nástrojů pro profilaci sady Visual Studio k analýze výkonu aplikace. Když pochopíte, kde a jak je možné zlepšit výkon aplikace, můžou vývojáři implementovat optimalizace, aby kód byl rychlejší a efektivnější. Konečným cílem je zvýšit celkový výkon aplikace, aby byla efektivnější a nákladově efektivnější.

Úkol

Řešení problémů s výkonem v ukázkové aplikaci .NET představuje několik problémů. Tyto problémy vyplývají ze složitosti diagnostiky kritických bodů výkonu. Hlavní výzvy při řešení popsaných problémů jsou následující:

  • Diagnostika kritických bodů výkonu: Jedním z hlavních problémů je přesná identifikace hlavních příčin problémů s výkonem. Nízké využití procesoru v kombinaci s nízkým výkonem může mít několik faktorů, které přispívají. Vývojáři musí k diagnostice těchto problémů efektivně používat nástroje pro profilaci, které vyžadují určité znalosti o tom, jak tyto nástroje fungují a jak interpretovat jejich výstup.

  • Omezení znalostí a zdrojů: Týmy můžou čelit omezením souvisejícím se znalostmi, odbornými znalostmi a zdroji. Profilace a optimalizace aplikace vyžaduje specifické dovednosti a zkušenosti, a ne všechny týmy mohou mít okamžitý přístup k těmto prostředkům.

Řešení těchto výzev vyžaduje strategický přístup, který kombinuje efektivní použití nástrojů profilace, technických znalostí a pečlivého plánování a testování. Případová studie má za cíl vést vývojáře tímto procesem, poskytovat strategie a přehledy k překonání těchto problémů a zlepšit výkon aplikace.

Strategie

Tady je základní pohled na přístup v této případové studii:

  • Vyšetřování zahájíme sledováním metrik čítačů .NET při shromažďování dat o výkonu. Stejně jako nástroj Využití procesoru je nástroj Čítače .NET sady Visual Studio také dobrým výchozím bodem pro šetření výkonu.
  • Další přehledy, které vám pomůžou izolovat problémy nebo zlepšit výkon, zvažte shromažďování trasování pomocí některého z dalších nástrojů pro profilaci. Podívejte se například na počty volání a data časování pomocí nástroje Instrumentace .

Shromažďování dat vyžaduje následující úlohy:

  • Nastavení aplikace na build vydané verze
  • V profileru výkonu (Alt+F2) vyberte nástroj Čítače .NET. (Pozdější kroky zahrnují nástroj Instrumentation.)
  • V profileru výkonu spusťte aplikaci a shromážděte trasování.

Kontrola čítačů výkonu

Při spouštění aplikace sledujeme čítače v nástroji Čítače .NET. U počátečních šetření je potřeba mít přehled o několika klíčových metrikách:

  • CPU Usage. Podívejte se na tento čítač a zjistěte, jestli dochází k problému s výkonem s vysokým nebo nízkým využitím procesoru. Může to být vodítko pro konkrétní typy problémů s výkonem. Příklad:
    • Při vysokém využití procesoru použijte nástroj Využití procesoru k identifikaci oblastí, ve kterých můžeme optimalizovat kód. Kurz k tomuto tématu najdete v části Případová studie: Průvodce začátečníkem pro optimalizaci kódu.
    • Při nízkém využití procesoru použijte nástroj Instrumentation k identifikaci počtu volání a průměrného času funkce na základě hodinového času. To může pomoct s identifikací problémů, jako jsou kolize nebo hladovění fondu vláken.
  • Allocation Rate. U webové aplikace, která obsluhuje požadavky, by měla být rychlost poměrně stabilní.
  • GC Heap Size. Sledujte tento čítač, abyste zjistili, jestli se využití paměti neustále zvětšuje a potenciálně nevracené. Pokud se zdá, že je vysoká, použijte jeden z nástrojů pro využití paměti.
  • Threadpool Thread Count. U webové aplikace, která obsluhuje požadavky, sledujte tento čítač, abyste zjistili, jestli počet vláken drží stabilní nebo rostoucí rychlostí.

Tady je příklad ukazující, jak CPU Usage je nízká, zatímco ThreadPool Thread Count je relativně vysoká.

Snímek obrazovky s čítači, které se zobrazují v nástroji Čítače .NET

Stále rostoucí počet vláken s nízkým využitím procesoru může být indikátorem hladovění fondu vláken. Fond vláken je nucen pokračovat v otáčení nových vláken. K hladovění fondu vláken dochází v případě, že fond nemá žádná dostupná vlákna pro zpracování nových pracovních položek a často způsobuje, že aplikace reagují pomalu.

Na základě nízkého využití procesoru a relativně vysokého počtu vláken a práce na teorii možného případu hladovění fondu vláken přepněte na použití nástroje Instrumentation.

Zkoumání počtu volání a dat časování

Pojďme se podívat na trasování z nástroje instrumentace, abychom zjistili, jestli se můžeme pokusit zjistit, co se děje s vlákny.

Po shromáždění trasování pomocí nástroje instrumentace a jeho načtení do sady Visual Studio nejprve zkontrolujeme úvodní stránku sestavy .diagsession , která zobrazuje souhrnná data. V shromážděném trasování použijeme odkaz Otevřít podrobnosti v sestavě a pak vybereme Flame Graph.

Snímek obrazovky s Flame Graphem v nástroji Instrumentation

Vizualizace Flame Graph ukazuje, že QueryCustomerDB funkce (zobrazená žlutě) odpovídá za významnou část běhu aplikace.

Klikněte pravým tlačítkem myši na QueryCustomerDB funkci a zvolte Zobrazit ve stromu volání.

Snímek obrazovky stromu volání v nástroji instrumentace

Cesta kódu s nejvyšším využitím procesoru v aplikaci se nazývá horká cesta. Ikona plamene horké cesty (Snímek obrazovky s ikonou Horká cesta) může pomoct rychle identifikovat problémy s výkonem, které by mohly být vylepšeny.

V zobrazení Stromu volání vidíte, že horká cesta obsahuje QueryCustomerDB funkci, která odkazuje na potenciální problém s výkonem.

Vzhledem k času stráveného v jiných funkcích jsou hodnoty Self a Avg Self pro QueryCustomerDB funkci velmi vysoké. Na rozdíl od součtu a průměrného součtu vyloučí hodnoty Self čas strávený v jiných funkcích, takže je to vhodné místo pro vyhledání kritického bodu výkonu.

Tip

Pokud by hodnoty self byly relativně nízké místo vysoké, pravděpodobně byste se chtěli podívat na skutečné dotazy volané QueryCustomerDB funkcí.

Poklikáním na QueryCustomerDB funkci zobrazíte zdrojový kód funkce.

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

Děláme trochu výzkumu. Alternativně můžeme ušetřit čas a nechat Copilot udělat výzkum za nás.

Pokud používáme Copilot, vyberte v místní nabídce možnost Zeptat se copilotu a zadejte následující otázku:

Can you identify a performance issue in the QueryCustomerDB method?

Tip

Příkazy lomítka, jako je /optimize , můžete použít k vytvoření vhodných otázek pro Copilot.

Copilot nám říká, že tento kód volá asynchronní rozhraní API bez použití příkazu Await. Toto je vzor asynchronního kódu synchronizace , což je běžná příčina hladovění fondu vláken a může blokovat vlákna.

Pokud chcete problém vyřešit, použijte příkaz await. V tomto příkladu poskytuje Copilot následující návrh kódu spolu s vysvětlením.

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

Pokud se zobrazí problémy s výkonem související s databázovými dotazy, můžete pomocí nástroje Database zjistit, jestli jsou určitá volání pomalejší. Tato data můžou znamenat příležitost k optimalizaci dotazů. Kurz, který ukazuje, jak pomocí databázového nástroje prozkoumat problém s výkonem, najdete v případové studii: Příručka začátečníka k optimalizaci kódu. Nástroj Database podporuje .NET Core s ADO.NET nebo Entity Framework Core.

Pokud chcete získat vizualizace v sadě Visual Studio pro chování jednotlivých vláken, můžete při ladění použít okno Paralelní zásobníky . Toto okno zobrazuje jednotlivá vlákna spolu s informacemi o vláknech čekajících, vláknech, na kterých čekají, a zablokování.

Další informace o hladovění fondu vláken naleznete v tématu Zjišťování hladovění fondu vláken.

Další kroky

Následující články a blogové příspěvky obsahují další informace, které vám pomůžou efektivně používat nástroje pro výkon sady Visual Studio.