Hoe u de prestaties van uw toepassing kunt debuggen

0
190

Applicatieprestaties kunnen voor veel bedrijven een kritiek probleem zijn. De kosten voor serverhosting zijn immers rechtstreeks van invloed op uw bedrijfsresultaten, dus het gebruik van een prestatieprofileringstool om de code die u uitvoert te debuggen, kan u uiteindelijk geld besparen.

Naar welke problemen moet u zoeken

Een “knelpunt” is een langzaam gedeelte van je app dat de rest van de anders snellere code vertraagt, net zoals de dop op een waterfles of een smalle weg die het verkeer hindert. Elke code die je schrijft, heeft waarschijnlijk ergens knelpunten, en of ze nu groot of klein zijn, je kunt prestatieprofileringstools gebruiken om ze te identificeren.

Elk programma is anders, maar veel applicaties zullen last hebben van veel van dezelfde problemen:

  • Functies worden te vaak aangeroepen (waarbij caching of planning het aantal oproepen zou verminderen)
  • IO-blokkeringscode, meestal synchrone schijftoegang, maar ook overmatig geheugengebruik.
  • Grote lussen met dure methoden.
  • Lange opstarttijden, vooral in door JIT gecompileerde talen.
  • Onnodige geheugentoewijzingen, vooral in runtimes met een garbage collector.
  • Gebieden die baat zouden hebben bij parallellisatie of asynchrone programmering.

U moet op een van deze letten bij het onderzoeken van uw code met de profiler. Zelfs als je app geen serieus, duidelijk knelpunt heeft, helpt elke procentuele verbetering je app sneller en efficiënter te werken, en een snelheidsverhoging van een paar procent hier en daar kan in de loop van de tijd veel worden.

Er is ook de mogelijkheid dat uw app niet wordt gehinderd door de code die op de server wordt uitgevoerd, maar door zijn plaats in uw algehele netwerk. Als u bijvoorbeeld een API-toepassing heeft die verbinding maakt met een trage database, maakt het niet uit hoe snel de webserver is, aangezien deze altijd wacht op langzame resultaten. Prestatieprofilers helpen u alleen bij het opsporen van fouten in uw code, niet in uw algehele netwerkarchitectuur.

Hoe werkt profilering?

Hulpprogramma's voor prestatieprofilering verschillen in een aantal opzichten van hulpprogramma's voor foutopsporing. Hulpprogramma's voor foutopsporing, zoals breekpunten en inspectie, worden door IDE's gebruikt voor het testen en oplossen van problemen tijdens de ontwikkeling. Profilers werken meestal in de veronderstelling dat u niet weet wat het probleem is en dat u al uw code wilt profileren om deze te vinden. De profiler haakt in op uw toepassing en gebruikt een zeer nauwkeurige timer om bij te houden welke functies het langst duren. Na een tijdje draaien heb je genoeg gegevens om op te sporen wat het probleem veroorzaakt.

Advertentie

De meeste profilers presenteren gegevens in een stapel, gesorteerd op consumenten die het meeste tijd hebben gehad . Een veelgebruikte grafiek in de meeste profilers is de vlamgrafiek die een intuïtief overzicht van de oproepgeschiedenis van het hele programma weergeeft.

De exacte tool en methode die je gebruikt, is afhankelijk van de taal of runtime waarvoor je profileert en of je applicaties in productieomgevingen moet profileren, maar het algemene idee is hetzelfde.

Omdat elke profiler integraties moet hebben met de code die wordt uitgevoerd, moet u een profiler downloaden voor de taal die uw toepassing gebruikt. Sommige zijn gemakkelijker te gebruiken dan andere, vooral voor talen als C# en Java, waar het gemakkelijker is om in de toepassing te injecteren dan een gecompileerde taal.

Veel IDE's hebben ook ingebouwde profileringstools bovenop de standaard debugging-toolset, die u ook kunt gebruiken. Visual Studio kan bijvoorbeeld prestaties en geheugengebruik in veel apps profileren.

  • Java – JProfiler, IDEA/Eclipse/Netbeans IDE's
  • Python – cProfiler, Palanteer
  • JavaScript – Chrome DevTools
  • C# – dotTrace, Visual Studio IDE
  • C, C++ – Baan 

Als je een idee hebt van wat een tijdje kan duren, kun je altijd een stopwatch-timerbibliotheek gebruiken om benchmarks uit te voeren.

Advertentie

Benchmark.NET kan bijvoorbeeld tests uitvoeren op verschillende functies met een zeer hoge nauwkeurigheid en wordt vaak gebruikt om verschillende algoritmen met elkaar te vergelijken. U kunt ook een eenvoudige stopwatch gebruiken rond de code die u wilt benchmarken.

Een prestatieprofiel gebruiken

Voor deze handleiding laten we zien hoe u dotTrace gebruikt, een prestatieprofiler voor .NET-toepassingen die volledig is uitgerust en beschikt over de meeste tools die u in andere profilers vindt. Tenzij u C#-code profileert, zult u waarschijnlijk een andere toepassing gebruiken, maar het algehele proces zou vergelijkbaar moeten zijn.

Zodra u de app opent, kunt u verbinding maken met actieve .NET-processen of uw eigen runconfiguratie instellen zodat u de app vanuit dotTrace kunt starten. Het starten van de app vanuit de profiler kan met name handig zijn voor het debuggen van langzame opstarttijden.

Zodra u de app uitvoert, begint deze met het verzamelen van gegevens. Je kunt het zo lang uitvoeren als je wilt, druk gewoon op 'Get Snapshot and Wait'. om de analyse voor de verzamelde tijdsperiode te openen.

Als het eenmaal is geopend, ziet u veel grafieken naast de call-stack en call-boom, die er waarschijnlijk onleesbaar uitziet. Als je veel dingen ziet die te maken hebben met threading, locks en wachten, komt dat waarschijnlijk omdat je je moet richten op de “hoofdthread.”

De profiler pikt alle threads op, die vaak worden gebruikt voor achtergrondtaken die lang zullen wachten. Hoewel dit een bewijs kan zijn van problemen met het blokkeren van IO's, ligt het iets genuanceerder dan de profiler doet voorkomen, en het hangt er echt van af wat de thread doet.

dotTrace heeft ook een functie voor het filteren van code op basis van het werkgebied waar het vandaan komt, met behulp van de &#8220 ;Subsystemen” filters aan de linkerkant. Er kan naar systeemcode, native code en andere achterblijvende gebieden zoals reflectie, verzamelingen, strings en LINQ worden gezocht.

Advertentie

In het hoofdvenster vindt u de vlamgrafiek. Dit toont het volledige overzicht van uw toepassing, beginnend bij “Alle oproepen” en het opsplitsen van de tijd die nodig is om elk niveau van functies uit te voeren. Sommige zullen onopgelost zijn, en sommige zullen te klein zijn om hier weer te geven, maar deze grafiek kan worden ingezoomd op elke functie om een ​​nauwkeuriger uitsplitsing voor die call-stack te bekijken.

Een ander belangrijk kenmerk van prestatieprofilers is de oproepstructuur, die een geneste uitsplitsing toont van de meest actieve functies, gesorteerd op tijd het kost ze om uit te voeren. Hier toont dotTrace ook een percentage, dat het deel van de totale tijd vertegenwoordigt dat een bepaalde functie en zijn kinderen in beslag namen.

CPU-tijd doorgebracht in functies is niet altijd het probleem, vooral niet voor een taal als C# met een garbage collector. dotTrace houdt ook geheugengebruik en toewijzingen bij, en kan worden gebruikt om te achterhalen wat onnodige druk op uw GC uitoefent.