Sdílet prostřednictvím


Zobrazení profileru Application Insights pro data .NET

Řekněme, že spouštíte test výkonnosti webu. Abyste pochopili, jak vaše webová aplikace běží pod zatížením, budete potřebovat trasování. V tomto článku:

  • Vygenerujte provoz do webové aplikace spuštěním testu výkonnosti webu nebo spuštěním relace Profileru na vyžádání.
  • Prohlédněte si trasování profileru po zátěžovém testu nebo relaci Profileru.
  • Přečtěte si, jak číst data o výkonu profileru a zásobník volání.

Generování provozu do služby Azure

Aby služba .NET Profiler nahrála trasování, musí vaše služba aktivně zpracovávat požadavky.

Pokud jste nově povolili Profiler pro .NET, spusťte krátký zátěžový test s využitím služby Azure Load Testing.

Pokud už vaše služba Azure obsahuje příchozí provoz nebo pokud chcete jenom ručně generovat provoz, přeskočte zátěžový test a spusťte relaci Profileru na vyžádání:

  1. Na stránce přehledu Application Insights pro vaši službu Azure vyberte v nabídce vlevo výkon .

  2. V podokně Výkon vyberte Profiler v horní nabídce pro nastavení profileru.

    Snímek obrazovky s tlačítkem Profiler v podokně Výkon

  3. Jakmile se stránka nastavení profileru načte, vyberte Profil hned.

    Snímek obrazovky s funkcemi a nastavením stránky Profileru

Zobrazení trasování

  1. Po dokončení spuštění relací Profileru se vraťte do podokna Výkon .

  2. V části Přejít k podrobnostem... vyberte trasování profileru a zobrazte trasování.

    Snímek obrazovky se stránkou Průzkumníka trasování

Průzkumník trasování zobrazí následující informace:

Filtr Popis
Profilový strom v. Graf plamene Prohlédněte si trasování jako strom nebo ve formuláři grafu.
Horká cesta Výběrem otevřete největší uzel typu list. Ve většině případů je tento uzel blízko kritického bodu výkonu.
Závislosti architektury Výběrem zobrazíte všechny závislosti trasované architektury přidružené k trasování.
Skrytí událostí Zadejte řetězce, které chcete skrýt v zobrazení trasování. Vyberte Navrhované události pro návrhy.
Událost Název události nebo funkce Strom zobrazuje kombinaci kódu a událostí, ke kterým došlo, například události SQL a HTTP. Hlavní událost představuje celkovou dobu trvání požadavku.
Modul Modul, ve kterém došlo k trasované události nebo funkci.
Čas vlákna Časový interval mezi začátkem operace a koncem operace.
Časová osa Čas, kdy byla funkce nebo událost spuštěna ve vztahu k jiným funkcím.

Čtení dat o výkonu

Profiler .NET používá kombinaci metod vzorkování a instrumentace k analýze výkonu vaší aplikace. Při provádění podrobné kolekce se profiler .NET:

  • Vzorkuje ukazatel instrukce každého procesoru počítače v milisekundách.
    • Každá ukázka zachycuje kompletní zásobník volání vlákna a poskytuje podrobné informace na vysoké i nízké úrovni abstrakce.
  • Shromažďuje události pro sledování korelace aktivity a kauzality, včetně:
    • Kontextové přepínání událostí
    • Události TPL (Task Parallel Library)
    • Události fondu vláken

Zásobník volání zobrazený v zobrazení časové osy je výsledkem vzorkování a instrumentace. Vzhledem k tomu, že každá ukázka zachycuje kompletní zásobník volání vlákna, zahrnuje kód z rozhraní Microsoft .NET Framework a všechny ostatní architektury, na které odkazujete.

Přidělení objektů (clr! JIT_New nebo clr! JIT_Newarr1)

clr! JIT_New a clr! JIT_Newarr1 jsou pomocné funkce v rozhraní .NET Framework, které přidělují paměť ze spravované haldy.

  • clr! JIT_New je vyvolána při přidělení objektu.
  • clr! JIT_Newarr1 je vyvolána při přidělení pole objektu.

Tyto dvě funkce obvykle fungují rychle. Pokud je clr! JIT_New nebo clr! JIT_Newarr1 na časové ose nějakou dobu trvá, může kód přidělovat mnoho objektů a spotřebovát velké množství paměti.

Načítání kódu (clr! ThePreStub)

clr! ThePreStub je pomocná funkce v rozhraní .NET Framework, která připravuje kód pro počáteční spuštění, což obvykle zahrnuje kompilaci JIT (just-in-time). Pro každou metodu jazyka C# clr! ProceduraPreStub by měla být vyvolána maximálně jednou během procesu.

Pokud je clr! ThePreStub pro požadavek trvá déle, jedná se o první požadavek na provedení této metody. Načtení první metody za běhu rozhraní .NET Framework trvá značné množství času. Rozmyslete si:

  • Pomocí procesu zahřívání, který spustí danou část kódu předtím, než k němu uživatelé přistupují.
  • Spuštění generátoru nativních imagí (ngen.exe) v sestaveních

Uzamknout kolize (clr! JITutil_MonContention nebo clr! JITutil_MonEnterWorker)

clr! JITutil_MonContention nebo clr! JITutil_MonEnterWorker značí, že aktuální vlákno čeká na uvolnění zámku. Tento text se často zobrazuje v těchto případech:

  • Spusťte příkaz C# LOCK .
  • Vyvolání metody Monitor.Enter nebo
  • Vyvolá metodu s atributem MethodImplOptions.Synced .

Kolize zámků obvykle nastane, když vlákno A získá zámek a vlákno B se pokusí získat stejný zámek předtím, než vlákno A uvolní.

Načítání kódu ([COLD])

Pokud modul runtime rozhraní .NET Framework spouští neoptimalizovaný kód poprvé, název metody bude obsahovat [COLD]:

mscorlib.ni![COLD]System.Reflection.CustomAttribute.IsDefined

Pro každou metodu by se měla během procesu zobrazit maximálně jednou.

Pokud načítání kódu pro požadavek trvá značné množství času, je to spuštění požadavku neoptimalizované části metody. Než k němu uživatelé přistupují, zvažte použití procesu zahřívání, který tuto část kódu spustí.

Odeslání požadavku HTTP

Metody, jako je HttpClient.Send , označují, že kód čeká na dokončení požadavku HTTP.

Operace databáze

Metody, jako je SqlCommand.Execute , indikují, že kód čeká na dokončení databázové operace.

Čekání (AWAIT_TIME)

AWAIT_TIME označuje, že kód čeká na dokončení jiného úkolu. K tomuto zpoždění dochází pomocí příkazu C# AWAIT . Když kód provede C# AWAIT:

  • Vlákno se odvíje a vrátí řízení do fondu vláken.
  • Neexistuje žádné blokované vlákno, které čeká na dokončení funkce AWAIT .

Logicky však vlákno, které provedlo operátor AWAIT , je "blokováno", a čeká na dokončení operace. Příkaz AWAIT_TIME označuje blokovaný čas a čeká na dokončení úkolu.

Pokud se zdá, že AWAIT_TIME je místo vašeho kódu v kódu rozhraní, může se zobrazit .NET Profiler:

  • Kód architektury použitý k provedení příkazu AWAIT
  • Kód použitý k záznamu telemetrie o operátoru AWAIT

Zaškrtnutí políčka Závislosti architektury v horní části stránky můžete zrušit, abyste zobrazili jenom kód a usnadnili zobrazení původu funkce AWAIT.

Blokovaný čas

BLOCKED_TIME značí, že kód čeká na dostupnost jiného prostředku. Může například čekat na:

  • Synchronizační objekt
  • Vlákno, které má být k dispozici
  • Žádost o dokončení

Nespravovaná asynchronní synchronizace

Aby bylo možné sledovat asynchronní volání napříč vlákny, rozhraní .NET Framework generuje události trasování událostí pro Windows a předává ID aktivit mezi vlákny. Vzhledem k tomu, že nespravovaný (nativní) kód a některé starší styly asynchronního kódu nemají tyto události a ID aktivit, rozhraní .NET Profiler nemůže sledovat vlákno a funkce spuštěné ve vlákně. Tato položka má v zásobníku volání označení Nespravovaná asynchronní synchronizace. Stáhněte si soubor ETW, abyste mohli použít nástroj PerfView , abyste mohli získat další přehled.

Čas procesoru

Procesor je zaneprázdněn prováděním pokynů.

Čas disku

Aplikace provádí diskové operace.

Čas sítě

Aplikace provádí síťové operace.

Když sloupec

Sloupec When představuje vizualizaci různých inkluzivních ukázek shromážděných pro uzel v průběhu času. Celkový rozsah požadavku je rozdělený do 32 časových intervalů, kde se kumulují inkluzivní vzorky uzlu. Každý kbelík je reprezentován jako pruh. Výška pruhu představuje škálovanou hodnotu. Pruh pro následující uzly představuje spotřebu jednoho z prostředků během kontejneru:

  • Uzly označené CPU_TIME nebo BLOCKED_TIME
  • Uzly se zjevným vztahem k využívání prostředku (například procesoru, disku nebo vlákna).

Pro tyto metriky můžete získat hodnotu větší než 100 % tím, že využíváte více prostředků. Pokud například během průměrného intervalu použijete dva procesory, získáte 200 %.

Další kroky

Naučte se...