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 , , , , , ,

10 thoughts on “TYPO3 unter Windows mit Wincache beschleunigen

  1. lemiel says:

    Are you using IIS or Apache?
    And with which version of Typo3 are you using?
    https://review.typo3.org/#/c/10204/ is targeted to 6.0 so only manual patching for lower versions is possible now😦

    • tobiburger says:

      TYPO3 6.0 is the next Version after 4.7. So yes, since then manual patching is needed. Sorry, I don’t have any real answer to that. The approvement of my code submission depends on the core developers.
      In the meantime you could write an extension containing this code and which configures the TYPO3_CONF_VARS and easily disable it (or write some conditional code) when this patch gets into a production release.

      • Alex says:

        Es gibt auch eine Alternativmöglichkeit: Eine Mini-Extension bauen welche dein Backend nutzt.
        Dann einfach per Typoscript irgendein Cachebackend überschreiben. zb so:
        config.tx_extbase.objects.t3lib_cache_backend_ApcBackend.className = Tx_Wincache_Backend

        Im Beispiel überschreibe ich das APC Backend mit dem Wincache Backend.
        Wenn du dann im TYO3_CONF_VARS das APC Backend einstellst sollte das Wincache Backend verwendet werden.

        Werde es Montag mal testen und bei bedarf ins TER stellen.

        Grüße
        Alex

      • tobiburger says:

        Hallo Alexander,

        für TYPO3 6.0 wird das gar nicht mehr nötig sein, dort ist das Wincache-Backend enthalten: https://github.com/typo3/TYPO3v4-Core/blob/master/typo3/sysext/core/Classes/Cache/Backend/WincacheBackend.php. Dann muss man lediglich die Konfigurationsdatei anpassen.
        Aber für aktuelle TYPO3-Projekte ist das sicher eine super Lösung!

        Grüße
        Tobias

  2. lemiel says:

    Which version of Typo3 are you using with this patch (in review targete to 6.0 what is not nice)? And with IIS or Apache?
    Performance improvement is very noticeable.

    • tobiburger says:

      Hi lemiel,
      I have tested it with TYPO3 4.3.14 (!) using IIS 7.5.
      I’ve never tested it on Apache, but it should also result in some improvements on that server, altough I think – and that’s my personal opinion – that IIS is (at least since IIS 7.0) the better plattform running PHP on Windows.
      Would be nice to see if other people have also experienced this scale of performance improvements.

  3. lemiel says:

    I have few sites with 4.4. and 4.5, will try it next days with newest dev version of Wincache because of problems with updating extensions and cacheing problems with 4.6 -similar to these http://forums.iis.net/p/1169832/1951086.aspx
    I will comment it here.

  4. Jonas Felix says:

    How Did you solve the issue, that wincache only allows 85MB of caching?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: