Debugging van prestatieproblemen in productie kan lastig zijn en in sommige gevallen zelfs onmogelijk zonder de juiste tools. Java profiling bestaat al heel lang, maar de java profilers waar de meeste ontwikkelaars aan denken zijn maar van één type: standaard JVM profilers.
Het gebruik van één type profiler is echter niet genoeg.
Stel dat je de performance van je applicatie aan het analyseren bent. Er zijn meerdere profileringsactiviteiten die u kunt uitvoeren. Over het algemeen, standaard profilers behandelen geheugen profiling, CPU profiling, en thread profiling.
Maar zelfs met al deze dekking, door een combinatie van meerdere profilers te gebruiken, zult u meer prestatie problemen vinden. Dit komt omdat elke profiler in een bepaald opzicht beter is voor het opsporen van prestatieproblemen.
In dit artikel bespreken we de drie soorten Java-profilers en waarom we ze allemaal nodig hebben tijdens het ontwikkelen van een applicatie. We beginnen met de typen en duiken vervolgens diep in elk van hen.
Laten we eens kijken naar de drie verschillende soorten Java-profilers:
- Standaard JVM-profilers die elk detail van de JVM bijhouden (CPU, thread, geheugen, garbage collection, enzovoort).
- Lichtgewicht profilers die je applicatie belichten met een beetje abstractie.
- Application performance management (APM) tools die worden gebruikt voor het monitoren van applicaties live in productieomgevingen.
Standaard JVM Profilers
Producten zoals VisualVM, JProfiler, YourKit en Java Mission Control.
Een standaard Java profiler levert zeker de meeste gegevens op, maar niet noodzakelijkerwijs de meest bruikbare informatie. Dit hangt af van het type debugging-taak.
JVM-profilers zullen alle methode-aanroepen en geheugengebruik bijhouden. Dit stelt een ontwikkelaar in staat om in de aanroep structuur te duiken vanuit elke hoek die zij kiezen.
Pros:
- Groot voor het opsporen van geheugenlekken, standaard profilers geven een gedetailleerd overzicht van al het geheugengebruik door de JVM en welke klassen/objecten verantwoordelijk zijn. De mogelijkheid om handmatig garbage collection uit te voeren en vervolgens het geheugengebruik te bekijken, kan gemakkelijk de aandacht vestigen op klassen en processen die ten onrechte geheugen vasthouden.
- Goed voor het bijhouden van CPU-gebruik, een Java profiler biedt meestal een CPU sampling functie om CPU-tijd per klasse en methode bij te houden en te aggregeren om te helpen hot spots op te sporen.
Cons:
- Vereist een directe verbinding met de gemonitorde JVM; dit beperkt het gebruik tot ontwikkelomgevingen in de meeste gevallen. (Opmerking: sommige profilers kunnen in beperkte mate thread- en geheugendumps gebruiken.)
- Ze vertragen uw toepassing; er is veel verwerkingskracht nodig voor de hoge mate van detail die wordt geboden.
Lichtgewicht Java Transaction Profilers
Producten zoals XRebel en Stackify Prefix.
Lightweight profilers volgen uw applicatie op een andere manier door zichzelf direct in de code te injecteren.
- Aspect Profilers gebruiken aspect-georiënteerd programmeren (AOP) om code te injecteren in het begin en einde van gespecificeerde methoden. De geïnjecteerde code kan een timer starten en vervolgens de verstreken tijd rapporteren wanneer de methode is voltooid. Deze profilers zijn eenvoudig op te zetten, maar je moet weten wat je wilt profileren. Voor een voorbeeld, zie Spring AOP Method Profiling.
- Java Agent profilers gebruiken de Java Instrumentation API om code in je applicatie te injecteren. Deze methode heeft meer toegang tot uw applicatie omdat de code wordt herschreven op bytecode niveau. Hierdoor kan elke code die in je applicatie draait worden geïnstrumenteerd, zij het code die je zelf hebt geschreven of 3rd-party libraries waar je applicatie van afhankelijk is. Bekijk deze introductie tot Java Agents om te zien hoe dit allemaal werkt.
Aspect profilers zijn vrij eenvoudig op te zetten, maar ze zijn beperkt in wat ze kunnen monitoren en worden gehinderd door het in detail uitwerken van alles wat je wilt dat wordt gevolgd. Java Agents hebben een groot voordeel in hun tracking diepte, maar zijn veel gecompliceerder om te schrijven.
Stackify Prefix is een ontwikkelaar-georiënteerde Java profiler die de Java Agent profiler methode achter de schermen gebruikt.
Het leuke is dat Prefix al weet wat de meest gewenste classes en 3rd party libraries zijn die ontwikkelaars geïnstrumenteerd willen hebben- dus je hoeft ze niet allemaal in detail te beschrijven. Plus, het neemt alle statistieken van de instrumentatie en toont ze in een eenvoudige en begrijpelijke manier.
Als voorbeeld, bij het uitvoeren van een applicatie met behulp van Hibernate, Prefix zal niet alleen de details van de verstreken tijd voor queries, maar toont ook parameterwaarden voor de gegenereerde SQL. Wanneer uw app een SOAP/REST API oproept, geeft Prefix de inhoud van het verzoek en het antwoord weer.
Low Overhead, Java JVM Profiling in Production (APM)
Alle profilers tot nu toe waren geweldig voor ontwikkeling, maar het is van cruciaal belang om bij te houden hoe uw systeem in productie presteert.
Productie is altijd een ander landschap-de ontwikkeling en staging setups hebben meestal niet dezelfde datasets en load.
Java APM tools gebruiken meestal de Java Agent profiler methode, maar met verschillende instrumentatie regels om ze te laten draaien zonder de performance in producties te beïnvloeden. De truc met deze profilers is om de juiste informatie op een slimme manier te leveren zodat ze geen CPU-cycli in beslag nemen.
Stackify’s Retrace is een APM-tool die dezelfde technologie gebruikt als Stackify Prefix met een paar aanpassingen om soepel te draaien in staging- en productieomgevingen.
Dit wordt gedaan door het aggregeren van timingstatistieken en het samplen van traces. Dit geeft je op methode-niveau inzicht in de code van je applicatie die in productie draait.
Dus wanneer je een traag webverzoek hebt, zal dat zich vertalen in een spoor dat in Retrace verschijnt. Van daaruit kunt u in het programma duiken en zien welke methoden de boosdoener zijn.
Retrace Screenshot: Web Request Aggregation over 4 uur
Waarom hebt u alle 3 de profilers voor uw toepassing nodig?
Standaard profilers zijn goed in het vinden van prestatieproblemen in de ontwikkelingsfase. Maar productie is een ander scenario. Het gedrag van uw app kan veranderen op basis van inkomend verkeer, serververzoeken, respons en vele andere zaken.
Dus, wat is de oplossing voor de productieomgeving? APM-tools zijn het antwoord. APM-tools richten zich op de productieomgeving en leveren een rapport over de prestaties van uw app.
Dus, standaard profilers helpen bij de ontwikkeling en APM-tools helpen bij de productie. U vraagt zich misschien af wat de behoefte is aan lichtgewicht transactieprofilers.
Wel, lichtgewicht profilers volgen een andere benadering van code profiling. Ze injecteren zichzelf direct in de code – vooral aan het begin en einde van een methode.
Ze zijn ook gemakkelijk op te zetten en verbruiken relatief minder middelen. Dit is zeer nuttig voor toepassingen die gebruik maken van hardware transactie geheugen. Die toepassingen vragen om verfijnde analyse-tools die precies aangeven welke methode of functie prestatieproblemen veroorzaakt.
Ongetwijfeld kunnen we zeggen dat als je een complexe toepassing ontwikkelt, je alle drie de profilers nodig zult hebben. Elk type profiler heeft een unieke aanpak bij het controleren van een applicatie op prestatieproblemen.
RebelLab’s enquête toonde ook aan dat de meeste bedrijven meerdere code profilers gebruiken voor het vinden van prestatieproblemen in hun applicatie.
Waarom zijn sommige Java Profilers zo duur?
XRebel is een cool hulpmiddel, maar het kost 365 dollar per jaar. Stackify Prefix is gratis en biedt veel van dezelfde functionaliteit.
Het grootste probleem met APM-oplossingen is absoluut hun prijs. Ze zijn van oudsher zo duur dat alleen de grootste ondernemingen zich ze konden veroorloven.
Het heeft weinig zin om ongeveer 100 dollar per maand uit te geven aan een server bij Azure of AWS en vervolgens bijna 200 dollar per maand uit te geven voor een product als New Relic.
Monitoringtools zouden niet meer mogen kosten dan de servers!
Lees meer: APM Pricing Is Now Affordable for All Developers, and Why They Should Care
Wrapping It Up
Nu u meer hebt geleerd over de drie soorten Java code profilers, is het tijd om te beslissen of u ze echt allemaal nodig hebt.
Het antwoord ligt in de aard van uw applicatie.
Als het klein is, zoals het onkostenbeheersysteem van een lokaal bedrijf of een winkel, is profiling heel eenvoudig. Een standaard profiler zal het werk doen.
Als u een webtoepassing ontwikkelt, zoals het volgsysteem van een koeriersbedrijf, kan uw toepassing worden benaderd door duizenden gebruikers. In dat geval heeft u ook APM tools nodig voor de productie omgeving.
Finitief, als uw applicatie voor embedded systemen is, heeft u ze alle drie nodig.
Kies goed, en veel plezier met het ontwikkelen van een applicatie die optimale prestaties levert.