Ein Blog über Code, Hardware und Co

Wordpress und Webentwicklung, NAS, Server und Co

Nutzung und Optimierung des APCu und OPCache

Mit besonderem Augenmerk auf Synology NAS als Webserver.

TL;DR: Was ist eigentlich Caching?

Jedes Mal, wenn ein Besucher eine WordPress-Webseite aufruft, wird eine (oder etliche!) Datenbankabfrage durchgeführt, PHP-Code übersetzt und ausgeführt und letztlich als HTML-Webseite ausgegeben. Dabei sieht eine Webseite doch in der Regel bei jedem Besucher gleich oder zumindest ähnlich aus, oder?

Wieso also nicht das ständige neu-berechnen sparen? Genau hier setzt Caching an. Einmal berechneter Code bzw. berechnete (Zwischen-)Ergebnisse werden zwischengespeichert und können direkt abgerufen werden, wenn sie wieder benötigt werden.

Lokaler- bzw. Browser-Cache vs Server-Cache

Ein lokaler bzw. Browser-Cache speichert eine Webseite bzw. Elemente einer Webseite, z.B. Bilder oder JavaScript lokal auf dem Client-PC zwischen, sodass das Laden der Seite ab dem 2. Aufruf schneller erfolgen kann.

Ein Server-Cache speichert Webseiten oder Zwischenergebnisse bei der Berechnung von Webseiten auf dem Server auf einem schnellen Speicher (SSD oder RAM) zwischen, sodass bei der Berechnung einer Webseite für einen Besucher Zeit gespart werden kann.

PHP mit Hilfe eines Objektcaches beschleunigen

APC

APC-Cache ist quasi der Vorgänger von APCu. APC speichert kompilierten PHP-Quelltext (opcode) in einem Cache und ermöglicht so die beschleunigte Ausführung des Codes. Weiterhin besitzt APC einen eigenen Objektcache. APC ist bei PHP Versionen bis PHP 5.x verbreitet gewesen, seit PHP 7.x kommt in erster Linie APCu – oft in Verbindung mit OPCache – zum Einsatz.

Seit PHP 5.5 hat PHP seinen eigenen opcache (Siehe OPCache). APC ist seitdem nicht mehr kompatibel und wurde durch APCu ersetzt.

APCu

APCu ist ein Objektcache, der PHP Variablen cachen kann. Es werden dabei nur Variablen aus dem Userland gecacht. Man spricht daher auch von einem “User-Cache”.
Es handelt sich bei ACPu um einen “in memory” Cache, der auf key -> value Basis Daten im RAM zwischenspeichert. Dadurch kann eine signifikante Beschleunigung von Webseiten, die PHP verwenden, erreicht werden.

APCu ist eine PHP-Extension und muss für die Nutzung zunächst aktiviert werden. Das geht z.B: über die php.ini Datei mit folgendem Eintrag:

extension=apcu.so

Je nach Implementierung bzw. je nach Anwendung kann eine Webseite noch besonders über eine eigene ACPu-Implementierung profitieren. So können z.B. viele Caching-Plugins (u.A. für WordPress) ihre Cache-Dateien im APCu-Cache und damit im schnellen memory ablegen.

APCu optimieren

APCu ist von Haus aus sehr dankbar und einfach zu konfigurieren. In den allermeisten Fällen reicht ein simples optimieren der Cache-Größe.

APCu bringt “von Haus aus” bereits ein tolles Tool mit, mit dessen Hilfe sich die aktuelle Auslastung des Caches anzeigen lässt: apc.php.
Alternativ ist das Tool hier zu finden: https://github.com/krakjoe/apcu/blob/master/apc.php

Das Ganze sieht dann z.B. so aus:

Bild1: Ein stark fragmentierter und mäßig effektiver APCu-Cache.

Ein nicht genutzter Cache sieht z.B. so aus:

Bild 2: Ein nicht genutzter (aber aktivierter) APCu Cache.

Der APCu-Cache muss als Extension installiert und aktiviert werden. Bei den meisten Webhostern ist APCu jedoch standardmäßig bereits aktiv.

Viel Einstellungsmöglichkeiten gibt es beim APCu-Cahe jedoch nicht. Die einzige in der Praxis sinnvolle Anpassung ist eigentlich die Größe des Cache:

Wann sollte man den APCu-Cache vergößern?
- Wenn die Fragmentierung des Cache sehr groß ist (siehe Bild 1)
- Wenn die Anzahl der "Misses" groß ist (Tendenz)
- Wenn der "Cache Full Count" ansteigt 

Der “Cache Full Count” ist ein guter Indikator dafür, ob der APCu-Cache die richtige Größe hat. Dieser Wert gibt an, wie oft der Cache vollgelaufen und “neu gestartet” worden ist. Dieser Wert sollte möglichst gering sein. Ist er hoch, sollte der Cache vergrößert werden.

APCu ist nicht immer die beste Wahl!

Testen, Testen, Testen ist – wie eigentlich bei allen performancekritischen Änderungen – die Devise. Denn der APCu-Cahe ist keine eierlegende Wollmilchsau, die grundsätzlich alles beschleunigt. Über die Standard-PHP-Implementierung, ist eine sinnvolle Implementierung seitens der verwendeten Software unbedingt anzuraten. Und es sollte unbedingt ein Vorher-Nachher Vergleich angestellt werden.

Ein Beispiel aus der Praxis: Wenn die APCu-Implementierung nicht schneller als der Filesystem Cache ist

Während APCu besonders bei aktuellen WordPress-Installationen einen spürbaren Boost bringt, muss das bei z.B. älteren Anwendungen nicht der Fall sein. Ich nutze z.B. ebenfalls auf einer Webseite das Woltlab Burning Board in der Version 4.1 von 2017. Hier muss die APCu-Unterstützung nachträglich mittels eines Plugins ergänzt werden und bringt – nichts.

Execution Time Filesystem-Cache:

Execuation Time APCu-Cache:

Anmerkung: Man muss dazu sagen, dass der Filesystem-Cache bereits auf einem SSD-Raid liegt und daher bereits ziemlich schnell ist.

OPCache

OPCache muss nicht separat installiert werden, er ist seit PHP 5.5 fester Bestandteil von PHP.

In PHP 7.x muss der OPCache zumindest noch aktiviert werden. Bei den meisten Webhostern ist der OPCache jedoch standardmäßig aktiviert.

Aktivieren (und konfigurieren) kann man den OPCache, indem man folgende Zeilen in der php.ini hinzufügt:

[opcache]
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

Monitoring von OPCache und APCu unter WordPress

Es gibt wie für fast alles ein Plugin für WordPress, das das Monitoring von APCu und dem OPCache erlaubt. Ich nutze dafür die Plugins APCu Manager und OPCache Manager.

Ist der APCu-Cache überhaupt aktiviert? Ist der OPCache überhaupt aktiviert?

Es gibt nun die Menüpunkte “PerfOps Settings” und “PerfOps Analytics” im ACP. Wenn du dort die Einträge für APCu und OPcache siehst, so sind diese zumindest schon einmal aktiv.

Bild: Hier sieht man, dass APCu und OPcache aktiv sind.

Ausführliche Stats und Analyse unter WordPress

Mit den oben genannten Plugins hast du über den Menüpunkt “PerfOps Analytics” eine gute Möglichkeit, den Zustand des APCu und OPcaches zu monitoren und die Einstellungen daraufhin zu optimieren.

Bild: Stats zum verwendeten APCu-Cache.
Bild: Stats zum OPcache.
Bild: Es ist eine Historie von bis zu 3 Monaten möglich.

Alternative, wenn die Webseite nicht mit WordPress läuft

Wenn deine Webseite nicht mit WordPress läuft ist das Monitoring nicht ganz so bequem, aber es lässt sich z.B. über eine php.info-Datei problemlos feststellen, ob APCu und OPCache aktiviert sind (und ob die memcached-Extension installiert ist).

  1. info.php-Datei anlegen ( Einfach eine neue .php-Datei mit folgendem Inhalt erstellen)
    <?phpinfo(); ?>
  2. info.php-Datei im Browser öffnen
  3. Nach APCu bzw. OPCache usw. suchen.

Dass der APCu-Cache aktiviert ist, erkennst du daran, wenn die entsprechende Konfiguration angezeigt wird.

Bild: Anzeige der APCu-Konfiguration in der php.ini-Datei

Selbiges gilt für den OPcache.

Bild: Anzeige der OPcache-Konfiguration in der php.ini-Datei.

Sind die Konfigurationseinträge nicht zu sehen, ist der jeweilige Cache auf diesem Host nicht aktiv.

Komplette Seiten cachen mittels Memcached

Während APCu und OPCache in der Regel Seitenelemente bzw. PHP-Objekte zwischenspeichern und so die Auslieferung dynamischer (mittels PHP erstellter) Webseiten beschleunigen, ist es auch möglich, gleich die komplette fertig berechnete Webseite in einem Cache vorzuhalten.

Der Performancegewinn kann hier enorm sein, es gibt jedoch auch ein paar Grundregeln zu beachten:

  • Gecachte Inhalte sind bei falscher Konfiguration für alle sichtbar!
  • Das Cachen dynamischer Seiten kann zu Problemen bis hin zum Verlust der Dynamischen Inhalte führen.
  • Generell sollten Inhalte die userspezifisch sind und Userdaten enthalten nicht als statische Seiten via Memcached gecached werden.

Die Nutzung von Memcached unter WordPress

Memcached auf einem Synology NAS

Auch auf Webseiten, die mit der WebStation auf einem Synology NAS laufen lässt sich memcached nutzen. Dafür müssen zwei Voraussetzungen gegeben sein:

  • Das NAS muss über ausreichend RAM verfügen
  • Das NAS muss Docker unterstützen (alle NAS mit Intel CPUs ab der “+”-Serie)

Wie kann man nun Memcached auf dem Synology NAS nutzen?

  1. Docker installieren und das Image “memcached” herunterladen/registrieren
  2. Die Ports des Containers anpassen. Der Container-Port ist immer 11211, der lokale Port kann beliebig gewählt werden. Achtung, beim Verbinden musst du entsprechend den lokalen port angeben!
  3. Den Container starten
  4. Mittels der entsprechenden Anwendung (siehe unten) mit dem memcached-Server verbinden
Bild 3: Registrierung des memcached-Images für Docker auf einem Synology NAS.

Mit dem Memcached-Server verbinden

Der große Vorteil ist, dass es für WordPress für nahezu jede erdenkliche Anwendung ein Plugin gibt. So auch hier 😉

Ich nutze das Plugin WP-FFPC.
Sofern die PHP-Memcached-Extension vorhadnen ist und der Memcached Server läuft (hier bitte auf den richtigen Port achten!), teilt uns das Plugin das direkt mit:

Dann im Plugin noch auf die Cache-Methode “PHP Memcached” auswählen.

Das Plugin bietet noch eine ganze Reihe weiterer Einstellungsmöglichkeiten zum Tuning. Diese können wir aber zunächst unangetastet lassen.

Jetzt noch das Caching in WordPress über einen Eintrag in der wp-config.php aktivieren (sofern nicht bereits durch ein Caching-Plugin oder dergleichen gesetzt):

define('WP_CACHE', true);

Achtung: Die Memcached-Erweiterung muss in PHP kompiliert bzw. eingebunden sein. Dies ist z.B. bei den PHP-Versionen, die Synology im Paketzentrum zur Verfügung stellt, nicht der Fall.

Das Ergebnis: Schnell, schneller, Memcached!

Bild 4: Beeindruckender Geschwindigkeitsgewinn durch Memcached.

Ergänzend: Aktivierung des APCu und OPCache auf Synology NAS

Synology NAS bieten von Haus aus mit der “WebStation” eine gute Lösung für das Hosten von Webseiten. Neben der Auswahl mehrerer Webserver steht mit MariaDB ein Datenbankserver zur Verfügung, sowie verschiedene aktuelle PHP-Versionen.

Besonders pracktisch ist, dass sich das Cachen mit der WebStation besonders einfach gestaltet:

Einfach im Einstellungsfenster bzw. bei der Erstellung eines vHosts “PHP-Cache aktivieren” anhaken und sowohl APCu, als auch OPCache werden aktiviert.

Bild 5: Aktivierung von APCu und OPCache auf einem Synology NAS.

TL;DR: Diese Webseite läuft z.B. mit Hilfe der WebStation auf einem Synology NAS 😉

APCu und OPCode: Geschwindigkeitsgewinne in der Praxis

Ich sammle gerade aktuelle Daten, in Kürze findest Du hier einen Vergleich bzw. eine Aufstellung über Geschwindigkeitsgewinne durch APCu und OPCache in der Praxis.

Der Vergleich einiger Webseiten mit und ohne aktivierten OPCache bzw. APCu-Cache:

CMS/SoftwareTTFB BenchmarkGeschwindigkeitsgewinn
Woltlab Burning Board 4.1 (mit APCu)0,9s0,69sBis zu 180%
Woltlab Burning Board 4.1 (ohne APCu)1,555s0,87s
WordPress 5.7 (mit APCu)0,281Bis zu 400%
WordPRess 5.7 (ohne APCu)1,589
Tabelle: Vergleichsergebnisse mit und ohne aktivierten APCu-Cache.

Fazit: Geschwindigkeitsgewinn um bis zu 400%

APCu und OPcache können die TTFB um bis zu 400% (im Falle von WordPress) verbessern. Wow! WordPress scheint also – ggf. dank Optimierungen fürs Caching-Verhalten – besonders von APCu und OPcache zu profitieren. Und auch wenn die TTFB nur ein Teil der Ladezeit einer Webseite ist, so hat sie doch einen gravierenden Einfluss auf das Nutzerverhalten – und wird von google bei der technischen Bewertung von Webseiten zur Hand gezogen.

Screenshots der Tests

Bild: Ladezeit Woltlab Burning Board 4.1 ohne APCu und OPcache.
Bild: Ladezeit Woltlab Burning Board 4.1 mit APCu und OPcache.
Bild: Ladezeit WordPess 5.7 mit APCu und OPcache.
Bild: Ladezeit WordPess 5.7 ohne APCu und OPcache.

Schreibe eine Antwort