Schnellere Websites mit XCache

Hinweis: PHP 5.5 und neuer beinhaltet OPCache, was eine Alternative zu XCache und auch etwas schneller ist.

Auf meinem Webserver habe ich über eine Million Zugriffe pro Monat insgesamt – oder rein statistisch rund zwei Zugriffe pro Sekunde. Da die Zugriffe aber nicht über den ganzen Tag gleichmäßig verteilt sind, gibt es Zeiten mit deutlich höherer Last. Es wurde also langsam Zeit, sich über Optimierungsmöglichkeiten Gedanken zu machen.

PHP ist eine interpretierte Scriptsprache, d.h. bei jedem Zugriff, der durch ein PHP-Script bearbeitet wird (und das ist bei vielen PHP-basierten Websites fast jeder Zugriff), wird das Script von PHP geladen und interpretiert. Die eigentliche Ausführung erfolgt dann aber in Form von Opcodes im Speicher, so dass der Geschwindigkeitsunterschied zu nativem Binärcode ab diesem Zeitpunkt nicht sehr groß ist.

Das Problem: Die erzeugten Opcodes werden nach der Ausführung wieder verworfen, auch wenn sich das aufgerufene Script nicht ändert. Wenn ein Script zehn Mal hintereinander aufgerufen wird, erfolgt auch zehn Mal eine erneute Interpretation, obwohl sie eigentlich nur einmal nötig wäre.

Genau hier kommen die verschiedenen „PHP-Beschleuniger“ in’s Spiel – die Opcodes werden in einem Cache vorgehalten und stehen für die nächste Ausführung wieder zur Verfügung.

Für diesen Zweck setze ich derzeit XCache ein. XCache ist im Umfeld des lighttpd-Projektes entstanden, ist aber auch in Verbindung mit Apache oder nginx einsetzbar. Die Vorteile bei XCache sind für mich der stabile Betrieb, eine schnelle Anpassung an neue PHP-Versionen und die einfache Installation – unter Debian oder Ubuntu steht XCache als Paket zur Verfügung und kann für PHP5 mit

apt-get install php5-xcache

leicht installiert werden. XCache wird dann als Zend-Extension eingetragen und verhält sich vollkommen transparent – d.h. alle bestehenden PHP-Scripte sind unverändert weiter nutzbar. Änderungen an den Scripten, die eine erneute Interpretation erfordern, stellt XCache automatisch fest.

Nach der Installation sollte man einen Blick in die Konfigurationsdatei werfen, z.B. /etc/php5/apache2/conf.d/xcache.ini. Dort ist insbesondere der Wert für xcache.size wichtig – wenn der Server ausreichend Speicher hat, kann man hier 64 (für 64 MB) oder mehr angeben. Der Variablen-Cache xcache.var_size ist nur relevant, wenn man Anwendungen nutzt, die davon mit dem XCache-API auch Gebrauch machen. Mit dem Administrations-Frontend von XCache oder dem Munin-Plugin zur Überwachung der aktuellen Werte kann man die tatsächliche Speichernutzung später auch kontrollieren und die Werte ggf. anpassen. Wichtig: Nach einer Änderung muss Apache neu gestartet werden.

Die Arbeit von XCache macht sich sehr schnell bemerkbar: sobald die Scripte in Form von Opcodes aus dem Cache geladen werden, sind sie je nach Komplexität um den Faktor 2-3 schneller als vorher, da die Zeit für die Interpretation vollkommen entfällt. Auch die Serverlast sinkt deutlich.

Einrichtung des Munin-Plugin

Auf http://www.ohardt.com/dev/munin/ findet man auch ein Plugin für Munin, um die Aktivität von XCache im zeitlichen Verlauf beobachten zu können.

Die Einrichtung ist in der mitgelieferten Dokumentation erklärt. Man kopiert ein PHP-Script auf den Webserver, mit dem das Plugin die Daten via HTTP abfragen kann (das ist notwendig, da nur so die Daten der laufenden XCache-Instanz ermittelbar sind) und das Plugin selbst (bestehend aus drei Dateien) in das entsprechende Verzeichnis von Munin. Zusätzlich gibt man in der Munin-Konfiguration die URL für den Zugriff auf das PHP-Abfragescript an, ggf. mit Benutzernamen und Passwort. Dabei ist zu beachten, dass das Passwort in der XCache-Konfiguration als MD5-Prüfsumme angegeben wird, in der Konfiguration des Munin-Plugin aber im Klartext!

Wenn in Munin nach 5-10 Minuten keine Daten angezeigt werden, sollte man das Update-Log von Munin prüfen.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.