Sdílet prostřednictvím


Zobrazení dat profileru Přehledy aplikace

Ř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 Profiler nahrál trasování, musí vaše služba aktivně zpracovávat požadavky.

Pokud jste profiler nově povolili, 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řehled aplikace Přehledy 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.

    Screenshot of the Profiler button from the Performance pane.

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

    Screenshot of Profiler page features and settings.

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í.

    Screenshot of trace explorer page.

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 používá kombinaci metod vzorkování a instrumentace k analýze výkonu vaší aplikace. Při provádění podrobné kolekce Profiler:

  • 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) ve vašich 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 AWAIT_TIME zdá být v kódu architektury místo vašeho kódu, může se profiler zobrazit:

  • 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, 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...