Effizienter Opcode Cache für PHP

Das Testszenario

Für diese Tests wurde ein VServer mit 2 CPUs und 1GB Ram mit einer Debian Squeeze Basisinstallation ausgestattet. Als Webserver kommt der Apache2 mit PHP als FCGI zum Einsatz. Die Anfragen werden von einem 2. Rechner mit einer 100Mbit Anbindung ausgeführt, und sind so dimensioniert, das der Webserver nicht anfängt zu swappen. Es werden 5000 Anfragen (jeweils 20 gleichzeitig) an eine WordPress 3.2 Grundinstallation geschickt.

ab -n 5000 -c 20 http://testserver-mit-wordpress/

Ausgangsituation ohne Caches oder sonstiges Tuning

Der Test auf die blanke Installation ohne jegliche Optimierungen dauert natürlich etwas länger. Im Folgenden die erreichten Werte: der Speicherverbrauch des gesamten Server liegt bei bis zu 790Mb, und während des Tests stieg das Load bis zu den Maximalwerten von (20,0 | 15,1 | 7,3).

Die detailierte Ausgabe von Apache Bench sieht dann so aus:

Concurrency Level:      20
Time taken for tests:   427.967 seconds
Complete requests:      5000
Failed requests:        0
Write errors:           0
Total transferred:      32369298 bytes
HTML transferred:       31059298 bytes
Requests per second:    11.68 [#/sec] (mean)
Time per request:       1711.867 [ms] (mean)
Time per request:       85.593 [ms] (mean, across all concurrent requests)
Transfer rate:          73.86 [Kbytes/sec] received

ionCube PHP Accelerator

Diesen Opcode Cache kann man bei ionCube herunterladen, aber anscheinend wird er nicht mehr weiter gepflegt. Die letzte Meldung auf der Webseite lautet, dass er jetzt auch für PHP 4.4 verfügbar wäre 🙁

Turck MMCache

Der Turck MMCache wurde bereits vor Jahren eingestellt. Eine Weiterentwicklung findet man in Form des eAccelerator (siehe unten).

Nusphere PhpExpress

Laut der Webseite von NuSphere ist PhpExpress dazu da, kodierte PHP Skripte zu laden und zu beschleunigen, sowie auch für nicht kodierte Skripte Cache und Beschleunigung zur Verfügung zu stellen

… PhpExpress loads encoded PHP scripts directly into PHP engine saving time and boosting performance of PHP interpreter. PhpExpress also implements caching for PHP engine and accelerates execution process even if PHP Script is not encoded …

Leider ist davon in diesem Test nichts zu erkennen (ich habe extra nochmal per phpinfo(); nachgeschaut, ob die Erweiterung auch wirklich geladen ist). Auch die Speichernutzung des Server schaukelte sich allmählich nach oben, so erreichte er Maximalwerte von 950Mb genutzten Ram.

Concurrency Level:      20
Time taken for tests:   432.416 seconds
Complete requests:      5000
Failed requests:        0
Write errors:           0
Total transferred:      32369358 bytes
HTML transferred:       31059358 bytes
Requests per second:    11.56 [#/sec] (mean)
Time per request:       1729.665 [ms] (mean)
Time per request:       86.483 [ms] (mean, across all concurrent requests)
Transfer rate:          73.10 [Kbytes/sec] received

Zend Optimizer+/Zend Platform

Da ich keine Zend Lizenz besitze, muss dieser Test ausfallen.

Windows Cache Extension for PHP

Die Windows Cache Extension kann von der Seite www.iis.de heruntergeladen werden, und ist ein Opcode Cache für den IIS. Ich kann dazu aber nur sagen: Ich habe gar kein Windows 😆

Alternative PHP Cache (APC)

APC kann man auf der Projekthomepage herunterladen und selber kompilieren, oder unter Debian das bereits fertige Paket nutzen.

apt-get install php-apc
/etc/init.d/apache2 restart

Während des Testlaufes bliebt der genutzte Ram durch den Server konstant bei 526Mb, und das Load erreichte laut Überwachung durch htop einen Maximalwert von ( 19,3 | 11,7 | 5,3 ).

Concurrency Level:      20
Time taken for tests:   224.440 seconds
Complete requests:      5000
Failed requests:        0
Write errors:           0
Total transferred:      32369146 bytes
HTML transferred:       31059146 bytes
Requests per second:    22.28 [#/sec] (mean)
Time per request:       897.759 [ms] (mean)
Time per request:       44.888 [ms] (mean, across all concurrent requests)
Transfer rate:          140.84 [Kbytes/sec] received

PHP-Xcache

Unter Debian eine gewohnt einfache Installation für Xcache per apt

apt-get install php5-xcache
/etc/init.d/apache2 restart

Xcache genehmigte sich während des Test mit einer konstanten Nutzung von 548Mb etwas mehr Ram als APC und ist auch nicht ganz so flott unterwegs. Das Serverload ging erreichte die Maximalwerte von ( 19,4 | 11,6 | 4,9 ).

Concurrency Level:      20
Time taken for tests:   246.778 seconds
Complete requests:      5000
Failed requests:        0
Write errors:           0
Total transferred:      32369446 bytes
HTML transferred:       31059446 bytes
Requests per second:    20.26 [#/sec] (mean)
Time per request:       987.111 [ms] (mean)
Time per request:       49.356 [ms] (mean, across all concurrent requests)
Transfer rate:          128.09 [Kbytes/sec] received

PHP eAccelerator

Beim eAccelerator ist die Installation etwas aufwendiger, hier muss man selbst noch den Kompiler anwerfen ;). Also erstmal die Sourcen holen, das System zum kompilieren vorbereiten und los geht es …

apt-get install build-essential php5-dev
wget http://downloads.sourceforge.net/project/eaccelerator/eaccelerator/eAccelerator%200.9.6.1/eaccelerator-0.9.6.1.zip
unzip eaccelerator-0.9.6.1.zip
cd eaccelerator-0.9.6.1
phpize
./configure --without-eaccelerator-use-inode
make
make test
make install

jetzt noch die Konfigurationsdatei als /etc/php5/cgi/conf.d/eaccelerator.ini mit folgendem Inhalt angelegt, und den Apache neue gestartet – dann kann es schon losgehen.

extension="eaccelerator.so"
eaccelerator.shm_size="32"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="1"
eaccelerator.compress="0"
eaccelerator.compress_level="9"

Testergebnisse Speichernutzung bei 547Mb Maximalwerte des Load stiegen bis auf ( 19,3 | 11,2 | 6,0 )

Concurrency Level:      20
Time taken for tests:   223.908 seconds
Complete requests:      5000
Failed requests:        0
Write errors:           0
Total transferred:      32369360 bytes
HTML transferred:       31059360 bytes
Requests per second:    22.33 [#/sec] (mean)
Time per request:       895.634 [ms] (mean)
Time per request:       44.782 [ms] (mean, across all concurrent requests)
Transfer rate:          141.18 [Kbytes/sec] received

Fazit

Die Drei nach diesem Test wirklich sinnvollen Erweiterungen PHP-APC, PHP-Xcache und eAccelerator nehmen sich nicht wirklich viel. Es wird dann doch eher in Richtung persönlicher Neigung gehen, welchen man installiert. Beim APC und beim Xcache hat man außerdem bei Debian noch den Vorteil, das sie in der Paketverwaltung enthalten sind, man also nicht wie beim eAccelerator bei jedem PHP Update den Kompiler anwerfen muss.

Schreibe einen Kommentar

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