Application Insights Profiler voor .NET-gegevens weergeven
Stel dat u een webprestatietest uitvoert. U hebt traceringen nodig om te begrijpen hoe uw web-app wordt uitgevoerd onder belasting. In dit artikel gaat u het volgende doen:
- Genereer verkeer naar uw web-app door een webprestatietest te starten of een Profiler on-demand sessie te starten.
- Bekijk de Profiler-traceringen na uw belastingtest of Profiler-sessie.
- Meer informatie over het lezen van de Profiler-prestatiegegevens en de aanroepstack.
Verkeer genereren naar uw Azure-service
Voor het uploaden van traceringen door .NET Profiler moet uw service aanvragen actief verwerken.
Als u de Profiler voor .NET zojuist hebt ingeschakeld, voert u een korte belastingtest uit met Azure Load Testing.
Als uw Azure-service al inkomend verkeer heeft of als u alleen handmatig verkeer wilt genereren, slaat u de belastingstest over en start u een Profiler-sessie op aanvraag:
Selecteer op de overzichtspagina van Application Insights voor uw Azure-service de optie Prestaties in het linkermenu.
Selecteer Profiler in het deelvenster Prestaties in het bovenste menu voor Profiler-instellingen.
Zodra de pagina Profiler-instellingen is geladen, selecteert u Profiel nu.
Traceringen weergeven
Nadat de Profiler-sessies zijn uitgevoerd, gaat u terug naar het deelvenster Prestaties .
Selecteer onder Inzoomen...Profiler-traceringen om de traceringen weer te geven.
De trace explorer geeft de volgende informatie weer:
Filteren | Beschrijving |
---|---|
Profielstructuur v. Vlamgrafiek | Bekijk de traceringen als een structuur of in grafiekvorm. |
Dynamisch pad | Selecteer dit om het grootste leaf-knooppunt te openen. In de meeste gevallen is dit knooppunt bijna een knelpunt in de prestaties. |
Frameworkafhankelijkheden | Selecteer deze optie om elk van de traceringsframeworkafhankelijkheden weer te geven die zijn gekoppeld aan de traceringen. |
Gebeurtenissen verbergen | Typ tekenreeksen die u wilt verbergen in de traceringsweergave. Selecteer Voorgestelde gebeurtenissen voor suggesties. |
Gebeurtenis | Naam van gebeurtenis of functie. De structuur bevat een combinatie van code en gebeurtenissen die zijn opgetreden, zoals SQL- en HTTP-gebeurtenissen. De belangrijkste gebeurtenis vertegenwoordigt de totale duur van de aanvraag. |
Module | De module waar de traceringsgebeurtenis of -functie heeft plaatsgevonden. |
Threadtijd | Het tijdsinterval tussen het begin van de bewerking en het einde van de bewerking. |
Tijdlijn | Het tijdstip waarop de functie of gebeurtenis werd uitgevoerd ten opzichte van andere functies. |
Prestatiegegevens lezen
De .NET Profiler maakt gebruik van een combinatie van samplingmethoden en instrumentatie om de prestaties van uw toepassing te analyseren. Tijdens het uitvoeren van een gedetailleerde verzameling, de .NET Profiler:
- Steekt de instructiepointer van elke machine-CPU elke milliseconde uit.
- Elk voorbeeld legt de volledige aanroepstack van de thread vast, waardoor gedetailleerde informatie wordt gegeven op zowel hoge als lage abstractieniveaus.
- Verzamelt gebeurtenissen om correlatie en causaliteit van activiteiten bij te houden, waaronder:
- Gebeurtenissen voor het schakelen tussen contexten
- TPL-gebeurtenissen (Task Parallel Library)
- Threadgroepgebeurtenissen
De aanroepstack die in de tijdlijnweergave wordt weergegeven, is het resultaat van de steekproeven en instrumentatie. Omdat elk voorbeeld de volledige aanroepstack van de thread vastlegt, bevat het code van Microsoft .NET Framework en andere frameworks waarnaar u verwijst.
Objecttoewijzing (clr! JIT_New of clr! JIT_Newarr1)
Clr! JIT_New en clr! JIT_Newarr1 zijn helperfuncties in .NET Framework die geheugen toewijzen vanuit een beheerde heap.
- Clr! JIT_New wordt aangeroepen wanneer een object wordt toegewezen.
- Clr! JIT_Newarr1 wordt aangeroepen wanneer een objectmatrix wordt toegewezen.
Deze twee functies werken meestal snel. Als clr! JIT_New of clr! JIT_Newarr1 tijd in beslag nemen in uw tijdlijn, kan de code veel objecten toewijzen en aanzienlijke hoeveelheden geheugen verbruiken.
Code laden (clr! ThePreStub)
Clr! ThePreStub is een helperfunctie in .NET Framework waarmee de code wordt voorbereid voor de eerste uitvoering, die meestal JIT-compilatie (Just-In-Time) bevat. Voor elke C#-methode, clr! DePreStub moet maximaal één keer tijdens een proces worden aangeroepen.
Als clr! ThePreStub kost extra tijd voor een aanvraag, het is de eerste aanvraag om die methode uit te voeren. De .NET Framework-runtime kost veel tijd om de eerste methode te laden. Overweeg het volgende:
- Met behulp van een opwarmproces dat dat gedeelte van de code uitvoert voordat uw gebruikers er toegang toe hebben.
- Systeemeigen installatiekopieëngenerator (ngen.exe) uitvoeren op uw assembly's.
Conflicten vergrendelen (clr! JITutil_MonContention of clr! JITutil_MonEnterWorker)
Clr! JITutil_MonContention of clr! JITutil_MonEnterWorker geeft aan dat de huidige thread wacht tot er een vergrendeling wordt vrijgegeven. Deze tekst wordt vaak weergegeven wanneer u:
- Een C# LOCK-instructie uitvoeren,
- Roep de methode Monitor.Enter aan of
- Roep een methode aan met het kenmerk MethodImplOptions.Syncd .
Vergrendelingsconflicten treden meestal op wanneer thread A een vergrendeling verkrijgt en thread B probeert dezelfde vergrendeling te verkrijgen voordat thread A het loslaat.
Code laden ([KOUD])
Als de .NET Framework-runtime voor het eerst niet-geoptimaliseerde code uitvoert, bevat de methodenaam [COLD]:
mscorlib.ni![COLD]System.Reflection.CustomAttribute.IsDefined
Voor elke methode moet deze maximaal één keer tijdens het proces worden weergegeven.
Als het laden van code een aanzienlijke hoeveelheid tijd kost voor een aanvraag, wordt het initiëren van het niet-geoptimaliseerde gedeelte van de methode uitgevoerd door de aanvraag. Overweeg het gebruik van een opwarmproces dat dat gedeelte van de code uitvoert voordat uw gebruikers er toegang toe hebben.
HTTP-aanvraag verzenden
Methoden zoals HttpClient.Send geven aan dat de code wacht totdat een HTTP-aanvraag is voltooid.
Databasebewerking
Methoden zoals SqlCommand.Execute geven aan dat de code wacht tot een databasebewerking is voltooid.
Wachten (AWAIT_TIME)
AWAIT_TIME geeft aan dat de code wacht tot een andere taak is voltooid. Deze vertraging treedt op met de C# AWAIT-instructie . Wanneer de code een C# AWAIT doet:
- De thread ontspant en retourneert de controle naar de threadpool.
- Er is geen geblokkeerde thread die wacht totdat de AWAIT is voltooid.
Logisch gezien is de thread die de AWAIT heeft uitgevoerd echter 'geblokkeerd', wachtend tot de bewerking is voltooid. De instructie AWAIT_TIME geeft de geblokkeerde tijd aan en wacht tot de taak is voltooid.
Als de AWAIT_TIME in frameworkcode lijkt te staan in plaats van uw code, kan de .NET Profiler het volgende weergeven:
- De frameworkcode die wordt gebruikt om de AWAIT uit te voeren
- Code die wordt gebruikt voor het vastleggen van telemetriegegevens over de AWAIT
U kunt het selectievakje Framework-afhankelijkheden boven aan de pagina uitschakelen om alleen uw code weer te geven en het gemakkelijker te maken om te zien waar de AWAIT vandaan komt.
Geblokkeerde tijd
BLOCKED_TIME geeft aan dat de code wacht tot een andere resource beschikbaar is. Het kan bijvoorbeeld wachten op:
- Een synchronisatieobject
- Een thread die beschikbaar moet zijn
- Een aanvraag om te voltooien
Niet-beheerde Asynchroon
Om asynchrone aanroepen te kunnen bijhouden in threads, verzendt .NET Framework ETW-gebeurtenissen en geeft activiteit-id's door tussen threads. Omdat niet-beheerde (systeemeigen) code en sommige oudere stijlen van asynchrone code deze gebeurtenissen en activiteit-id's ontbreken, kan de .NET Profiler de thread en functies die op de thread worden uitgevoerd, niet bijhouden. Dit item heeft het label Unmanaged Async in de aanroepstack. Download het ETW-bestand om PerfView te gebruiken voor meer inzicht.
CPU-tijd
De CPU is bezig met het uitvoeren van de instructies.
Schijftijd
De toepassing voert schijfbewerkingen uit.
Netwerktijd
De toepassing voert netwerkbewerkingen uit.
Wanneer kolom
De kolom Wanneer is een visualisatie van de verschillende inclusieve voorbeelden die gedurende een bepaalde periode voor een knooppunt zijn verzameld. Het totale bereik van de aanvraag is onderverdeeld in 32 tijdsbuckets, waarbij de inclusieve voorbeelden van het knooppunt zich verzamelen. Elke bucket wordt weergegeven als een balk. De hoogte van de balk vertegenwoordigt een geschaalde waarde. Voor de volgende knooppunten vertegenwoordigt de balk het verbruik van een van de resources tijdens de bucket:
- Knooppunten die zijn gemarkeerd CPU_TIME of BLOCKED_TIME.
- Knooppunten met een duidelijke relatie tot het gebruik van een resource (bijvoorbeeld een CPU, schijf of thread).
Voor deze metrische gegevens kunt u een waarde van meer dan 100% verkrijgen door meerdere resources te gebruiken. Als u bijvoorbeeld twee CPU's gebruikt tijdens een interval, krijgt u gemiddeld 200%.
Volgende stappen
Meer informatie over...