Eine meiner Drupal 7-Sites verfügt über Tausende von Feldern, eine Reihe von Inhaltstypen, mehr als 25 Aufrufe und Hunderte (bald Tausende) Profiltypen. Aus diesem Grund verwende ich einen Kern-Patch, der Entity-Feld-Informationen besser zwischenspeichert (http://drupal.org/node/1040790), und die -dev-Version von Views, die Ansichten besser nach Anzeige zwischenspeichert (anstatt nur einen RIESIGEN zu haben) Views-Cache-Zeile mit allen darin enthaltenen Views-Daten).
Dies hat dazu beigetragen, dass die meisten Seiten der Website mit 20 bis 30 MB RAM anstatt mit 160 MB RAM geladen wurden (anstatt cache_ * -Tabellenzeilen für Felder und Ansichten mit mehr als 10 MB aufzurufen, sorgen die Patches dafür, dass cache_ * -Daten effizienter bleiben).
Dies führt jedoch zu dem Problem, dass Cache-Neuerstellungen sehr lange dauern . In der Regel länger als ein oder zwei Minuten. Während dieser Zeit lädt Drupal einfach keine Seiten (da die Caches, aus denen es zu lesen versucht, noch nicht erstellt wurden, müssen andere Anforderungen warten).
In verkehrsarmen Zeiten ist dies keine große Sache. Etwa hundert Benutzer müssen lediglich eine Minute warten, bevor die Seite geladen wird. Bei Zyklen mit hohem Datenverkehr wird der Apache-Server jedoch mit einer CPU-Auslastung von über 40 verrückt, und der Arbeitsspeicher wird schnell voll, da alle Worker-Threads warten und ihren Arbeitsspeicher maximal ausnutzen, wodurch ein Auslagern verursacht wird. Es ist eine Art Todesspirale. Ein Neustart von httpd klärt die Dinge, aber es dauert 5-10 Minuten, bis die Dinge wieder normal sind.
Mein Ziel ist es, den Cache so zu löschen, dass die Site nicht in die Knie gezwungen wird. Wenn ich zum Beispiel die einzelnen Cache-Löschfunktionen von admin_menu verwende (wie "CSS und JS", dann "Menü", dann "Themenregistrierung" usw.), laufen die Dinge reibungslos, bis ich die Option "Seite und sonst" drücke. In diesem Fall wird der Cache der Ansichten zurückgesetzt (eine sehr CPU- und datenbankintensive Operation mit der Anzahl der Ansichten, die zwischengespeichert werden müssen), und der Feldinformationscache wird zurückgesetzt (der auf dieser Site auch CPU- und datenbankintensiv ist).
Also ... meine Fragen / Ideen:
- Kann ich mithilfe von Drush- und / oder anderen Shell-Skripten die Caches intelligenter löschen als "alle Caches auf einmal sprengen und auf eine saubere Neuerstellung hoffen"?
- Kann ich http-Anfragen blockieren, während der Cache geleert wird, damit der Apache nicht durch eine Reihe von Cache-Stamping-Anfragen verstopft wird?
- Wenn ich Caches außerhalb von Drupal / normalen httpd-Anforderungen löschen kann, könnte ich vermutlich ein höheres PHP-memory_limit für den Cache-Clear-Vorgang festlegen und mein universelles memory_limit zurücksetzen (zurzeit auf 256 MB festgelegt, falls ein einzelner httpd-Thread Caches löschen muss) ...).
Grundsätzlich gilt: Gibt es eine intelligente und elegante Möglichkeit, alle Caches mit Drupal zu löschen, außer einfach auf die Schaltfläche in der Benutzeroberfläche zu klicken oder zu verwenden drush cc all
?
[ Zur Klarstellung bearbeiten : Das Hauptproblem, das ich habe, sind Cache-Neuerstellungen , die (a) eine Weile dauern und (b) alle anderen Anforderungen blockieren, bis die Neuerstellungen abgeschlossen sind. Ich würde gerne einen Weg finden, es zu schaffen, damit die Umbauten in Zeiten mit hohem Verkehrsaufkommen nicht so tödlich sind.]
quelle
Antworten:
Das Cache- Aktionsmodul erledigt das. Es kommt auf die Regel an. Beispielsweise können Sie eine Regel einrichten, um eine bestimmte Ansicht zu löschen, wenn ein Knoten vom Typ "x" hinzugefügt oder aktualisiert wurde. Weitere Informationen finden Sie in den Dokumenten .
Schauen Sie sich auch das Cache- Modul an, das noch nicht ausprobiert wurde, aber interessant aussieht.
quelle
drush cc [type]
für das Löschen des Caches (ähnlich wie bei Cache-Aktionen), bin jedoch mehr daran interessiert, Wege zu finden, um den Cache ordnungsgemäß zu löschen und sicherzustellen, dass andere httpd-Threads den Apache-Server nicht töten.Das Hauptproblem ist, dass Sie MySQL zum Speichern von Cache-Daten verwenden - für Websites mit hoher Auslastung ist dies eine sehr ineffektive Lösung.
Ich empfehle, stattdessen Memcache zu verwenden. Dies erhöht die Leistung des Cache-Systems erheblich und bietet Ihnen zwei große Vorteile:
Hier ist ein Beispiel für die Memcache-Konfiguration für Drupal 7.
quelle
Wenn Sie nicht alle Caches sprengen möchten, verwenden Sie:, um
drush cc type_of_cache
einen bestimmten zu löschen, oder definieren Sie Ihren eigenen.Alternativ können Sie alle cacheartigen Tabellen manuell löschen, z
Wenn Sie memcached (Bash-Syntax) verwenden, versuchen Sie Folgendes:
Aktivieren Sie den Wartungsmodus (
drush -y vset maintenance_mode 1
), um zu verhindern, dass Personen auf die Site zugreifen. Oder konfigurieren Sie das Front-End so, dass es an eine andere Stelle umleitet (z. B. in Varnish, in Apache umleiten oder ändern.htaccess
).Das Löschen des Caches beansprucht nicht mehr Speicherplatz, aber das Wiederherstellen des Caches nach dem Löschen benötigt mehr Speicherplatz. Sie können die Caches jederzeit aufwärmen, indem Sie cron ausführen oder eine Seite öffnen, z
Geben Sie
-n
an, dass diephp.ini
Verarbeitung ignoriert werden soll, wodurch der Cache-Löschvorgang zusätzlich beschleunigt werden kann.quelle
Möglicherweise sind damit Geldkosten verbunden, aber Sie können ein Caching-Server-Setup wie Varnish verwenden. Der Vorteil ist, dass Varnish Ihre Site bedient, während der Cache auf dem Produktionsserver geleert wird, ohne dass der Benutzer der Klügere ist.
Der Nachteil: Abhängig von der Anzahl der Sekunden / Minuten Ausfallzeit des Produktionsservers im Vergleich zu Ihren VCL-Timeout-Einstellungen wird Varnish möglicherweise während dieser Zeit aktualisiert und es wird ein Varnish 503-Fehlerbildschirm angezeigt.
Dieser Ansatz zusammen mit Redis oder Memcache kann jedoch hilfreich sein.
quelle