Profiling von PHP mit Xdebug

Oftmals fällt es gar nicht auf. Man entwickelt sein Programm und greift auf Funktionen zurück, die schon seit Dekaden bestens funktionieren. Allerdings stellt man irgendwann fest, daß alles immer langsamer wird. Auf den ersten Blick ist nicht ersichtlich warum es zu diesen Einbußen kommt. Der zweite Blick auf den Profiler zeigt das die vermeintlich robuste Funktion eigentlich langsam ist. Durch mehrmalige Verwendung zwingt es die ganze Applikation in die Knie.
Auch beim tunen hilft’s: PHP ist an vielen Stellen inkonsistent und reagiert entsprechend anders, wie schaut es mit der Geschwindigkeit von Iteratoren zu Schleifen aus – oder array_key_exists zu isset? Hier gibt der Profiler Aufschluss was man am besten vermeidet und was man lieber vermeidet.
Einen guten guten Profiler für PHP kommt von Xdebug (wahrscheinlich auch der einzige). Installiert kriegt man ihn am besten aus dem Distro Repository (z.B. von Ubuntu) oder einfach aus den Sourcen mit phpize && sh configure && make && make install. Nach dem er nicht dauerhaft benötigt kann man ihn mit einem Trigger über die URL aktivieren. Über die Kommandozeile setzt man einfach das entsprechende ini-flag und der Profiler schreibt Valgrind kompatible Ausgabe nach /tmp. Eine Standardkonfiguration für Xdebug schaut demnach folgendermaßen aus:

[xdebug]
xdebug.profiler_enable=0
xdebug.profiler_enable_trigger=1

Trigger Möglichkeiten:

wget http://localhost/myscript.php?XDEBUG_PROFILE=1
php -d xdebug.profiler_enable=On myscript.php

Die Datei (z.B. /tmp/cachegrind.out.24869) kann man mit WinCacheGrind oder KCachegrind einsehen und optimiert entweder anhand der Zeitabläufe oder anhand der Aufrufe. Je nach Menge spart das ordentlich Zeit.
Hier ein Beispiel anhand verschiedener Iterationsmöglichkeiten in PHP:

Der Test ist natürlich nicht objektiv, zeigt aber, daß die vermeintlich gleiche Aufgabe nicht gleich optimal abläuft. Häufig findet man mit dem Profiler dann Funktionen im Code welche gnadenlos vergewaltigt werden (oder für einen anderen Zweck entworfen wurden) – Und das verbrennt dann richtig Zeit!

Marius Hein
Marius Hein
Head of Development

Marius Hein ist schon seit 2003 bei NETWAYS. Er hat hier seine Ausbildung zum Fachinformatiker absolviert, dann als Application Developer gearbeitet und ist nun Leiter der Softwareentwicklung. Ausserdem ist er Mitglied im Icinga Team und verantwortet dort das Icinga Web.

Weekly Snap: RVM, KCachegrind & OSMC Program

25 – 29 July ended the month with tips from the development team, the finalised OSMC program and a little celebration of System Administrator Appreciation Day.
Sebastian introduced Ruby Version Manager (RVM) and how it enables different Ruby and Gem versions to be developed and tested side-by-side for complex projects. He showed how to switch between various versions and their Gems from the multi user installation, by manipulating the “PATH” variable and the ‘rvm use’ command. Installing additional Ruby versions is just as simple with ‘rvm install’, but he noted that development libraries and build tools must be installed beforehand. Sebastian commended RVM’s documentation as a good source of more tips and gave an example of how RVM can be tested once installed.
Keeping to the development efficiency theme, Jannis shared his tip for PHP profiling with KCachegrind to combat performance leakages. He recommended first installing XDebug and then using KCachegrind (or for Macs, QCachegrind) for visual representation. With these two simple tools, it is easy to see how long various methods take (absolute or relative to the execution time) as well as where and how often they are queried.
Last but not least, Pamela announced the program of the 6th Open Source Monitoring Conference on the 29 – 30 November. Featured speakers include: Michael Medin, NSClient++ Developer on “Distributed Monitoring Using NSClient++”, Mike Adolphs, Systems Administrator of XING AG on “Cucumber-Nagios: Behaviour Driven Infrastructure’s Entry into Monitoring” and Jeffrey Lensen, Systems Engineer of Hyves.nl on “Icinga at Hyves.nl”. Beyond two tracks of presentations in English and German, the OSMC will also offer three intensive workshops on “SLA Reporting with Nagios and Icinga”, “Configuration Management with Puppet” and “Icinga Kickstart” on the conference eve. Early bird specials are available till 15 August, so hurry!