Heute möchte ich euch wieder ein Tool vorstellen, mit dem man die Performance seiner PHP Anwendung testen kann bzw. die Performance-Engpässe in der Anwendung aufspüren kann. Xdebug wird von vielen als Debugger in der Entwicklungsphase genutzt, bietet aber auch einen Profiler. Viele kennen Profiler nur aus Kriminalserien im Fernsehen, aber ein Entwickler sollte damit auch ein Tool zur Performance-Analyse von Anwendungen in Verbindung bringen. Profiler aus dem Fernsehen erzeugen Täterprofile anhand von operativen Analysen, ähnliches macht ein Software-Profiler auch, er erzeugt Softwareprofile anhand operativer Analysen.
Die Funktionsweise eines Profilers lässt sich am besten anhand eines Beispiels/Tutorials erklären. Also fangen wir an:
Unter Ubuntu lässt sich Xdebug sehr einfach installieren:
sudo apt-get install php5-xdebug
Danach ist Xdebug installiert und automatisch aktiviert, nun müssen wir nur noch den Profiler in der php.ini aktivieren. Wenn man den Profiler in der globalen php.ini aktiviert, wird jedes ausgeführt PHP Skript aufgezeichnet, deshalb kann es sinnvoll sein, die Einstellung in einer htaccess oder lokalen php.ini zu setzen, oder die Einstellung xdebug.profiler_enable_trigger zu nutzen. Da ich auf einem Testserver Arbeite, aktiviere ich den Profiler in der globalen php.ini (folgendes in der php.ini hinzufügen):
xdebug.profiler_enable=1 xdebug.profiler_output_dir="/tmp/xdebug" xdebug.profiler_output_name="trace%s"
Mit den Einstellungen haben wir den Profiler aktiviert, danach müssen wir natürlich den Apache neustarten (evtl. reicht auch ein reload):
sudo /etc/init.d/apache2 restart
Jetzt müssen wir nur noch eine Seite (natürlich von dem konfigurierten Server) im Browser öffnen und das Profiling beginnt. Nach dem Aufruf finden wir in dem oben angegebenen Verzeichnis ein Datei mit dem Namen der eben Aufgerufenen Seite (trace_name_der_datei).
Den Inhalt der Datei muss man natürlich nicht Zeile für Zeile lesen und einen Graphen auf Papier malen, sondern auch hierfür gibt es ein Tool. Das bekannteste ich wohl KCacheGrind (Linux KDE), oder MacCallGrind (wer hätte es gedacht: Mac OS). Betriebssystem unabhängig gibt es noch WebGrind, ob man damit aber auch große CallGrinds analysieren kann weiss ich nicht. Falls ich noch ein Betriebssystem vergessen habe, solltet ihr einfach mal Google fragen (Stichwort: WinCacheGrind)! Meiner aktuellen Betriebssystemsituation geschuldet, stelle ich euch hier erstmal nur MacCallGrind vor. KCacheGrind zeige ich euch dann in einem späteren Beitrag, WinCacheGrind müsst ihr euch selbst angucken.
Ich habe folgendes Skript auswerten lassen:
<?php
test();
test();
test();
test();
test();
test();
test();
test();
test();
function test(){
$i = 1;
while($i < 10000) {
$i++;
echo "test";
usleep(100);
}
}
?>
Das ganze sieht im MacCallGrind dann so aus (Einfach die erzeugten Dateien öffnen):
Nun kann man genau gucken wo die Ausführungszeit der Anwendung verschwindet, welche Funktion wie oft aufgerufen wird und wie lange die Ausführungen der einzelnen Funktionen dauern. Mit KCacheGrind kann man dann noch ein paar weitere Auswertungen anfertigen, aber dazu in einem späteren Beitrag mehr. Sonst ist MacCallGrind größtenteils selbsterklärend.
Meiner Meinung nach kann man so gute Analysen der eigenen Software machen, um Performance Engpässe schon bei der Entwicklung aufzuspüren und zu einer ordentlichen Softwareanalyse gehört es einfach dazu.


Letzte Kommentare