Wie Sie Drupal mit den richtigen Caches beschleunigen: OPcache, APCu und ein gemeinsames Backend (Redis oder Memcached)
Wenn Ihre Drupal-Website langsam ist, ist Caching normalerweise die Lösung. Allerdings keine einzelne Lösung. Verschiedene Ebenen lösen unterschiedliche Probleme. Deshalb tauchen OPcache, APCu und ein gemeinsames Backend wie Redis oder Memcached oft zusammen auf. Jeder beschleunigt einen bestimmten Teil des Stacks. Nutzen Sie sie gut und Drupal wird reaktionsschnell. Nutzen Sie sie schlecht und es schleppt immer noch.
Warnung: Wählen Sie ein gemeinsames Backend für Drupal-Cache-Bins. Verwenden Sie Redis oder Memcached, nicht beides für dieselben Bins.
Auf einen Blick: Muss man tun vs. Fortgeschritten
- Muss man tun: Aktivieren Sie OPcache in PHP. Aktivieren Sie APCu für lokale Caches. Wählen Sie ein gemeinsames Backend für Bins in Multi-Server-Setups.
- Fortgeschritten: Ordnen Sie spezifische Bins zu, stimmen Sie Redis-Client-Timeouts ab, passen Sie die Memcached-Elementgröße an, komprimieren Sie große Redis-Werte, dimensionieren Sie Pools basierend auf der tatsächlichen Nutzung.
Schneller Entscheidungsleitfaden
Setup | Muss man tun | Gemeinsames Backend | Am besten geeignet für | Hinweise |
---|---|---|---|---|
Einzelner Server | OPcache + APCu | Optional | Kleine Websites auf einem Knoten | DB-Cache kann ausreichen. Fügen Sie Redis oder Memcached hinzu, wenn der Traffic wächst. |
Mehrere Server | OPcache + APCu | Redis oder Memcached | Lastverteilte Cluster | Verwenden Sie ein gemeinsames Backend für render, dynamic page cache, page, default, data. |
Hohe Variabilität des Inhalts | OPcache | Redis | Komplexe Tagging- und Invalidierungsmechanismen | Strukturen und Persistenzoptionen helfen. |
Schlank und einfach | OPcache | Memcached | Reines Caching mit minimalem Overhead | Sehr schnell, von Natur aus flüchtig. |
Was jeder Cache tut
- OPcache: Beschleunigt PHP selbst, indem kompilierte Skripte zwischengespeichert werden.
- APCu: Lokaler Key-Value-Cache pro Server für winzige Lookups.
- Redis: Gemeinsamer In-Memory-Datenspeicher für Caches, Queues, Locks, Sessions.
- Memcached: Gemeinsamer In-Memory-Key-Value-Cache, sehr einfach und schnell.
Wie diese in Drupal passen
- OPcache: Auf der PHP-Ebene aktivieren. Kein Drupal-Modul.
- APCu: Lokale Caches und Bootstrap-Daten bereitstellen.
- Redis oder Memcached: Ordnen Sie render, dynamic page cache, page, default, data dem gemeinsamen Backend zu. Unterstützt auch Sessions, Locks und Queues.
Verwandt: State Cache (Drupal 10.3+, standardmäßig in Drupal 11 aktiviert). Details finden Sie im separaten Beitrag: Beschleunigen Sie das Drupal-Backend mit $settings['state_cache']
.
Profi-Tipp: Behalten Sie in Multi-Server-Setups bootstrap in APCu für extrem niedrige Latenzzeiten und verschieben Sie den Rest in das gemeinsame Backend.
settings.php Schnellrezepte
Einfügen und dann anpassen.
Redis
Drupal-Integration
$settings['container_yamls'][] = 'modules/contrib/redis/redis.services.yml';
$settings['redis.connection']['interface'] = 'PhpRedis';
$settings['redis.connection']['host'] = '127.0.0.1';
$settings['redis.connection']['port'] = 6379;
$settings['cache']['default'] = 'cache.backend.redis';
$settings['cache']['bins']['render'] = 'cache.backend.redis';
$settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.redis';
$settings['cache']['bins']['page'] = 'cache.backend.redis';
Performance-Tuning
// Optionale Komprimierung
$settings['redis_compress_length'] = 100;
$settings['redis_compress_level'] = 1;
// Client-Timeouts (PhpRedis)
$settings['redis.connection']['timeout'] = 1.0;
$settings['redis.connection']['read_timeout'] = 1.0;
$settings['redis.connection']['retry_interval'] = 100;
$settings['redis.connection']['persistent'] = TRUE;
- container_yamls: Registriert Redis-Dienste.
- interface: Wählt den Client aus. PhpRedis ist eine native Erweiterung.
- host/port: Gibt das Verbindungsziel an. Bevorzugen Sie einen Unix-Socket auf demselben Host.
- cache.default: Legt das Standard-Backend für nicht zugeordnete Bins fest.
- bins: Ordnet spezifische Bins Redis zu.
- compress_length/level: Komprimiert große Werte, um Speicher zu sparen.
- timeouts/persistent: Legt Verbindungs-/Lese-Timeouts fest und gibt Verbindungen wieder.
Memcached
Drupal-Integration
$settings['container_yamls'][] = 'modules/contrib/memcache/memcache.services.yml';
$settings['memcache']['servers']['127.0.0.1:11211'] = 'default';
$settings['memcache']['bins']['render'] = 'default';
$settings['memcache']['bins']['dynamic_page_cache'] = 'default';
$settings['memcache']['bins']['page'] = 'default';
$settings['cache']['default'] = 'cache.backend.memcache';
- container_yamls: Registriert Memcache-Dienste.
- servers: Definiert die Serverliste und den Poolnamen.
- bins: Ordnet Bins einem Pool zu.
- cache.default: Legt das Standard-Backend für nicht zugeordnete Bins fest.
APCu für lokale Bins
// Erfordert das APCu-Backend-Modul
$settings['cache']['bins']['bootstrap'] = 'cache.backend.apcu';
- bootstrap: Hält heiße Bootstrap-Daten im Prozess für geringste Latenz.
Laufzeit-/Servereinstellungen (außerhalb von settings.php)
PHP-Einstellungen (php.ini)
OPcache
opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=192
opcache.max_accelerated_files=16229
opcache.validate_timestamps=0
opcache.revalidate_freq=0
opcache.interned_strings_buffer=16
opcache.fast_shutdown=1
opcache.enable
: Schaltet OPcache für FPM oder Apache ein.opcache.enable_cli
: Hält OPcache für CLI ausgeschaltet.opcache.memory_consumption
: Weist einen Speicherpool für kompilierte Skripte zu.opcache.max_accelerated_files
: Legt die Größe der Hashtabelle fest.opcache.validate_timestamps
: Überprüft Dateizeitstempel auf Änderungen. Auf 0 für Build-Once-Deployments setzen.opcache.revalidate_freq
: Legt die Sekunden zwischen Zeitstempelprüfungen fest, wennvalidate_timestamps
= 1 ist.opcache.interned_strings_buffer
: Weist Speicher für gemeinsam genutzte Zeichenketten zu.opcache.fast_shutdown
: Ermöglicht eine schnellere Anforderungsbeendigung.
APCu
apc.enabled=1
apc.enable_cli=0
apc.shm_size=128M
apc.ttl=0
apc.gc_ttl=3600
apc.enabled
: Schaltet APCu für FPM ein.apc.enable_cli
: Hält APCu für CLI ausgeschaltet.apc.shm_size
: Legt den gesamten gemeinsam genutzten Speicher fest.apc.ttl
: Legt die Standard-TTL für Einträge fest.apc.gc_ttl
: Legt fest, wie lange verwaiste Einträge aufbewahrt werden.
Redis-Server (redis.conf)
maxmemory 2gb
maxmemory-policy allkeys-lru
timeout 1
tcp-keepalive 60
maxmemory
: Legt die Speichergrenze fest.maxmemory-policy
: Legt das Evictions-Verhalten fest, wenn der Speicher voll ist.timeout
: Legt die Leerlauf-Client-Zeitüberschreitung in Sekunden fest.tcp-keepalive
: Legt das Intervall für Keepalive-Sonden fest.
Memcached-Server (Flags)
memcached -m 2048 -I 4m -f 1.25 -o slab_reassign,slab_automove
-m
: Legt den gesamten Speicher in MB fest.-I
: Legt die maximale Elementgröße fest.-f
: Legt den Wachstumsfaktor für Slab-Klassen fest.-o slab_reassign,slab_automove
: Aktiviert die Slab-Neuzuordnung.
Schnelle Regeln zur Dimensionierung
Cache | Schlüsseleinstellung | Schnelle Regel (MB) |
---|---|---|
OPcache | opcache.memory_consumption | MB = (Codebasis_MB × 3) + 32 |
OPcache | opcache.max_accelerated_files | ≈ 1,5 × PHP-Dateien (verwenden Sie 10000, 16229, 32531) |
APCu | apc.shm_size | MB ≈ (Schlüssel × (durchschnittliche_Elementgröße_Bytes + 100) × 1,2) ÷ 1.000.000 |
Redis | maxmemory | MB ≈ (Elemente × (durchschnittliche_Elementgröße_Bytes + 50) × 1,3) ÷ 1.000.000 |
Memcached | -m | MB ≈ (Elemente × durchschnittliche_Elementgröße_Bytes × 1,3) ÷ 1.000.000 |
Memcached | -I | Beginnen Sie mit 4 MB; erhöhen Sie bei Bedarf |
Gängige Mythen
- Mythos: OPcache speichert HTML zwischen — Wahrheit: Es speichert kompilierten PHP-Code zwischen.
- Mythos: APCu funktioniert serverübergreifend — Wahrheit: Es ist lokal auf einen Serverprozess beschränkt.
- Mythos: Redis ist immer besser als Memcached — Wahrheit: Wählen Sie basierend auf den Anforderungen.
- Mythos: Cache-Misses bedeuten, dass etwas kaputt ist — Wahrheit: Misses passieren und wärmen sich mit dem Traffic auf.
Schnelle Einrichtungscheckliste
- OPcache:
- Aktivieren Sie die Erweiterung in PHP.
- Passen Sie Speichergröße und Revalidierungseinstellungen für die Produktion an.
- Stellen Sie sicher, dass
opcache.memory_consumption
ausreicht, um Ihre Codebasis zu speichern.
- APCu:
- Installieren Sie die PHP-Erweiterung.
- Bestätigen Sie CLI- und FPM-Einstellungen, wenn Sie beides ausführen.
- Dimensionieren Sie
apc.shm_size
mit Spielraum, um Evictions zu vermeiden.
- Redis:
- Installieren Sie den Server und die PHP-Erweiterung.
- Fügen Sie das Drupal Redis-Modul hinzu und ordnen Sie die richtigen Cache-Bins zu.
- Legen Sie Client-Timeouts fest und berücksichtigen Sie Sessions, Locks und Queues.
- Memcached:
- Installieren Sie den Server und die PHP-Erweiterung.
- Fügen Sie das Drupal Memcache-Modul hinzu und ordnen Sie die gewünschten Bins zu.
- Legen Sie
-I
für die maximale Elementgröße fest; stellen Sie sicher, dass die Anwendung Cache-Verlust toleriert.
Vermeiden Sie diese Fallen
- Vermeiden Sie es, Redis und Memcached für denselben Bin zu mischen.
- Vermeiden Sie Unterdimensionierung von Caches. Achten Sie auf Evictions und Trefferraten.
- Vermeiden Sie Über-Caching. Konzentrieren Sie sich auf teure, wiederverwendbare Daten.
- Vermeiden Sie die Beschädigung der Invalidierung. Beachten Sie Cache-Tags und Kontexte.
So messen Sie den Erfolg
- Antwortzeit-Trends: Die Zeit bis zum ersten Byte sollte nach dem Aufwärmen sinken.
- Datenbanklast: Weniger Abfragen pro Anfrage und geringere CPU-Auslastung der Datenbank.
- Trefferrate: Verfolgen Sie die Cache-Trefferraten. Wenn die Trefferraten niedrig bleiben, überprüfen Sie die Bin-Zuordnung und die TTLs.
- Fehlerprotokolle: Achten Sie auf Verbindungsfehler oder Timeouts von Redis oder Memcached.
Abschließende Gedanken
Beginnen Sie mit OPcache, fügen Sie APCu hinzu und dann Redis oder Memcached für gemeinsame Bins. Halten Sie es einfach, messen Sie die Ergebnisse und optimieren Sie.