Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här artikeln gäller för: ✔️ .NET Core 2.1 SDK och senare versioner
När prestandaproblem uppstår i Linux kan insamling av en spårning med perfcollect användas för att samla in detaljerad information om vad som hände på datorn vid tidpunkten för prestandaproblemet.
perfcollect är ett bash-skript som använder Linux Trace Toolkit: nästa generation (LTTng) för att samla in händelser skrivna från körtiden eller någon EventSource, samt perf för att samla in CPU-prover från målprocessen.
Förbereda datorn
Följ de här stegen för att förbereda datorn för att samla in en prestandaspårning med perfcollect.
Anmärkning
Om du samlar in inifrån en container måste containern ha rätt funktioner. De minsta nödvändiga funktionerna är PERFMON och SYS_PTRACE. Om avbildningen misslyckas med den minimala uppsättningen lägger du till SYS_ADMIN funktionen i containern. Mer information om hur du spårar program i containrar med PerfCollect finns i Samla in diagnostik i containrar.
Ladda ned
perfcollect.curl -OL https://aka.ms/perfcollectGör skriptet körbart.
chmod +x perfcollectInstallera krav för spårning – det här är de faktiska spårningsbiblioteken.
sudo ./perfcollect installDetta installerar följande krav på datorn:
-
perf: undersystemet för Linux-prestandahändelser och tillhörande program för insamling/visning i användarläge.perfär en del av Linux-kernelkällan, men installeras vanligtvis inte som standard. -
LTTng: Används för att samla in händelsedata som genereras vid körning av CoreCLR. Dessa data används sedan för att analysera beteendet för olika körningskomponenter, till exempel GC, JIT och trådpoolen.
-
De senaste versionerna av .NET Core och Linux-verktyget har stöd för automatisk lösning av metodnamn för ramverkskod.
För att matcha metodnamn för inbyggda körnings-DLL:er (till exempel libcoreclr.so), kommer perfcollect att lösa symboler för dem när den konverterar data, men bara om symbolerna för dessa binärfiler finns. Mer information finns i avsnittet Hämta symboler för det inbyggda körningssystemet.
Samla in en spårning
Ha två tillgängliga gränssnitt – ett för att kontrollera spårning, som kallas [Trace] och ett för att köra programmet, som kallas [App].
[Spårning] Starta samlingen.
sudo ./perfcollect collect sampleTraceFörväntat resultat:
Collection started. Press CTRL+C to stop.Anmärkning
LTTng hade en icke-bakåtkompatibel ändring mellan versionerna 2.12 och 2.13. .NET-körningen stöder för närvarande version 2.12. Om din Linux-distribution har antagit 2.13 eller senare rekommenderar vi att du inaktiverar LTTng-delen av funktionen perfcollect. Om du vill göra detta lägger du till alternativet "-nolttng" på kommandoraden perfcollect och i steg 3 anger du inte DOTNET_EnableEventLog miljövariabeln.
[App] Konfigurera programgränssnittet med följande miljövariabler – detta möjliggör spårningskonfiguration av CoreCLR.
[App] Konfigurera programgränssnittet med följande miljövariabler – detta möjliggör spårningskonfiguration av CoreCLR.
export DOTNET_PerfMapEnabled=1 export DOTNET_EnableEventLog=1Anmärkning
När du kör appen med .NET 7 måste du också ange
DOTNET_EnableWriteXorExecute=0utöver föregående miljövariabler. Till exempel:export DOTNET_EnableWriteXorExecute=0Anmärkning
.NET 6 standardiserar på prefixet
DOTNET_i stället förCOMPlus_för miljövariabler som konfigurerar .NET-körningsbeteende. PrefixetCOMPlus_fortsätter dock att fungera. Om du använder en tidigare version av .NET-körningen bör du fortfarande användaCOMPlus_-prefixet för miljövariabler.[App] Kör appen – låt den köras så länge du behöver för att samla in prestandaproblemet. Den exakta längden kan vara så kort som du behöver så länge den tillräckligt fångar upp tidsperioden där det prestandaproblem som du vill undersöka inträffar.
dotnet run[Spårning] Stoppa samling – tryck på 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.zipDen komprimerade spårningsfilen lagras nu i den aktuella arbetskatalogen.
Visa en spårning
Det finns ett antal alternativ för att visa spårningen som har samlats in. Spårningar visas bäst med PerfView i Windows, men de kan visas direkt i Linux med hjälp av PerfCollect sig själv eller TraceCompass.
Använd PerfCollect för att visa spårningsfilen
Du kan använda själva perfcollect för att visa spårningen som du har samlat in. Använd följande kommando för att göra detta:
./perfcollect view sampleTrace.trace.zip
Som standard visar detta cpu-spårningen av programmet med hjälp av perf.
Om du vill titta på de händelser som har samlats in via LTTngkan du skicka in flaggan -viewer lttng för att se de enskilda händelserna:
./perfcollect view sampleTrace.trace.zip -viewer lttng
Då används babeltrace visningsprogrammet för att skriva ut nyttolasten för händelser:
# [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 }
Använd PerfView för att öppna spårningsfilen
Om du vill se en samlingsvy över både CPU-exemplet och händelserna kan du använda PerfView på en Windows-dator.
Kopiera trace.zip-filen från Linux till en Windows-dator.
Ladda ned PerfView från https://aka.ms/perfview.
Kör PerfView.exe
PerfView.exe <path to trace.zip file>
PerfView visar listan över vyer som stöds baserat på data i spårningsfilen.
- För CPU-undersökningar väljer du CPU-stackar.
- För detaljerad GC-information väljer du GCStats.
- För JIT-information per process/modul/metod väljer du JITStats.
- Om det inte finns någon vy för den information du behöver kan du försöka leta efter händelserna i vyn för råhändelser. Välj Händelser.
Mer information om hur du tolkar vyer i PerfView finns i hjälplänkar i själva vyn, eller från huvudfönstret i PerfView väljer du Hjälp-användarhandbok>.
Anmärkning
Händelser som skrivs via System.Diagnostics.Tracing.EventSource API (inklusive händelser från Framework) visas inte under leverantörens namn. I stället skrivs de som EventSourceEvent händelser under Microsoft-Windows-DotNETRuntime providern och deras nyttolaster är JSON-serialiserade.
Anmärkning
Innan du kör appen som du spårar med perfcollect, ställ in [unknown] /memfd:doublemapper om du observerar DOTNET_EnableWriteXorExecute=0 ramar i metodnamn och anropsstackar.
Använd TraceCompass för att öppna spårningsfilen
Eclipse TraceCompass är ett annat alternativ som du kan använda för att visa spårningarna.
TraceCompass fungerar även på Linux-datorer, så du behöver inte flytta spårningen över till en Windows-dator. Om du vill öppna TraceCompass spårningsfilen måste du packa upp filen.
unzip myTrace.trace.zip
perfcollect sparar LTTng-spårningen som samlas in i ett CTF-filformat i en underkatalog i lttngTrace. Mer specifikt finns CTF-filen i en katalog som ser ut som lttngTrace/auto-20201025-101230\ust\uid\1000\64-bit\.
Du kan öppna CTF-spårningsfilen i TraceCompass genom att välja File -> Open Trace och sedan välja filen metadata.
Mer information finns i TraceCompass dokumentationen.
Hämta symboler för den inbyggda körningen
För det mesta är du intresserad av din egen kod, som perfcollect löser som standard. Ibland är det bra att se vad som händer i .NET-DLL:er (vilket är vad det sista avsnittet handlade om), men ibland är det som händer i de interna runtime-dll:erna (vanligtvis libcoreclr.so) intressant.
perfcollect kommer att avbilda symbolerna för dessa när den konverterar sina data, men bara om symbolerna för dessa inbyggda DLL:er finns (och ligger bredvid det bibliotek de tillhör).
Det finns ett globalt kommando med namnet dotnet-symbol som gör detta. Så här använder du dotnet-symbol för att hämta naturliga runtime-symboler:
Installera
dotnet-symbol:dotnet tool install -g dotnet-symbolLadda ned symbolerna. Om den installerade versionen av .NET Core-körningen är 2.1.0 är kommandot för att göra detta:
mkdir mySymbols dotnet symbol --symbols --output mySymbols /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0/lib*.soKopiera symbolerna till rätt plats.
sudo cp mySymbols/* /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0Om detta inte kan göras eftersom du inte har skrivåtkomst till rätt katalog kan du använda
perf buildid-cacheför att lägga till symbolerna.
Efter detta bör du få symboliska namn för de inbyggda dll:erna när du kör perfcollect.
Samla in i en Docker-container
Mer information om hur du använder perfcollect i containermiljöer finns i Samla in diagnostik i containrar.
Läs mer om samlingsalternativ
Du kan ange följande valfria flaggor med perfcollect för att bättre passa dina diagnostikbehov.
Samla in under en viss tidsperiod
När du vill samla in en spårning under en viss tidsperiod kan du använda -collectsec alternativet följt av ett tal som anger det totala antalet sekunder som en spårning ska samlas in för.
Samla in threadtime-spårningar
Om du anger -threadtime med perfcollect kan du samla in cpu-användningsdata per tråd. På så sätt kan du analysera var varje tråd spenderade sin CPU-tid.
Samla in spårningar för hanterat minne och skräpinsamlingsprestanda
De följande alternativen låter dig specifikt samla in GC-händelser från körmiljön.
perfcollect collect -gccollectonly
Samla endast in en minimal uppsättning GC-samlingshändelser. Det här är den minst utförliga GC-händelseinsamlingsprofilen med den lägsta effekten på målappens prestanda. Det här kommandot motsvarar PerfView.exe /GCCollectOnly collect kommandot i PerfView.
perfcollect collect -gconly
Samla in mer utförliga GC-samlingshändelser med JIT-, Loader- och Exception-händelser. Detta begär mer utförliga händelser (till exempel allokeringsinformation och GC-kopplingsinformation) och har större inverkan på målappens prestanda än -gccollectonly alternativet. Det här kommandot motsvarar PerfView.exe /GCOnly collect kommandot i PerfView.
perfcollect collect -gcwithheap
Samla in de mest utförliga GC-samlingshändelserna, som också spårar heapens överlevnad och rörelser. Detta ger djupgående analys av GC-beteendet men medför höga prestandakostnader eftersom varje GC kan ta mer än två gånger längre tid. Vi rekommenderar att du förstår prestandakonsekvenserna av att använda det här spårningsalternativet när du spårar i produktionsmiljöer.