Een gemiddelde webapplicatie is groot, bestaande uit honderden of duizenden klassen, tientallen libraries en tientallen tot zelfs honderden configuratie bestanden. Verder is een webapplicatie per definitie een multi-user systeem: meerdere gebruikers zitten tegelijk op het systeem. Aan een dergelijke applicatie worden naast functionele eisen ook niet-functionele eisen gesteld zoals response tijd, schaalbaarheid, beschikbaarheid, enz.
Wanneer een applicatie niet voldoet aan deze eisen moet dus de oorzaak daarvan gevonden worden. Verder kunnen ook allerlei fouten ontstaan wanneer de druk op het systeem (aantal gebruikers) verhoogd wordt. De problemen kunnen vele oorzaken hebben. Wanneer de oorzaak in de applicatie zelf zit, moet de code geanalyseerd worden. Als je dit ‘met de hand’ doet, is het haast onmogelijk de oorzaak te lokaliseren.
Een profiler kan hierbij helpen. Een dergelijke tool registreert ‘het gedrag’ van de applicatie in termen van geheugengebruik, CPU gebruik en multi-threading. Als je deze resultaten analyseert – in plaats van direct de code zelf – kunnen veel knelpunten snel gevonden worden. Vervolgens pas je de code aan en profile je weer de applicatie. Deze manier van fouten opsporen en oplossen bespaart je heel erg veel tijd.
In 2007 hebben we de performance van een webapplicatie geanalyseerd. Deze applicatie kende twee belangrijke problemen: de performance was niet goed genoeg en de applicatie raakte soms in een deadlock wanneer de druk heel hoog werd.
Om deze problemen op te lossen wilden wij een profiler gebruiken, en omdat het hier om een Java applicatie ging, moesten wij een java profiler hebben. We hebben 3 tools vergeleken: JProfiler 5.1, JProbe 7.0 en YourKit 7.0. Hiervoor hebben wij een scoringsmatrix opgesteld voor de eigenschappen die wij belangrijk vinden:
- documentatie;
- CPU en geheugen profiling;
- thread profiling;
- IDE integratie;
- remote en automated profiling;
- gebruiksvriendelijkheid.
De verschillen tussen de tools waren niet groot qua functionaliteit. We hebben uiteindelijk voor JProfiler gekozen omdat de thread profiling daarvan erg krachtig is (problemen met threads zijn zeer moeilijk te vinden), CPU profiling real time is en het gebruik zeer intuïtief is.
Het eerste probleem (onvoldoende performance) was met gebruik van de profiler heel snel opgelost. Het bleek dat het verwerken van de request prima ging, maar dat het tonen van een pagina veel tijd in beslag nam. Dit was op zich al verrassend. Door twee kleine aanpassingen in de code werd het tonen van een pagina aanzienlijk versneld. De overall performance werd daardoor verbeterd met 40%. Dit nam één dag werk in beslag! Als we dit ‘met de hand’ hadden moeten doen, waren we waarschijnlijk meer dan een week bezig geweest.
Het tweede probleem (de deadlock) was aanzienlijk lastiger te vinden en op te lossen. Het probleem had te maken met objecten die onder hoge druk, en binnen een recursief algoritme, soms op elkaar gingen wachten en een deadlock veroorzaakten. Het vinden van de oorzaak van het probleem had zonder profiler waarschijnlijk weken werk gekost. Met de profiler waren wij in 2,5 dag klaar!
Een profiler lost het probleem niet op, maar lokaliseert het. In applicaties is vaak het vinden van de oorzaak 90% van de oplossing. Daarom vinden wij dat een profiler een absolute noodzaak is voor een ontwikkelaar. Een profiler bewijst zijn waarde keer op keer. De kosten van een profiler zijn met het oplossen van één probleem vaak al terugverdiend.