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.
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
Pomocí těchto kroků připravte počítač na shromažďování trasování výkonu pomocí perfcollect
ná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.
Stáhnout
perfcollect
.curl -OL https://aka.ms/perfcollect
Vytvořte spustitelný skript.
chmod +x perfcollect
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:
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í.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í
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].
[Trasování] Spusťte kolekci.
sudo ./perfcollect collect sampleTrace
Očekávaný výstup:
Collection started. Press CTRL+C to stop.
[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ístoCOMPlus_
proměnných prostředí, které konfigurují chování za běhu .NET. PředponaCOMPlus_
ale bude i nadále fungovat. Pokud používáte předchozí verzi modulu runtime .NET, měli byste stále používat předponuCOMPlus_
pro proměnné prostředí.[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
[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.
Zkopírujte soubor trace.zip z Linuxu do počítače s Windows.
Stáhnout PerfView z https://aka.ms/perfview.
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:
Nainstalujte
dotnet-symbol
:dotnet tool install -g dotnet-symbol
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
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í perfcollect
mě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.