.NET-toepassingen traceren met PerfCollect
Dit artikel is van toepassing op: ✔️ .NET Core 2.1 SDK en latere versies
Wanneer er prestatieproblemen optreden in Linux, kan het verzamelen van een tracering perfcollect
worden gebruikt om gedetailleerde informatie te verzamelen over wat er op de computer is gebeurd op het moment van het prestatieprobleem.
perfcollect
is een bash-script dat gebruikmaakt van Linux Trace Toolkit: volgende generatie (LTTng) voor het verzamelen van gebeurtenissen die zijn geschreven vanuit de runtime of een EventSource, evenals perf voor het verzamelen van CPU-voorbeelden van het doelproces.
Uw machine voorbereiden
Volg deze stappen om uw machine voor te bereiden op het verzamelen van een prestatietracering met perfcollect
.
Notitie
Als u vanuit een container vastlegt, moet uw container over de juiste mogelijkheden beschikken. De minimale vereiste mogelijkheden zijn PERFMON
en SYS_PTRACE
. Als de opname mislukt met de minimale set, voegt u de SYS_ADMIN
mogelijkheid toe aan de container. Zie Diagnostische gegevens verzamelen in containers voor meer informatie over het traceren van toepassingen in containers met behulp van PerfCollect.
Download
perfcollect
.curl -OL https://aka.ms/perfcollect
Maak het uitvoerbare script.
chmod +x perfcollect
Vereisten voor het traceren van installatie: dit zijn de werkelijke traceringsbibliotheken.
sudo ./perfcollect install
Hiermee worden de volgende vereisten op uw computer geïnstalleerd:
perf
: het subsysteem Voor Linux-prestatiegebeurtenissen en de bijbehorende gebruikersmodusverzameling/viewertoepassing.perf
maakt deel uit van de Linux-kernelbron, maar is meestal niet standaard geïnstalleerd.LTTng
: Wordt gebruikt voor het vastleggen van gebeurtenisgegevens die tijdens runtime worden verzonden door CoreCLR. Deze gegevens worden vervolgens gebruikt om het gedrag van verschillende runtimeonderdelen, zoals de GC, JIT en threadpool, te analyseren.
Recente versies van .NET Core en het Linux-hulpprogramma ondersteunen automatische oplossing van methodenamen voor frameworkcode.
Voor het omzetten van methodenamen van systeemeigen runtime-DLL's (zoals libcoreclr.so), perfcollect
worden er symbolen voor omgezet wanneer de gegevens worden geconverteerd, maar alleen als de symbolen voor deze binaire bestanden aanwezig zijn. Zie Symbolen ophalen voor de sectie Native Runtime voor meer informatie.
Een tracering verzamelen
Er zijn twee shells beschikbaar: één voor het beheren van tracering, aangeduid als [Trace], en één voor het uitvoeren van de toepassing, aangeduid als [App].
[Trace] Verzameling starten.
sudo ./perfcollect collect sampleTrace
Verwachte uitvoer:
Collection started. Press CTRL+C to stop.
[App] Stel de toepassingsshell in met de volgende omgevingsvariabelen. Dit maakt traceringsconfiguratie van CoreCLR mogelijk.
export DOTNET_PerfMapEnabled=1 export DOTNET_EnableEventLog=1
Notitie
Bij het uitvoeren van de app met .NET 7 moet u ook naast de voorgaande omgevingsvariabelen instellen
DOTNET_EnableWriteXorExecute=0
. Bijvoorbeeld:export DOTNET_EnableWriteXorExecute=0
Notitie
.NET 6 standaardiseert het voorvoegsel
DOTNET_
in plaats vanCOMPlus_
voor omgevingsvariabelen die .NET-runtimegedrag configureren.COMPlus_
Het voorvoegsel blijft echter werken. Als u een eerdere versie van de .NET-runtime gebruikt, moet u nog steeds hetCOMPlus_
voorvoegsel voor omgevingsvariabelen gebruiken.[App] Voer de app uit: laat deze worden uitgevoerd zolang u dat nodig hebt om het prestatieprobleem vast te leggen. De exacte lengte kan zo kort zijn als u nodig hebt, zolang het voldoende tijdvenster vastlegt waar het prestatieprobleem zich voordoet.
dotnet run
[Trace] Verzameling stoppen - druk op 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
Het gecomprimeerde traceringsbestand wordt nu opgeslagen in de huidige werkmap.
Een trace weergeven
Er zijn een aantal opties voor het weergeven van de tracering die is verzameld. Traceringen kunnen het beste worden bekeken met Behulp van PerfView in Windows, maar ze kunnen rechtstreeks in Linux worden bekeken met behulp van PerfCollect
zichzelf of TraceCompass
.
PerfCollect gebruiken om het traceringsbestand weer te geven
U kunt perfcollect zelf gebruiken om de tracering weer te geven die u hebt verzameld. Gebruik hiervoor de volgende opdracht:
./perfcollect view sampleTrace.trace.zip
Standaard wordt hiermee de CPU-tracering van de toepassing weergegeven met behulp van perf
.
Als u de gebeurtenissen wilt bekijken die zijn verzameld via LTTng
, kunt u de vlag -viewer lttng
doorgeven om de afzonderlijke gebeurtenissen te bekijken:
./perfcollect view sampleTrace.trace.zip -viewer lttng
Hiermee wordt viewer gebruikt babeltrace
om de nettolading van gebeurtenissen af te drukken:
# [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 }
PerfView gebruiken om het traceringsbestand te openen
Als u een geaggregeerde weergave van zowel het CPU-voorbeeld als de gebeurtenissen wilt zien, kunt u op een Windows-computer gebruiken PerfView
.
Kopieer het trace.zip-bestand van Linux naar een Windows-computer.
Download PerfView van https://aka.ms/perfview.
PerfView.exe uitvoeren
PerfView.exe <path to trace.zip file>
PerfView geeft de lijst weer met weergaven die worden ondersteund op basis van de gegevens in het traceringsbestand.
Voor CPU-onderzoek kiest u CPU-stacks.
Kies GCStats voor gedetailleerde GC-informatie.
Voor JIT-gegevens per proces/module/methode kiest u JITStats.
Als er geen weergave is voor de informatie die u nodig hebt, kunt u proberen naar de gebeurtenissen in de weergave onbewerkte gebeurtenissen te zoeken. Kies Gebeurtenissen.
Zie Help-koppelingen in de weergave zelf of in het hoofdvenster in PerfView de Help-gebruikershandleiding> voor meer informatie over het interpreteren van weergaven in PerfView.
Notitie
Gebeurtenissen die zijn geschreven via System.Diagnostics.Tracing.EventSource API (inclusief de gebeurtenissen van Framework) worden niet weergegeven onder de naam van de provider. In plaats daarvan worden ze geschreven als EventSourceEvent
gebeurtenissen onder Microsoft-Windows-DotNETRuntime
provider en hun nettoladingen worden JSON geserialiseerd.
Notitie
Als u frames in methodenamen en callstacks ziet [unknown] /memfd:doublemapper
, stelt u deze in DOTNET_EnableWriteXorExecute=0
voordat u de app uitvoert die u traceert met perfcollect.
TraceCompass gebruiken om het traceringsbestand te openen
Eclipse TraceCompass is een andere optie die u kunt gebruiken om de traceringen weer te geven. TraceCompass
werkt ook op Linux-machines, dus u hoeft uw tracering niet naar een Windows-computer te verplaatsen. Als u het traceringsbestand wilt openen TraceCompass
, moet u het bestand uitpakken.
unzip myTrace.trace.zip
perfcollect
slaat de LTTng-tracering op die wordt verzameld in een CTF-bestandsindeling in een submap in de lttngTrace
. Het CTF-bestand bevindt zich in een map die er als lttngTrace/auto-20201025-101230\ust\uid\1000\64-bit\
volgt uitziet.
U kunt het CTF-traceringsbestand openen TraceCompass
door het metadata
bestand te File -> Open Trace
selecteren en te selecteren.
Raadpleeg de documentatie voor TraceCompass
meer informatie.
Symbolen ophalen voor de systeemeigen runtime
Meestal bent u geïnteresseerd in uw eigen code, wat perfcollect
standaard wordt omgezet. Soms is het handig om te zien wat er gebeurt in de .NET-DLL's (wat de laatste sectie was), maar soms wat er gebeurt in de systeemeigen runtime-DLL's (meestal libcoreclr.so), is interessant. perfcollect
hiermee worden de symbolen voor deze omgezet wanneer de gegevens worden geconverteerd, maar alleen als de symbolen voor deze systeemeigen DLL's aanwezig zijn (en zich naast de bibliotheek bevinden waarvoor ze zijn).
Er is een algemene opdracht met de naam dotnet-symbol dat dit doet. Een dotnet-symbool gebruiken om systeemeigen runtimesymbolen op te halen:
dotnet-symbol
installeren:dotnet tool install -g dotnet-symbol
Download de symbolen. Als uw geïnstalleerde versie van de .NET Core-runtime 2.1.0 is, is dit de volgende opdracht:
mkdir mySymbols dotnet symbol --symbols --output mySymbols /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0/lib*.so
Kopieer de symbolen naar de juiste plaats.
sudo cp mySymbols/* /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0
Als dit niet mogelijk is omdat u geen schrijftoegang tot de juiste map hebt, kunt
perf buildid-cache
u de symbolen toevoegen.
Hierna krijgt u symbolische namen voor de systeemeigen dll's wanneer u deze uitvoert perfcollect
.
Verzamelen in een Docker-container
Zie Diagnostische gegevens verzamelen in containers voor meer informatie over het gebruik perfcollect
in containeromgevingen.
Meer informatie over verzamelingsopties
U kunt de volgende optionele vlaggen opgeven om perfcollect
beter aan uw diagnostische behoeften te voldoen.
Verzamelen voor een specifieke duur
Wanneer u een tracering voor een specifieke duur wilt verzamelen, kunt -collectsec
u de optie gebruiken, gevolgd door een getal dat het totale aantal seconden opgeeft waarop een tracering moet worden verzameld.
Threadtime-traceringen verzamelen
-threadtime
Als u dit opgeeft, perfcollect
kunt u cpu-gebruiksgegevens per thread verzamelen. Hiermee kunt u analyseren waar elke thread de CPU-tijd doorbracht.
Traceringen verzamelen voor prestaties van beheerde geheugen- en garbagecollector
Met de volgende opties kunt u specifiek de GC-gebeurtenissen van de runtime verzamelen.
perfcollect collect -gccollectonly
Verzamel slechts een minimale set GC-verzamelingsevenementen. Dit is het minst uitgebreide GC-gebeurtenisverzamelingsprofiel met de laagste impact op de prestaties van de doel-app. Deze opdracht is vergelijkbaar met PerfView.exe /GCCollectOnly collect
de opdracht in PerfView.
perfcollect collect -gconly
Verzamel uitgebreidere GC-verzamelingsevenementen met JIT-, Loader- en Uitzonderingsevenementen. Dit vraagt om uitgebreidere gebeurtenissen (zoals de toewijzingsgegevens en informatie over GC-deelname) en heeft meer invloed op de prestaties van de doel-app dan -gccollectonly
de optie. Deze opdracht is vergelijkbaar met PerfView.exe /GCOnly collect
de opdracht in PerfView.
perfcollect collect -gcwithheap
Verzamel de meest uitgebreide GC-verzamelingsevenementen, die ook de overleving en bewegingen van de heap bijhoudt. Dit geeft een diepgaande analyse van het GC-gedrag, maar leidt tot hoge prestatiekosten, omdat elke GC meer dan twee keer langer kan duren. Het is raadzaam om inzicht te hebben in de prestaties van het gebruik van deze traceringsoptie bij het traceren in productieomgevingen.