Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Dit artikel is van toepassing op: ✔️ .NET Core 2.1 SDK en latere versies
Het verzamelen van een tracering met perfcollect kan worden gebruikt om gedetailleerde informatie te verzamelen over wat er op de machine is gebeurd ten tijde van het prestatieprobleem wanneer er prestatieproblemen optreden op Linux.
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 prestatieanalyse met perfcollect.
Opmerking
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.
Downloaden
perfcollect.curl -OL https://aka.ms/perfcollectMaak het uitvoerbare script.
chmod +x perfcollectInstallatievereisten voor tracering: dit zijn de feitelijke traceringsbibliotheken.
sudo ./perfcollect installHiermee worden de volgende vereisten op uw computer geïnstalleerd:
-
perf: het Linux-prestatiegebeurtenissen-subsysteem en de bijbehorende gebruikersmodusapplicatie voor verzameling en weergave.perfmaakt deel uit van de Linux-kernelbron, maar is meestal niet standaard geïnstalleerd. -
LTTng: Wordt gebruikt voor het vastleggen van gebeurtenisgegevens die tijdens runtime door CoreCLR worden verzonden. 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) zal perfcollect symbolen voor deze DLL's vinden wanneer de gegevens worden geconverteerd, maar alleen als de symbolen voor deze binaire bestanden beschikbaar zijn. Zie Symbolen ophalen voor de sectie Native Runtime voor meer informatie.
Een tracé 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 sampleTraceVerwachte uitvoer:
Collection started. Press CTRL+C to stop.Opmerking
LTTng had een belangrijke wijziging tussen versie 2.12 en 2.13. De .NET-runtime ondersteunt momenteel versie 2.12. Als uw Linux-distributie 2.13 of hoger heeft aangenomen, raden we u aan het LTTng-gedeelte van de functionaliteit perfcollect uit te schakelen. Hiervoor voegt u de optie '-nolttng' toe aan de opdrachtregel perfcollect en stelt u in stap 3 de omgevingsvariabele DOTNET_EnableEventLog niet in.
[App] Stel de toepassingsshell in met de volgende omgevingsvariabelen. Dit maakt traceringsconfiguratie van CoreCLR mogelijk.
[App] Stel de toepassingsshell in met de volgende omgevingsvariabelen. Dit maakt traceringsconfiguratie van CoreCLR mogelijk.
export DOTNET_PerfMapEnabled=1 export DOTNET_EnableEventLog=1Opmerking
Bij het uitvoeren van de app met .NET 7 moet u ook naast de voorgaande omgevingsvariabelen instellen
DOTNET_EnableWriteXorExecute=0. Voorbeeld:export DOTNET_EnableWriteXorExecute=0[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.zipHet gecomprimeerde traceringsbestand wordt nu opgeslagen in de huidige werkmap.
Een trace weergeven
Er zijn een aantal opties voor het weergeven van de trace die is verzameld. Traceringen kunnen het beste worden bekeken met PerfView op Windows, maar ze kunnen rechtstreeks op Linux worden bekeken met PerfCollect 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 de babeltrace viewer gebruikt om de inhoud van de 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 de PerfView van https://aka.ms/perfview.
Voer PerfView.exe uit
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 te zoeken naar gebeurtenissen in de weergave voor onbewerkte gebeurtenissen. Kies Gebeurtenissen.
Zie voor meer informatie over het interpreteren van weergaven in PerfView, de Help-koppelingen in de weergave zelf, of kies in het hoofdvenster van PerfView voor Help-gebruikershandleiding>.
Opmerking
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 payloads worden JSON geserialiseerd.
Opmerking
Als u [unknown] /memfd:doublemapper frames in methodenamen en callstacks ziet, stelt u DOTNET_EnableWriteXorExecute=0 in 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. Om uw traceringsbestand TraceCompass te openen, moet u het bestand uitpakken.
unzip myTrace.trace.zip
perfcollect slaat de verzamelde LTTng-trace op in het CTF-bestandsformaat in een submap binnen de lttngTrace. Het CTF-bestand bevindt zich in een map die er als lttngTrace/auto-20201025-101230\ust\uid\1000\64-bit\ uitziet.
U kunt het CTF-traceringsbestand openen in TraceCompass door File -> Open Trace te selecteren en het metadata bestand te kiezen.
Raadpleeg de documentatie voorTraceCompass meer informatie.
Symbolen ophalen voor de systeemeigen runtime
Meestal bent u geïnteresseerd in uw eigen code, die perfcollect automatisch wordt opgelost. 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-symbolinstalleren:dotnet tool install -g dotnet-symbolDownload 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*.soKopieer de symbolen naar de juiste plaats.
sudo cp mySymbols/* /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0Als dit niet mogelijk is omdat u geen schrijftoegang tot de juiste map hebt, kunt u
perf buildid-cachegebruiken om de symbolen toe te voegen.
Hierna krijgt u symbolische namen voor de systeemeigen dll's wanneer u deze uitvoert perfcollect.
Verzamelen in een Docker-container
Zie perfcollect voor meer informatie over het gebruik in containeromgevingen.
Meer informatie over verzamelingsopties
U kunt de volgende optionele vlaggen opgeven met perfcollect om 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
Het opgeven van -threadtime met perfcollect stelt u in staat om CPU-gebruiksgegevens per thread te verzamelen. Hiermee kunt u analyseren waar elke thread de CPU-tijd doorbracht.
Traceringen verzamelen voor de prestaties van het beheerde geheugen en de prestaties van de vuilnisopruimer.
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 doelapplicatie. Deze opdracht is vergelijkbaar met PerfView.exe /GCCollectOnly collect de opdracht in PerfView.
perfcollect collect -gconly
Verzamel meer gedetailleerde gebeurtenissen van de GC-verzameling, inclusief JIT, Loader en exceptions-gebeurtenissen. 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.