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í:
Na stránce přehledu Application Insights pro vaši službu Azure vyberte v nabídce vlevo výkon .
V podokně Výkon vyberte Profiler v horní nabídce pro nastavení profileru.
Jakmile se stránka nastavení profileru načte, vyberte Profil hned.
Zobrazení trasování
Po dokončení spuštění relací Profileru se vraťte do podokna Výkon .
V části Přejít k podrobnostem... vyberte trasování profileru a zobrazte 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...