Werkzeuge für Analyse und Leistungssteigerung.

PHP Profiler im Vergleich – Teil 1: Xdebug
Kommentare

Profiler wie Xdebug oder Facebooks XHProf sind mächtige Werkzeuge. Letztes Jahr haben namhafte Firmen wie Qafoo, Zend und SensioLabs ihre eigenen Profiler veröffentlicht, die das Analysieren von PHP-Anwendungen revolutionieren sollten. Engpässe oder ineffizienter Code gehören somit der Vergangenheit an. Im Rahmen einer „PHP Profiler“-Woche nehmen wir dieser fünfteiligen Artikelserie fünf Profiler unter die Lupe, um herauszufinden, welcher Profiler den jeweiligen Bedürfnissen am nächsten kommt.

Mit Profilern wird die Leistungsfähigkeit von PHP-Anwendungen analysiert. So lassen sich z. B. SQL-Abfragen in einer Schleife oder ein nicht aktiver Cache schnell aufspüren. Vielen dürfte in diesem Zusammenhang der Profiler Xdebug bekannt sein. Während er in der Anfangszeit gute Dienste leistete, brachte Facebook 2009 XHProf mit einem GUI heraus. Seit letztem Jahr gibt es neben diesen beiden Urgesteinen noch weitere Profiler, etwa Z-Ray, Blackfire und Tideways.

Neben einer Einführung ins Thema schauen wir uns heute Xdebug genauer an. An jedem Tag in dieser Woche kommt ein anderer Profiler an die Reihe: XHProf, Z-Ray, Blackfire und Tideways. Und natürlich gibt es noch eine hilfreiche Vergleichsmatrix obendrauf. Auf geht’s!

Warum sollte ich meinen Code analysieren?

Diese Frage ist einfach zu beantworten: Time is Money! Weniger Performance bedeutet weniger Einnahmen. Das kontinuierliche Testen der Performance sollte darum zum Entwicklungsworkflow gehören – getreu dem Motto: Nicht raten, sondern messen! PHP-Anwendungen sind heutzutage sehr komplex und eine kleine Änderung am Code kann sowohl positive als auch negative Auswirkungen mit sich bringen. So wurde etwa der PHP Dependency Manager Composer mit nur einer einzigen Codezeile um 30 bis 90 Prozent beschleunigt. Bitte deaktivieren Sie jetzt aber nicht den PHP Garbage Collector in ihrem Projekt. Das genannte Beispiel war wirklich ein Sonderfall.

Mit einer Analyse auf Codebasis werden also Bottlenecks oder besonders intensiv genutzte Ressourcen aufgedeckt. Da 80 Prozent der Performance im Frontend liegen, bleiben im Backend lediglich 20 Prozent übrig, um die Seite auszuliefern. Wenn wir davon ausgehen, dass eine Sekunde Ladezeit schnell ist, muss das HTML in 200 Millisekunden ausgeliefert sein. Allerdings kann die Netzwerklatenz 100 Millisekunden betragen und es bleiben nur 100 Millisekunden, um den Ausgabecode auf den Weg zum Client zu schicken.

Das Profiling sollte in einer Cache-freien Umgebung stattfinden. Ernsthaft – Query, OPcache und andere Caches sollten deaktiviert sein. Ein Cache hat nicht direkt die Aufgabe, einen einzelnen Request der Anwendung zu beschleunigen, sondern vielmehr den Zweck, dafür zu sorgen, dass mehrere gleichzeitige Requests die Anwendung nicht verlangsamen. Oder besser gesagt: dass sie genauso schnell sind wie ein einzelner Request. Wenn also die Anwendung bei einem Request langsam ist, sollte man der Ursache auf den Grund gehen, anstatt sich hinter einem Cache zu verstecken, denn: Nicht auf den Server, sondern auf den Code kommt es an! Die positive Auswirkung eines Caches wird dann später analysiert. Auch, wenn Hardware heutzutage nicht teuer ist, kann sich eine Optimierung etwa auch auf den Geldbeutel auswirken. Es sollte darauf geachtet werden, dass die Zeit nicht mit Mikrooptimierungen verschwendet wird. Ein Beispiel wäre hier, print durch echo oder Double Quotes durch Single Quotes zu ersetzen. Folgende Frage hilft bei der Entscheidung für oder gegen einen Profiler: Habe ich ein Performanceproblem, und wenn ja, wie groß ist es? Auch sollte die Wartbarkeit der Software im Vordergrund stehen. Es bringt nichts, an jeder Stelle hochperformanten Code zu schreiben, der nicht verständlich ist. Optimierungen sollten sich auch auf dem Produktivsystem widerspiegeln, auch wenn dennoch Abweichungen zwischen Entwicklungs- und Produktivsystem auftreten können. Es empfiehlt sich also, das Entwicklungssystem identisch zum Produktivsystem aufzusetzen und Profiler gezielt live einzusetzen.

Profiling vs. Benchmarking

Unter Profiling wird das Messen der relativen Performance der Applikation auf Codebasis verstanden, während Benchmarks die aktuelle Performance der Anwendung – also das, was der Enduser sieht – untersuchen. Für Benchmarks oder Lasttests kommen z. B. ApacheBench, Siege oder Apache JMeter zum Einsatz. Bei den Profilern wird zwischen aktiven und passiven Profilern unterschieden. Aktive Profiler werden manuell vom Entwickler aktiviert und sammeln normalerweise mehr Informationen als passive Profiler. Sie sollten aber aufgrund der starken Performanceeinbuße nur auf dem Entwicklungssystem geladen sein. Passive Profiler aktivieren sich automatisch z. B. bei jedem hundertsten Request und haben kaum Auswirkungen auf die Performance der Anwendung. Somit steht einem produktiven Einsatz nichts im Wege.

Callers, Callees, Call Graph, Oh, My!

Neben Standardinformationen wie Speicherverbrauch, Ausführungszeit und Anzahl der Funktionsaufrufe gibt es noch Callers, Callees und einen Call Graph. Callers sind die Funktionen, die eine Funktion direkt aufrufen. Sie werden auch Parent Calls genannt. Callees sind so genannte Child Calls und geben an, was für Funktionsaufrufe von dieser Funktion ausgehen. Dann gibt es noch verschiedene Angaben mit Inclusive-, Exclusive- und Peak-Werten. Inclusive-Angaben beziehen sich dabei auf die Funktion selbst sowie auf ihre Callees. Die Inclusive Time kann kritische Pfade in der Applikation aufdecken. Exclusive-Angaben beziehen sich nur auf die Funktion selbst, also ohne Callees. Deshalb sollte man Funktionen mit hohen Exclusive-Werten zuerst analysieren und versuchen, sie zu optimieren. Peak-Werte sind wie Lastspitzen anzusehen. Der Call Graph ist eine hierarchische Visualisierung der Funktionsaufrufe, genauer gesagt ein Codeablaufplan des PHP-Aufrufs auf Funktionsebene. Monitor Events zeichnen auf, wann ein bestimmtes Ereignis eingetreten ist, das dann in den Profiling-Ergebnissen angezeigt wird. All diese Features können sehr nützlich bei der Analyse sein.

Xdebug Profiler

Als Debugger dürfte Xdebug von Derick Rethans jedem bekannt sein. Mit ihm lassen sich allerdings auch Profile erstellen und mit verschiedenen Tools wie KCachegrind oder PhpStorm analysieren. Xdebug galt lange als Quasistandard, und auch wenn er sich heute noch großer Beliebtheit erfreut, gibt es nun durch eine ganze Reihe anderer Profiler einige Konkurrenz. Ab Version 2.3 wird nur noch PHP ≥ 5.4 unterstützt. Da PHP 5.3 aber End-of-Life ist, ist das zu verkraften. Die Installation erfolgt einfach über PECL; wer Xdebug bereits installiert hat, kann den Profiler sofort nutzen. Bemerkenswert ist, dass hier viele zusätzliche Informationen zur Verfügung stehen, etwa Assembler-Code, verschiedene Maps oder Profile-Informationen direkt im Quellcode. Hier sieht man gleich, dass es sich um einen aktiven Profiler handelt. Die angezeigten Daten sind vom eingesetzten Tool abhängig. PhpStorm zeigt z. B. viel weniger Informationen an als Kcachegrind.

Zu den Standardinformationen gehören Callees, Callers, verbrauchte CPU-Zeit und die Anzahl der Aufrufe einer Funktion. Eine Call-Graph-Anzeige und das Suchen nach Funktionen sind auch möglich. Leider findet keine Aufzeichnung von Datenbank-Queries statt. Hier muss man die verschiedenen Queries anhand des Funktionsnamens herleiten. Der Speicherverbrauch oder die Gegenüberstellung von Profilen wird nicht unterstützt. Aufgetretene PHP-Fehler zeigt Xdebug nicht an, aber es wird ja sowieso mit display_errors = on entwickelt, oder? Sowohl Browser-Requests als auch CLI-Skripte oder APIs können analysiert werden. Ein individuelles Profiling oder das Schreiben eigener Extensions ist nicht möglich. Monitor Events sind nicht verfügbar. Alle Daten sind lokal gespeichert, um sie später mit einem Tool analysieren zu können. Xdebug ist kostenlos und sollte aufgrund des Overheads nur im Entwicklungssystem zum Einsatz kommen und nicht im Produktivsystem geladen werden.

 

 

PHP Magazin

Entwickler MagazinDieser Artikel ist im PHP Magazin erschienen. Das PHP Magazin deckt ein breites Spektrum an Themen ab, die für die erfolgreiche Webentwicklung unerlässlich sind.

Natürlich können Sie das PHP Magazin über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. In unserem Shop ist das Entwickler Magazin ferner im Abonnement oder als Einzelheft erhältlich.

 

Aufmacherbild: Business card showing illustration of a plumber via Shutterstock / Urheberrecht: patrimonio designs ltd

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -