.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.

  1. Download perfcollect.

    curl -OL https://aka.ms/perfcollect
    
  2. Maak het uitvoerbare script.

    chmod +x perfcollect
    
  3. Vereisten voor het traceren van installatie: dit zijn de werkelijke traceringsbibliotheken.

    sudo ./perfcollect install
    

    Hiermee worden de volgende vereisten op uw computer geïnstalleerd:

    1. 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.

    2. 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

  1. 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].

  2. [Trace] Verzameling starten.

    sudo ./perfcollect collect sampleTrace
    

    Verwachte uitvoer:

    Collection started.  Press CTRL+C to stop.
    
  3. [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 van COMPlus_ 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 het COMPlus_ voorvoegsel voor omgevingsvariabelen gebruiken.

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

  1. Kopieer het trace.zip-bestand van Linux naar een Windows-computer.

  2. Download PerfView van https://aka.ms/perfview.

  3. 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:

  1. dotnet-symbol installeren:

    dotnet tool install -g dotnet-symbol
    
  2. 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
    
  3. 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.