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.]