Category Archives: Typo3

TYPO3 unter Windows mit Wincache beschleunigen

Was ist Wincache?

Wincache, oder Windows Cache Extension, ist ein PHP Optimierer, ähnlich wie APC. Er generiert aus den PHP-Quelldateien Bytecode, welcher im Speicher des Servers abgelegt wird. Somit muss dieser Bytecode nur einmal erstellt werden und nicht jedes Mal, wenn ein PHP-Script aufgerufen wird. Im Unterschied zu APC läuft Wincache nur auf Windows-Systemen, hat aber den Vorteil, dass er speziell für diese Plattform optimiert ist.

Wincache und APC bieten außerdem eine Caching API, welche es möglich macht Daten abzulegen und in darauffolgenden Requests wieder zu verwenden. Auf vielen Systemen wird dafür entweder die Datenbank (der Klassiker bei TYPO3) oder memcached verwendet.

Auch wenn die Unterschiede zwischen den beiden Bytecode-Optimierern eher marginal sind, fiel meine Wahl schließlich auf Wincache, einfach aus dem Grund, da der Webserver ein Windows 2008 Server ist und Wincache speziell für die Windows-Plattform entwickelt wurde und es laut verschiedener Benchmarks um einen Tick schneller als APC zu laufen scheint (ich muss zugeben ich habe selbst noch keinen Vergleichstest gemacht, verlasse mich aber mal auf die Angaben anderer).

Warum Wincache und TYPO3?

TYPO3 kannte lange Zeit nur zwei Caching-Methoden. Entweder das Dateisystem oder die Datenbank. Dies sind nicht gerade ideale Orte um Daten mit hohem I/O-Durchsatz abzulegen. Später wurden diese Cache „Backends“, wie sie TYPO3 nennt, konfigurierbar. Unter Anderem kamen ein memcached- und ein APC-Backend dazu.

In meinem konkreten Fall wurde auf der existierenden Webseite memcached unter Windows eingesetzt. Memcached ist wohl der Klassiker auf *nix-Systemen, wenn es um das Zwischenspeichern von Daten im Arbeitsspeicher, auch über mehrere Maschinen hinweg, geht. Es gibt auch Ports für Windows-Systeme, welche einfach einen Windows-Dienst bereitstellen, welcher memcached.exe hostet.

Habe ich schon erwähnt, dass die Seite auf welche ich mich beziehe langsam war? Nicht? Dann hole ich das jetzt nach: die Seite war träge, vor allem die Startseite! Die Startseite brauchte warm (!) – also nachdem die meisten Inhalte im Cache vorhanden waren – teilweise über eine Sekunde, bis sie sich endlich dazu entschlossen hat HTML-Code auszuspucken. Okay, es waren einige dynamische Inhalte vorhanden, wie z.B. Banner, welche zufällig ausgespuckt werden sollten, deshalb wurde auf ein aggresives Caching verzichtet. Trotzdem: es dauerte einfach viel zu lange…

Zeit mir das Ganze auf einem dedizierten System genauer anzusehen. Ich kopierte also die TYPO3-Seite und alle notwendigen Serverkomponenten auf mein Testsystem, hab alles wie auf dem Live-System konfiguriert und führte ein paar Tests durch. Mit mehr oder weniger demselben Ergebnis (sieht man von der unterschiedlichen Prozessoranzahl und verfügbarem Arbeitsspeicher ab): das Ding skalierte einfach nicht!

Ich hab mich daraufhin dazu entschlossen dem System auf den Zahn zu fühlen. Ich muss zugeben, ich habe mich mit TYPO3 seit fast zwei Jahren nicht mehr beschäftigt und das Caching war relativ neu für mich (ich kannte noch den DB-Cache). Aber nach einem Blick in die localconf.php (soweit konnte ich mich noch aus meiner früheren Zeit mit TYPO3 erinnern) ist mir der Konfigurationsabschnitt mit $TYPO3_CONF_VARS['SYS']['caching'] aufgefallen und dass es einige Einträge mit t3lib_cache_backend_MemcachedBackend gab. „Könnte es sein, dass das ein Flaschenhals ist?“ hab ich mir gedacht und mir überlegt, ob man das Ganze nicht mit Wincache beschleunigen könnte.

Dafür muss es doch eine „Backend“-Klasse geben!

Ich wurde enttäuscht. Nachdem ich einen Blick in den Ordner „t3libcachebackend“ geworfen hatte war kein Backend auffindbar, welches Wincache verwendet. Auch im Internet wurde ich nicht fündig.

Da es jedoch ein Backend für APC gibt und ich wusste, dass die beiden Byteoptimierer von ihren Features und der API fast identisch sind, habe ich einfach den bestehenden Code für Wincache portiert. Zu finden ist diese portierte Klasse am Ende des Artikels.

Was noch fehlt, ist dieses Backend in TYPO3 zu registrieren. Dies kann in der localconf.php folgendermaßen vorgenommen werden:

$TYPO3_CONF_VARS['SYS']['caching']['cacheBackends']['t3lib_cache_backend_WincacheBackend'] =
'<path_to_the_class>/class.t3lib_cache_backend_wincachebackend.php:t3lib_cache_backend_WincacheBackend';

Nun muss noch konfiguriert werden, wo das Backend verwendet werden soll. Dies kann über folgenden PHP-Code vorgenommen werden:

$TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations'] = array(
'cache_hash' => array(
'backend' => 't3lib_cache_backend_WincacheBackend',
'options' => array()
),
'cache_pages' => array(
'backend' => 't3lib_cache_backend_WincacheBackend',
'options' => array()
), 'cache_pagesection' => array(
'backend' => 't3lib_cache_backend_WincacheBackend',
'options' => array()
),
'cache_extbase_reflection' => array(
'backend' => 't3lib_cache_backend_WincacheBackend',
'options' => array()
)
);

Falls es Extensions gibt, welche ebenfalls vom Caching Gebrauch machen, müssen diese ebenfalls mit angegeben werden.

Nachdem alles registriert wurde, sollte die Seite weiterhin ohne Einschränkungen funktionieren, nur dass diesmal der TYPO3-Cache von Wincache verwaltet wird.

Hat’s denn was gebracht?

Ich muss ehrlich gestehen, ich war mir nicht sicher, ob das Ersetzen von memcached durch Wincache allzu viel bringen wird. Ich wurde aber aufs positivste überrascht! Die Seite reagierte plötzlich auf Anfragen viel schneller. Vor allem die Startseite wirkte „frischer“.

Da ich aber diesen subjektiven Eindruck durch einen objektiven Beleg untermauern wollte habe ich “ab” (Apache Benchmark Tool) angeworfen. Dieses kleine aber praktische Tool simuliert Anfragen an einen Server und spuckt anschließend eine Statistik aus, wie schnell die Anfragen abgearbeitet werden konnten.

Das Tool sollte am besten auf derselben Maschine ausgeführt werden, auf welcher die Webseite selbst läuft, damit die Statistik nicht durch Netzwerklatenzen verfälscht wird.

Und hier die Ergebnisse:

Um nun 20 Requests zu simulieren, wobei 4 Requests jeweils parallel ausgeführt werden, kann man folgende Einstellung vornehmen:

.ab.exe -n 20 -c 4 http://%5Bhostname%5D/

memcache aktiviert

25.837 seconds (1291.850 [ms]/Request)

Wincache aktiviert

9.500 seconds (475.005 [ms]/Request)

Obendrein skaliert das Ganze auch noch sehr gut, wie man sehen kann:

60 Requests, wobei 12 parallel ausgeführt werden

.ab.exe -c 12 -n 60 http://%5Bhostname%5D/

memcache aktiviert

71.586 seconds (1193.100 [ms]/Request)

Wincache aktiviert

14.645 seconds (244.083 [ms]/Request)

Zusammenfassung

Zusammenfassend kann man sagen, dass der Einsatz von Wincache wirklich einen merklichen Performanceboost bringt. Und das Ganze ist noch dazu einfach zu erreichen! Eine PHP-Datei und einige Konfigurationseinstellungen genügen, um TYPO3 um 200% zu beschleunigen!

Natürlich hängt der Geschwindigkeitszuwachs von der Komplexität der Seite und der Menge an zwischengespeicherten Daten ab und nicht immer ist ein solches Ergebnis zu erreichen, aber wenn ein solch eklatanter Boost der Lohn für die Mühen ist, sollte man es auf einen Versuch ankommen lassen! 😉

Update

Ich habe den Quellcode inzwischen ins Repository von TYPO3 committed (https://review.typo3.org/#/c/10204/) und wer weiß, mit etwas Glück schafft er es vielleicht in ein offizielles Release… 🙂

Tagged , , , , , ,

Da ich selbst eine längere Zeit mit Typo3 gearbeitet habe und einige der Evolutionsstufen von Typo3 hautnah miterlebt habe, möchte ich gerne auf dieses Video hinweisen, welches die optischen Veränderungen der letzten 10 Jahre auf etwas mehr als eine Minute gekürzt zeigt.

Tagged ,