www.alexander-merz.com | Alexander Merz

Tomcat&PHP - Performance

Im fünften und letzten Teil der Artikelserie betrachten wir, ob das Gespann von Tomcat und PHP vernünftige Reaktionszeit gewährleistet und ob es für den Produktionsbetrieb stabil genug ist.

Allgemein

Um Benchmarking-Werte zu ermitteln, wurde JMeter des Apache Projektes eingesetzt (http://jakarta.apache.org/jmeter/). Getestet wurde auf zwei verschieden Rechnern, einer mit Window XP und einer mit Linux. Bei beiden handelt es sich um klassische "Entwicklerrechner", also keine in irgendeiner Form dezidierten Server.

Im Vordergrund steht dabei der Test der Auslieferungszeit: PHP+Java unter Tomcat gegen JSP unter Tomcat. Das PHP mit Apache schneller ist, als PHP mit Tomcat zeigte schon ein einfacher Test und soll nicht weiter diskutiert werden. Und PHP+Apache gegen JSP+Tomcat gehört hier ebenfalls nicht hin.

Ziel ist es vielmehr herauszufinden, ob PHP-Seiten mit Java-Aufrufen gegen reine JSP-Seiten mithalten können.

Ich verkneife es mir hier, mit irgendwelchen Tabellen mit Microsekunden-Angaben aufzuwarten und beschränke mich stattdessen darauf Trends wiederzugeben.

Overhead?

Der erste Test bestand aus einer leeren PHP-Seite bzw. JSP-Seite. Auf diese Weise kann ermittelt werden, wie viel Zeit grundsätzlich notwendig ist, um den PHP-Interpreter aufzurufen, und ob dies langsamer/schneller ist, als den automatisch erzeugte Code eines Java-Servlets auszuführen. (Wir erinnern uns: eine JSP-Seite wird in ein Java-Servlet umgewandelt.)

Bei eigenen Tests sollte man unbedingt beachten, dass die JSP-Seite zuerst manuell aufgerufen wird, damit Tomcat sie umwandeln und kompilieren kann. Ansonsten wird das Ergebnis verfälscht.

Das Resultat: Die Differenzen liegen im Messfehlerbereich. Der Aufruf des PHP-Interpreters dauert genauso lange, wie den automatisch erzeugten Quellcode der Servlets abzuarbeiten.

Java-Klassen-Aufrufe

Der zweite Test verglich die Geschwindigkeit der Einbindung von Java-Klassen und die Ausführung von Methoden in PHP mit funktionsgleichen JSP-Seiten. Dabei gab es zwei Szenarien: Beim Ersten wurde Logik und Aufrufe eins-zu-eins von der JSP-Seite übernommen. Beim Zweiten hingegen wurde die Logik zwar übernommen, aber punktuell bestimmte Java-Aufrufe durch PHP-Funktionen ersetzt, z.B. bei der Verarbeitung von Zeichenketten wie bei der Verarbeitung von Formulareingaben.

Die Ergebnisse des ersten Szenarios war nicht überraschend. Die JSP-Seiten erzielten einen Geschwindigkeitsvorsprung von durchschnittlich 25% gegenüber den PHP-Seiten mit Java-Klassen-Aufrufen. Positiv ist anzumerken, dass die Geschwindigkeitsdifferenz relativ konstant bleibt, wenn die Anzahl der in PHP benutzen Java-Klassen zunimmt. PHP skaliert hier linear, es spielt Im Vergleich mit JSP keine Rolle, ob man in PHP eine Klasse einbindet oder zwanzig.

Die Resultate des zweiten Szenario waren recht überraschend. Den hier wurden die PHP-Seiten genauso schnell oder schneller(!) ausgeliefert als die JSP-Seiten. Damit wird die bisherige Argumentation teilweise hinfällig wird, wenn die Frage steht, ob PHP oder JSP bei einer Webanwendung für ein bestehendes Java-Backends zum Zuge kommen soll.

JSP-Tags in PHP

Die dritte Testreihe nahm die Performance des JSP-Tag-Einsatzes in PHP unter die Lupe. Hier erzielen die JSP-Seiten eine Vorsprung von ca. 50%. Ursache für die größere Differenz als bei den vorherigen Tests liegen wohl im umfangreichen Tag-Caching-Mechanismus des Tomcats.

Diesen Mechanismus unter PHP nachzubauen, ist mit handelsüblichen PHP-Mitteln nicht vollständig realisierbar. Selbst durch die konsequente Wiederverwendung der Java-Klassen dürfte sich die Differenz deshalb kaum unter 35% bis 40% drücken lassen. Aus diesem Grund ist der Einsatz von JSP-Tags in PHP nur bei einer Migration sinnvoll, nicht dagegen im regulären Betrieb, wenn man die Hardware nicht aufstocken kann oder will.

Stabilität

Unter Windows führte der erste Lasttest mit zehn parallelen Zugriffen und je 100 Testläufen dazu, dass Tomcat sich nach einem Viertel der Zugriffe sang- und klanglos beendete. Erneute Versuche führten zum gleichen Ergebnis. Damit scheidet Windows als Produktivumgebung für Tomcat&PHP aus. Vermutlich kommt unter Windows das Threadingmodell des Tomcat bzw. der Java-VM nicht vernünftig mit der PHP-Extension zurecht, bzw. die Extension nicht mit der Java-VM.

Als Entwicklungsumgebung kann Windows trotzdem genutzt werden, solange keine parallelen Zugriffe gefahren werden.

Unter Linux gab es dieses Problem nicht, selbst hundert parallele Zugriff brachten Tomcat nicht aus dem Tritt. Unter massiver Last wurde die Auslieferung der PHP- wie JSP-Seiten erkennbar langsamer. Es machte aber keinen signifikanten Unterschied, ob es sich dabei um PHP oder JSP-Seiten handelt. Tomcat mit PHP skaliert nicht erkennbar schlechter oder ist langsamer als ein Tomcat ohne PHP.

Abschluss

Die Artikelserie über Tomcat&PHP geht damit erst einmal zu Ende. Bereits im Verlauf der Serie erhielt ich eine ganze Reihe von positiven Emails und Zuschriften. Insbesondere bedanken möchte ich mich bei Jan Abt und Samuel Blume, deren Probleme und Lösungen geholfen haben, Unklarheiten in den Artikeln zu finden und zu beseitigen.

1. Teil: Tomcat&PHP - Installation
2. Teil: Tomcat&PHP - Wie funktioniert es?
3. Teil: Tomcat&PHP - Vordefinierte Variablen
4. Teil: Tomcat&PHP - JSP-Tags in PHP