Sdílet prostřednictvím


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

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

Když v Linuxu dojde k problémům s výkonem perfcollect , můžete shromažďování trasování použít ke shromažďování podrobných informací o tom, co se děje na počítači v době problému s výkonem.

perfcollectje 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

Pomocí těchto kroků připravte počítač na shromažďování trasování výkonu pomocí perfcollectnástroje .

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 do SYS_ADMIN kontejneru funkci. 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. Požadavky na trasování instalace – jedná se o skutečné 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á kolekce/prohlížeč uživatelského režimu. perf je součástí zdroje jádra Linuxu, ale obvykle se nenainstaluje ve výchozím nastavení.

    2. LTTng: Používá se k zaznamenání dat událostí vygenerovaných za běhu nástrojem 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 překladu názvů metod nativních knihoven DLL modulu runtime (například libcoreclr.so) perfcollect se pro ně při převodu dat přeloží symboly, ale pouze pokud jsou k dispozici symboly těchto binárních souborů. Podrobnosti najdete v části Získání symbolů pro nativní modul runtime .

Shromáždění trasování

  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í] Spusťte kolekci.

    sudo ./perfcollect collect sampleTrace
    

    Očekávaný výstup:

    Collection started.  Press CTRL+C to stop.
    
  3. [Aplikace] Nastavte prostředí aplikace s následujícími proměnnými prostředí – to umožňuje 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í. Příklad:

    export DOTNET_EnableWriteXorExecute=0
    

    Poznámka:

    .NET 6 standardizuje předponu DOTNET_ místo COMPlus_ proměnných prostředí, které konfigurují chování za běhu .NET. Předpona COMPlus_ ale bude i nadále fungovat. Pokud používáte předchozí verzi modulu runtime .NET, měli byste stále používat předponu COMPlus_ pro proměnné prostředí.

  4. [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
    
  5. [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.

Zobrazení trasování

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

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

Pomocí nástroje Perfcollect můžete zobrazit trasování, které 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

Pomocí prohlížeče vytisknete babeltrace datovou část 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. Spuštění 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 šetření procesoru zvolte zásobníky procesoru.

  • Podrobné informace 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, naleznete odkazy nápovědy v samotném zobrazení nebo z hlavního okna v nástroji PerfView, zvolte Průvodce pro uživatele nápovědy>.

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ží trasování LTTng, které se shromáždilo 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ískání symbolů pro nativní modul runtime

Ve většině případů vás zajímá vlastní kód, který perfcollect se ve výchozím nastavení 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í symbolu dotnet-symbol k získání nativních symbolů modulu runtime:

  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í

Pokud chcete lépe vyhovovat vašim diagnostickým perfcollect potřebám, můžete zadat následující volitelné příznaky.

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

Pokud chcete shromáždit trasování po určitou dobu, můžete použít -collectsec možnost následovanou číslem určujícím celkový počet sekund, pro které chcete trasování shromáždit.

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

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

Shromažďování trasování pro výkon spravované paměti a uvolňování 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 shromažďování událostí uvolňování paměti s nejnižší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 další podrobné události kolekce 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é náklady na výkon, protože každý GC může trvat déle než dvakrát déle. Při trasování v produkčních prostředích se doporučuje porozumět tomu, že se tato možnost trasování týká výkonu.