Performance van Magento analyseren met Blackfire

Als Magento developer heb je bij ons (op het Hypernode platform) de beschikking over Blackfire, een performance analyse tool. We vroegen Magento developer Fabio Ros om er eens in te duiken: hoe werkt Blackfire, hoe ziet de interface eruit, welke toffe dingen kun je er allemaal mee? En een veel gehoorde vraag van andere developers: hoe verschilt het van andere analyse tools als New Relic? In dit blog zijn bevindingen.

Inhoud:

 

Gastblogger Fabio: 

Over mijzelf

Als 3x certified Magento developer ben ik in tegenstelling tot veel andere developers vaak kort op een project bezig. Ik word meestal ingezet voor specifieke issues daar waar extra kennis of mankracht nodig is. Meestal zijn dit performance of security issues, met hier en daar een stukje maatwerk. Ik zie dus veel verschillende shops met veel verschillende issues waarbij ik regelmatig gebruik maak van analyse tools.

Tot voorkort had ik wel ervaring met Blackfire, maar was ik geen poweruser. Voor dit artikel heb ik de tool daarom wat intensiever ingezet in een wat complexer performance project. Als snel merkte ik dat het vele malen verder gaat dan ik dacht.

Een introductie in Blackfire

Blackfire is een performance analyse tool waarmee de performance van PHP applicaties, en dus ook Magento, gemonitord en verbeterd kan worden. De tool heeft in de basis gelijkenissen met profilers als xDebug en Xhprof. Voor degene die hier ervaring mee hebben zal Blackfire in de eerste instantie dan ook bekend voorkomen.

Blackfire gaat echter een flinke stap verder in usability en biedt daarmee meer toepassingsmogelijkheden met rijkere en concretere info. Zo kan er meer en gemakkelijker worden gewerkt aan bottlenecks en verdere optimalisaties op het gebied van performance.
Belangrijk, want als het gaat om performance in webshops tellen milliseconden al mee in de omzet.

Hoe werkt Blackfire?

Het begint allemaal met een call of probe naar de Blackfire agent die op de achtergrond van de server luistert tot hij wordt opgeroepen. Op basis van de instructies in deze call zal Blackfire zijn “profile” uitvoeren en versturen naar de Blackfire API waar het verwerkt wordt tot een gedetailleerd schematic. Voor de gebruiker is dit maar één klik, via de Blackfire Chrome plugin, of voor de terminal users:

blackfire curl http://mijnshop.nl

Het verkrijgen van profiling informatie is daarbij dan ook binnen handbereik, op production, staging of local, maar net waar je het instelt. Het is dus ook mogelijk om zonder extra configuraties meerdere servers te profilen.

Magento analyseren met Blackfire

Byte Blackfire ChromeHet gebruik van Blackfire is in principe vrij eenvoudig met behulp van de plugin voor Google Chrome. Als je Magento shop bij Hypernode draait staat Blackfire staat al geïnstalleerd op je node. Vanuit veiligheidsoverwegingen moeten zij nog wel even je Client ID & Token van je Blackfire profiel instellen. Via de volgende links ben je zo opgestart.

  1. Installeer de Chrome plugin
  2. Maak een gratis account aan voor Blackfire
  3. Mail de Server ID & Server token die je vervolgens van Blackfire krijgt naar Byte

 

Stap 1: het ophalen van data (profilen):

Wanneer Byte de credentials heeft ingesteld, ben je klaar Byte Blackfire Magento Profilingom te profilen. Ga naar de pagina die je wilt profilen en klik vervolgens op Profile! in de Blackfire Chrome plugin. Afhankelijk van de pagina kan het even duren.

Wanneer de profiler klaar is, zie je de belangrijkste metrics in de zwarte balk:

Byte Blackfire Magento Toolbar

v.l.n.r.:

  • (wall) time: de totale tijd gespendeerd aan het uitvoeren van de code
  • I/O wait: de totale wachttijd van de CPU op I/O operaties
  • CPU time: de tijd die de CPU nodig had om de code uit te voeren
  • Memory: het geheugengebruik dat nodig is bij het uitvoeren van de code
  • Network: verbruikte netwerkresources bij het uitvoeren
  • HTTP: HTTP calls gedurende de uitvoer van de code
  • SQL Queries: aantal query’s en tijd uitgevoerd

Dit geeft je dus in een kort overzicht een globale status mee en of je er dus op moet inzoomen of niet. Indien je op de balk klikt, krijg je de resultaten in detail te zien.

Tip: externe caching zoals Redis of Varnish geven een vervormd of geen resultaat bij het gebruik van Blackfire.

Stap 2: het analyseren van de data

Byte Blackfire Interface

Met de roze omlijningen in de call graph geeft Blackfire aan waar de meeste resources worden verbruikt. Dit noemen ze “Hot paths”. Loop dit na, geleidelijk zouden de percentages moeten afnemen. Indien er opeens een wat grotere stap of een rare vertakking tussen zit, dan heb je je performance issue zo goed als te pakken. De blokken geven geleidelijk aan welke functie, vanuit welke klasse, hoe vaak is aangeroepen.

Ieder blok in de call graph relateert weer aan een functie in de functions / methods list aan de linkerzijde. De metrics zoals in de toolbar zijn ook weer voor iedere functie beschikbaar. De kolommen bevatten “inclusive / exclusive time” die staan voor de hoeveelheid tijd, met of zonder de tijd zoals gespendeerd aan andere functies of methodes. Dit is dus erg handig om op te sorteren.

Ik moet zeggen dat je wel enige kennis nodig hebt van de Magento core functies en methodes om bottlenecks te herkennen. Functies als Varien_Object::getData() en alle SimpleXML functies zie regelmatig terugkomen en het is dus handig om te weten waarvoor ze dienen. Mocht je nieuw zijn met Blackfire, dan raad ik je aan om eens met een “vanilla” demo Magento installatie aan de slag te gaan en de call graphs goed te bestuderen. Zo kun je wat bekender worden met de standaard zaken die zichtbaar zijn in de grafiek.

Data vergelijken van voor en na een update: de compare-functie

 

Byte Blackfire Comparison Toolbar

 

Een van de dingen waarin Blackfire uniek en heel nuttig is, is de mogelijkheid van het vergelijken van output. De resultaten zijn individueel, gebundeld en nog eens per omgeving op te slaan. Zo heb je een heel goed overzicht van de impact van je changes. Dit maakt Blackfire tot een uitstekende tool om in te zetten bij ieder increment.

Handige tips

Tijdens het gebruik van Blackfire deed ik een aantal ervaringen op die ik graag met jullie deel.

.phtml files in de grafiek
Mocht je een .phtml bestand in je grafiek zien die niet origineel van Magento afkomstig is, bekijk dan de code. Mijn ervaring is dat er vaak een “bad code practice” is gebruikt zoals het (onnodig vaak) gebruiken van getModel() in zaken als een foreach loop.

Vergelijk pagina’s van hetzelfde type
Mocht bijvoorbeeld de ene categorie pagina veel langzamer zijn dan de andere, vergelijk de profiles. Je zal vrij snel zien wat deze vertraging veroorzaakt. Wat is het verschil tussen deze pagina’s? Valt het verschil te relateren aan wat er in de vergelijking te zien is?

Blackfire en caching
Blackfire werkt niet met caching vanuit Varnish en zal daarbij een error geven. Het werkt in principe wel met Redis en FPC, maar geeft mogelijk niet de info waar je naar zoekt. Het is daarom raadzaam om Redis caching even uit te zetten als je niet kunt vinden waar je naar zoekt.
Blackfire heeft zelf hele goede documentatie, zeker een aanrader om even doorheen te lopen.

Gave features van Blackfire

Tot zover de basics van Blackfire in het kort. Met vrij weinig effort gewoon goede en gedetailleerde statistieken. Op zowel productie, staging als local. Maar de tool kan nog veel meer. Bij deze nog wat toffe dingen die je met Blackfire kunt doen.

Blackfire profile references

Profile statistieken kunnen worden opgeslagen in een “reference”. Een reference kan meerdere profiles bevatten. Zo trapt het Blackfire curl commando eigenlijk 10x een profile af om de statistieken te generaliseren in een reference. Dit kan 1x of 100x, but you get the point. References kun je bewaren, sharen, metadateren, vergelijken, allerlei zaken die team collaboration bevorderen.

Nog een tip voor de gebruikers van een staging omgeving: compare je productie reference met die van staging mochten zaken niet zo lopen als je had voorspeld. Grote kans dat je identieke omgeving toch niet zo identiek was, Blackfire may tell you.

Ontwikkelen met Blackfire’s SDK

Blackfire heeft zelf ook een PHP SDK beschikbaar. Hiermee kan je dus Blackfire implementeren in eigen tooling of workflows. Denk aan tests met performance vereisten of bijvoorbeeld Magerun commando’s. Zie handleiding.
Mocht je een Blackfire Premium pakket hebben, dan kan je de SDK gebruiken in je tests, met eigen metrics en het vervolgens zelfs integreren in New Relic.

Schrijf scenario’s voor acceptatietests met Blackfire player

De Blackfire player is een mooi voorbeeld van wat mogelijk is met de PHP SDK. De Blackfire player stelt je ertoe in staat scenario’s voor acceptatietests middels een yaml of PHP format uit te schrijven met een relatief simpele syntax. De functie hangt al best een tijd in een Alpha stadia, maar ik zou het graag in een stable versie zien omdat het schrijven van tests dan wat makkelijker wordt voor de minder ervaren developers.
Meer info over Player

Blackfire versus New Relic

Waarin verschilt Blackfire dan echt van New Relic? Grof gezegd is New Relic een service die op de achtergrond draait en non-stop statistieken verzamelt. De mogelijkheden in New Relic zijn eindeloos en de tool is naar mijn mening echt een must-have voor de shops van formaat. Front-end tot back-end, hardware tot software, New Relic kan je er iets over vertellen. Het is wel een complexe tool die ook best wat kennis van zowel software, hardware als netwerkcomponenten vereist.

Dit is even kort door de bocht omdat de mate waarin het ingezet kan worden heel divers is. Het is begrijpelijk dat sommige mensen zich dan ook afvragen wat het nut van Blackfire is tegenover New Relic. Maar hoewel ze inderdaad een zelfde doel voor ogen hebben -namelijk het bieden van handvatten waarmee je je applicatie zo smooth mogelijk kan laten draaien- doen ze dit op een andere manier in andere implementaties. Het is zelfs zo dat New Relic en Blackfire een perfect te integreren combinatie is.

Overhead
Elke tool die op de achtergrond draait, zou in theorie iets van overhead kunnen hebben. Blackfire heeft een overhead die zo goed als onzichtbaar is totdat je het verzoek inschiet iets te profilen. Dit is een verschil met New Relic, dat continu informatie verzamelt en daardoor een grotere footprint heeft. Het voordeel daarvan is echter wel weer dat als er zich onverwacht een incident voor heeft gedaan New Relic het heeft vastgelegd. Blackfire niet, omdat Blackfire alleen jouw verzoek profiled wanneer je erom vraagt.

Proactief versus reactief
New Relic zit meer aan de pro-actieve kant op productie, Blackfire op de re-actieve in elk ontwikkelstadium. Beide geven hele waardevolle insights en zullen een aanwinst zijn voor je business.
Ik zie Blackfire meer als de powertool in mijn gereedschapskist, en New Relic als de tool die de boel in de gaten houdt en registreert en me vertelt wanneer ik ergens met Blackfire op af moet gaan.

Hele breedte versus zoom
Waar New Relic een punt in de shop aantoont dat mijn aandacht vereist, ga ik er met Blackfire op af. New Relic kijkt goed over de gehele breedte, met Blackfire zoom ik in.

Geen concurrenten, maar elkaars aanvulling
Blackfire en New Relic zijn dus geen concurrenten die elkaar overbodig maken, het zijn must-have powertools voor iedere serieuze webshop business.

 

 op

Fabio is een echte Magento developer in hart en nieren. Hij heeft niet alleen 3 Magento certificaten (Solution Specialist, Front End Developer en Developer), maar ook het logo op zijn enkel getatoeëerd en de muren van zijn studio beplakt met 16 m2 Magento mindmap.