PHP: Apachemodul vs. HHVM
Dass PHP bzgl. Performance nicht gut ist, steht außer Frage. Überspitzt gesagt sind viele Handstände notwendig, um Webanwendungen, die darauf zurückgreifen, so gut einzurichten, dass sie bei endlichem Ressourcenverbrauch mehr als eine Hand voll Anfragen gleichzeitig bedienen können. Heute habe ich ein Experiment zur Beschleunigung der reinen Ausführungsgeschwindigkeit durchgeführt.
Oldschool
Im 0815-Style werden Webanwendungen unter Verwendung von Apache mit mod_php deployt. Apache führt dabei den PHP-Code in seinen Arbeitsprozessen direkt aus. Bei jeder Anfrage, die PHP benötigt, wird das angefragte Skript aus dem Dateisystem geholt und Zeile für Zeile interpretiert. Das verbraucht aus technischer Sicht unter anderem viel Prozessorzeit, welche bei jeder Anfrage erneut aufgewendet werden muss, auch wenn sich der PHP-Code selbst nicht geändert hat. Unterm Strich wird also durch unnötige repetitive Arbeit Strom in Abwärme umgewandelt.
HipHop VM for PHP (HHVM)
Die Entwickler der Werbeplattform Facebook greifen ebenfalls auf PHP zurück. Aufgrund der vielen Millionen täglichen Benutzeranfragen haben sie HHVM zur Just-in-time-Kompilierung von PHP-Skripten entwickelt. Es basiert auf der Idee von phc, wurde aber nicht auf maximale Kompatibilität optimiert, was einen Geschwindigkeitsvorteil bringt.
Testumgebung
Ich habe mir eine VM in Virtualbox mit Ubuntu-Server 12.04 amd64 geklickt und den Apache mit mod_php, welche auf PHP-Version 5.3 zurückgreift, installiert. Weiter habe ich die Blogsoftware Serendipity, welche ich auch für diesen Blog einsetze, heruntergeladen, den Apache darauf ausgerichtet und die Installation unter Verwendung von SQLite als Datenbankbackend durchgeführt. Ich habe einen Testbeitrag im Blog erstellt, damit es mehr als nur eine leere Startseite gibt. Das Kommentieren des Beitrags klappt auch. So weit so gut.
Um HHVM nutzbar zu machen, habe ich die entsprechende Paketquelle eingerichtet und das Hiphop-Paket installiert. Hiphop hat keine vordefinierte Konfigurationsstruktur wie Apache. Das muss man sich selbst zusammenlöten, wenn man es produktiv einsetzen möchte.
Status: Apache läuft und bedient Anfragen auf Port 80, HHVM ist aus
Rahmenbedingung: Es gibt praktisch keine Netzwerkwartezeiten, da wir alles auf einer Maschine machen. Es gibt Overhead durch die VM, welcher aber bei beiden Testkandidaten gleichermaßen existiert.
Durchführung
Ich öffne zwei Browsertabs und Firebug ist auf Netzwerkanalyse ausgerichtet. Ich lade die Startseite zehn Mal neu. Die Time-to-first-byte liegt beim Apache bei etwa 60ms. Ich fahre den Apache herunter und starte HHVM im Serendipityhauptverzeichnis mit folgendem Befehl.
sudo hhvm -m server -p 80
Nun lade ich im zweiten Browsertab die Seite zehn Mal neu. Die Time-to-first-byte pegelt sich nach drei Ladevorgängen bei etwa 15ms ein. Das Serendipity-Backend ist auch nutzbar.
Fazit
Dieses Experiment hat eindrucksvoll gezeigt, wozu Hiphop VM for PHP in der Lage ist. Eine Laufzeitverringerung um satte 75% ist ein sehr gutes Ergebnis. Jeder, der eine stark unter Feuer stehende PHP-Webanwendung betreibt, hat die Chance mit HHVM die Applikationsperformance zu erhöhen, insofern die Kompatibilität gewährleistet ist.
Facebook betreibt übrigens auch ein WordPress-Blog mit und über Hiphop.
Probiert es doch einfach selbst aus.
Nachtrag: XCache
Da ich die Testumgebung einmal aufgebaut hatte, ließ ich es mir nicht nehmen, Apache einmal mit und einmal ohne XCache laufen zu lassen. Siehe da, im Falle der Webapplikation Serendipity bewegt sich die TTFB-Beschleunigung bei aktiviertem XCache im Vergleich zur Standardinstallation ohne auch bei etwa 75%. Bei einem Ubuntu-Server reicht damit die Installation vom Paket php5-xcache aus, um Serendipity serverseitig enorm zu beschleunigen.
Kommentare