Trasování aplikací .NET pomocí nástroje PerfCollect

Tento článek se vztahuje na: ✔️ .NET Core 2.1 SDK a novější verze

Při problémech s výkonem v Linuxu lze použít trasování pomocí perfcollect ke shromažďování podrobných informací o tom, co se děje na počítači v době výskytu problému s výkonem.

perfcollect je skript Bash, který používá sadu nástrojů Linux Trace Toolkit: příští generace (LTTng) ke shromažďování událostí zapsaných z modulu runtime nebo z libovolného zdroje událostía také k shromažďování vzorků procesoru cílového procesu.

Příprava počítače

Připravte počítač na shromažďování trasování výkonu podle následujících kroků pomocí nástroje perfcollect.

Poznámka:

Pokud zachytáváte z kontejneru, musí mít váš kontejner odpovídající možnosti. Minimální požadované schopnosti jsou PERFMON a SYS_PTRACE. Pokud se zachycení nezdaří s minimální sadou, přidejte schopnost SYS_ADMIN do kontejneru. Další informace o trasování aplikací uvnitř kontejnerů pomocí nástroje PerfCollect najdete v tématu Shromažďování diagnostiky v kontejnerech.

  1. Stáhnout perfcollect.

    curl -OL https://aka.ms/perfcollect
    
  2. Vytvořte spustitelný skript.

    chmod +x perfcollect
    
  3. Instalujte nezbytné požadavky na trasování – jedná se o konkrétní knihovny trasování.

    sudo ./perfcollect install
    

    Na počítač se nainstalují následující požadavky:

    1. perf: Subsystém Události výkonu Linuxu a doprovodná aplikace pro sběr/prohlížení v uživatelském režimu. perf je součástí zdroje jádra Linuxu, ale obvykle se nenainstaluje ve výchozím nastavení.
    2. LTTng: Slouží k zachycení dat událostí vygenerovaných za běhu CoreCLR. Tato data se pak používají k analýze chování různých komponent modulu runtime, jako jsou GC, JIT a fond vláken.

Nejnovější verze .NET Core a nástroje pro výkon v Linuxu podporují automatické rozlišení názvů metod pro kód architektury.

Při vyhledání názvů metod nativních knihoven DLL pro modul runtime (například libcoreclr.so) perfcollect vyhledá symboly pro ně při převodu dat, ale pouze pokud jsou symboly těchto binárních souborů dostupné. Podrobnosti najdete v části Získání symbolů pro nativní modul runtime .

Sbírat stopu

  1. Máte k dispozici dvě prostředí – jedno pro řízení trasování, označované jako [Trasování] a jedno pro spuštění aplikace, označované jako [Aplikace].

  2. [Trasování] Zahájit sběr.

    sudo ./perfcollect collect sampleTrace
    

    Očekávaný výstup:

    Collection started.  Press CTRL+C to stop.
    

    Poznámka:

    LTTng měl zásadní změnu mezi verzemi 2.12 a 2.13. Modul runtime .NET aktuálně podporuje verzi 2.12. Pokud vaše distribuce Linuxu přijala verzi 2.13 nebo novější, doporučujeme zakázat část funkce LTTng v rámci funkce perfcollect. Pokud to chcete udělat, přidejte do příkazového řádku perfcollect možnost -nolttng a v kroku 3 nenastavujte proměnnou prostředí DOTNET_EnableEventLog.

  3. [Aplikace] Nastavte shell aplikace s následujícími proměnnými prostředí – tím se umožní trasování konfigurace CoreCLR.

  4. [Aplikace] Nastavte shell aplikace s následujícími proměnnými prostředí – tím se umožní trasování konfigurace CoreCLR.

    export DOTNET_PerfMapEnabled=1
    export DOTNET_EnableEventLog=1
    

    Poznámka:

    Při spouštění aplikace s .NET 7 musíte také nastavit DOTNET_EnableWriteXorExecute=0 kromě předchozích proměnných prostředí. Například:

    export DOTNET_EnableWriteXorExecute=0
    
  5. [Aplikace] Spusťte aplikaci – nechte ji běžet, dokud ji potřebujete, abyste mohli zaznamenat problém s výkonem. Přesná délka může být tak krátká, jak potřebujete, pokud dostatečně zachycuje časové období, ve kterém dochází k problému s výkonem, který chcete prozkoumat.

    dotnet run
    
  6. [Trasování] Zastavit shromažďování – stiskněte Ctrl+C.

    ^C
    ...STOPPED.
        Starting post-processing. This may take some time.
        Generating native image symbol files
    ...SKIPPED
    Saving native symbols
    ...FINISHED
    Exporting perf.data file
    ...FINISHED
    Compressing trace files
    ...FINISHED
    Cleaning up artifacts
    ...FINISHED
        Trace saved to sampleTrace.trace.zip
    

    Komprimovaný trasovací soubor je teď uložený v aktuálním pracovním adresáři.

Zobrazit trasování

Existuje několik možností pro zobrazení shromážděného trasování. Stopy je nejlepší zobrazit pomocí PerfView na Windows, ale lze je zobrazit přímo na Linuxu pomocí PerfCollect nebo TraceCompass.

Použití nástroje PerfCollect k zobrazení trasovacího souboru

Pomocí perfcollect můžete zobrazit stopu, kterou jste shromáždili. K tomu použijte následující příkaz:

./perfcollect view sampleTrace.trace.zip

Ve výchozím nastavení se zobrazí trasování procesoru aplikace pomocí perf.

Pokud se chcete podívat na události shromážděné prostřednictvím LTTng, můžete předat příznak -viewer lttng a zobrazit jednotlivé události:

./perfcollect view sampleTrace.trace.zip -viewer lttng

Toto použije prohlížeč babeltrace k vytisknutí datové části událostí.

# [01:02:18.189217659] (+0.020132603) ubuntu-xenial DotNETRuntime:ExceptionThrown_V1: { cpu_id = 0 }, { ExceptionType = "System.Exception", ExceptionMessage = "An exception happened", ExceptionEIP = 139875671834775, ExceptionHRESULT = 2148734208, ExceptionFlags = 16, ClrInstanceID = 0 }
# [01:02:18.189250227] (+0.020165171) ubuntu-xenial DotNETRuntime:ExceptionCatchStart: { cpu_id = 0 }, { EntryEIP = 139873639728404, MethodID = 139873626968120, MethodName = "void [helloworld] helloworld.Program::Main(string[])", ClrInstanceID = 0 }

Otevření trasovacího souboru pomocí perfView

Pokud chcete zobrazit agregované zobrazení ukázky procesoru i událostí, můžete je použít PerfView na počítači s Windows.

  1. Zkopírujte soubor trace.zip z Linuxu do počítače s Windows.

  2. Stáhnout PerfView z https://aka.ms/perfview.

  3. Běh PerfView.exe

    PerfView.exe <path to trace.zip file>
    

Nástroj PerfView zobrazí seznam zobrazení podporovaných na základě dat obsažených v trasovacím souboru.

  • Pro analýzy procesoru zvolte zásobníky procesoru.
  • Pro získání podrobných informací o GC zvolte GCStats.
  • Pokud chcete informace o JIT pro jednotlivé procesy, moduly nebo metody, zvolte JITStats.
  • Pokud není k dispozici zobrazení potřebných informací, můžete zkusit vyhledat události v zobrazení nezpracovaných událostí. Zvolte Události.

Další informace o tom, jak interpretovat zobrazení v nástroji PerfView, viz odkazy nápovědy v samotném zobrazení, nebo vyberte z hlavního okna v nástroji PerfView Nápověda-Průvodce uživatele>.

Poznámka:

Události napsané prostřednictvím System.Diagnostics.Tracing.EventSource rozhraní API (včetně událostí z rozhraní Framework) se pod názvem poskytovatele nezobrazí. Místo toho se zapisují jako EventSourceEvent události v rámci Microsoft-Windows-DotNETRuntime zprostředkovatele a jejich datové části jsou serializovány ve formátu JSON.

Poznámka:

Pokud sledujete [unknown] /memfd:doublemapper rámce v názvech metod a voláních, nastavte DOTNET_EnableWriteXorExecute=0 před spuštěním aplikace, kterou trasujete pomocí perfcollectu.

Otevření trasovacího souboru pomocí TraceCompassu

Eclipse TraceCompass je další možností, kterou můžete použít k zobrazení trasování. TraceCompass funguje i na počítačích s Linuxem, takže trasování nemusíte přesouvat na počítač s Windows. TraceCompass Pokud chcete otevřít trasovací soubor, budete muset soubor rozbalit.

unzip myTrace.trace.zip

perfcollect uloží záznam trasování LTTng, které bylo shromážděno, do formátu souboru CTF v podadresáři v adresáři lttngTrace. Konkrétně bude soubor CTF umístěn v adresáři, který vypadá jako lttngTrace/auto-20201025-101230\ust\uid\1000\64-bit\.

Trasovací soubor TraceCompass CTF můžete otevřít výběrem File -> Open Trace a výběrem metadata souboru.

Další podrobnosti najdete v TraceCompass dokumentaci.

Získejte symboly pro nativní běhové prostředí

Ve většině případů vás zajímá vlastní kód, který se perfcollect automaticky vyřeší. Někdy je užitečné zjistit, co se děje uvnitř knihoven DLL .NET (což je to, o čem poslední část byla), ale někdy je zajímavé, co se děje v nativních knihovnách DLL modulu runtime (obvykle libcoreclr.so). perfcollect přeloží symboly pro tyto objekty při převodu dat, ale pouze pokud jsou symboly těchto nativních knihoven DLL přítomny (a jsou vedle knihovny, pro které jsou určené).

Existuje globální příkaz s názvem dotnet-symbol , který to dělá. Použití nástroje dotnet-symbol pro získání nativních běhových symbolů:

  1. Nainstalujte dotnet-symbol:

    dotnet tool install -g dotnet-symbol
    
  2. Stáhněte si symboly. Pokud je nainstalovaná verze modulu runtime .NET Core 2.1.0, provedete to takto:

    mkdir mySymbols
    dotnet symbol --symbols --output mySymbols  /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0/lib*.so
    
  3. Zkopírujte symboly na správné místo.

    sudo cp mySymbols/* /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0
    

    Pokud to nejde udělat, protože nemáte přístup k zápisu do příslušného adresáře, můžete použít perf buildid-cache k přidání symbolů.

Potom byste při spuštění perfcollectměli získat symbolické názvy nativních knihoven DLL.

Shromažďování v kontejneru Dockeru

Další informace o tom, jak používat perfcollect v prostředích kontejnerů, najdete v tématu Shromažďování diagnostiky v kontejnerech.

Další informace o možnostech shromažďování

Můžete zadat následující volitelné příznaky pomocí perfcollect, aby lépe vyhovovaly vašim diagnostickým potřebám.

Shromažďování po určitou dobu trvání

Pokud chcete shromáždit stopu, můžete použít možnost -collectsec následovanou číslem určujícím celkový počet sekund, po kterou chcete stopu shromáždit.

Shromažďování tras doby vláken

Specifikování -threadtime pomocí perfcollect vám umožňuje shromažďovat data o využití CPU po jednotlivých vláknech. Díky tomu můžete analyzovat, kde každé vlákno strávilo čas procesoru.

Sběr tras pro výkon spravované paměti a správce paměti

Následující možnosti umožňují konkrétně shromažďovat události GC z modulu runtime.

  • perfcollect collect -gccollectonly

Shromážděte pouze minimální sadu událostí kolekce uvolňování paměti. Toto je nejméně podrobný profil sběru událostí GC s nejmenším dopadem na výkon cílové aplikace. Tento příkaz je podobný PerfView.exe /GCCollectOnly collect příkazu v nástroji PerfView.

  • perfcollect collect -gconly

Shromážděte více podrobných událostí uvolňování paměti pomocí událostí JIT, Loader a Exception. Tato akce vyžaduje více podrobných událostí (například informace o přidělení a informace o připojení ke službě GC) a bude mít větší dopad na výkon cílové aplikace než -gccollectonly možnost. Tento příkaz je podobný PerfView.exe /GCOnly collect příkazu v nástroji PerfView.

  • perfcollect collect -gcwithheap

Shromážděte nejvíce podrobných událostí kolekce uvolňování paměti, které sleduje přežití haldy a pohyby. To poskytuje podrobnou analýzu chování GC, ale bude mít vysoké výkonnostní náklady, protože každý GC může trvat více než dvakrát tak dlouho. Je doporučeno porozumět vlivu použití této možnosti trasování na výkon při jeho použití v produkčních prostředích.