Auf einer meiner Seiten drush cc all
dauert das Laufen mehr als 4 Minuten. Die Site db ist ein paar GB. Ich kann jedoch keinen klaren Grund dafür erkennen, warum es zu lange dauert. Was kann ich tun, um den Flaschenhals zu lokalisieren?
Auf einer meiner Seiten drush cc all
dauert das Laufen mehr als 4 Minuten. Die Site db ist ein paar GB. Ich kann jedoch keinen klaren Grund dafür erkennen, warum es zu lange dauert. Was kann ich tun, um den Flaschenhals zu lokalisieren?
Antworten:
Das Löschen des Caches selbst dauert nicht lange, da nur Cachetabellen abgeschnitten werden. Was die meiste Zeit in Anspruch nimmt, ist die anschließende Neuerstellung der Cache-Registrierung. Normalerweise ist es die Themenregistrierung, die nach allen neuen Hooks und allen Ihren Drupal-Ordnern nach neuen Vorlagendateien sucht, das System, das Dateien nach den neuen Modulen und Klassendateien durchsucht, und ähnliches.
Sie können jederzeit einen bestimmten Cache löschen, indem Sie einen drush cc theme-registry
oder einen anderen angeben .
Es wird dringend empfohlen, den PHP-Caching-Mechanismus (z. B. OPCache, XCache usw.) zu verwenden, um die Verarbeitung zu beschleunigen. Und ein Cache auf Speicherbasis, um die starke Auslastung von SQL-Tabellen (z. B. zwischengespeichert oder redis) zu ersetzen, sodass das Löschen des Caches nur durch Leeren des Caches (z echo flush_all > /dev/tcp/127.0.0.1/11211
. B. in Bash) schnell erledigt werden kann.
Alternativ können Sie den Cache jederzeit manuell löschen , z. B .:
echo "SHOW TABLES LIKE 'cache%'" | $(drush sql-connect) | tail -n +2 | xargs -L1 -I% echo "DELETE FROM %;" | $(drush sql-connect) -v
Um zu überprüfen, was die meiste Zeit in Anspruch nimmt, müssen Sie es debuggen / profilieren (z. B. XDebug, XHProf, phpdbg, dtrace).
Unter OS X / Unix, kann dies erreicht werden durch dtrace
(nach dem Laufen drush
):
sudo dtrace -qn 'php*:::function-entry { printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }'
Verwenden Sie unter Linux strace
z
strace -e trace=sendto,recvfrom -s1000 -p $(pgrep php)
Zur Suche nach einig speziellen Dingen, versuchen Sie , zum Beispiel: strace ... 2>&1 | grep -C5 UPDATE
.
Wenn Sie eine sehr große Datenbank haben und Ihr System einwandfrei läuft, wenn Sie keinen Cache löschen, ist es wahrscheinlich, dass Sie nicht genug Speicher haben, um Ihr Setup vollständig zu unterstützen.
Wenn Ihre Site auf einer Linux-Box ausgeführt wird, führen Sie 'top' (von Ihrer Shell aus) aus und drücken Sie Umschalt-M, um die Prozessliste nach verwendetem Arbeitsspeicher zu sortieren. Führen Sie dann die Cache-Löschoperation von einem anderen Terminal aus. Sie sollten sehen, dass MySQL und Apache an die Spitze der Liste aufsteigen. Sie können sehen, wie viel Prozent des Gesamtspeichers jeder dieser Prozesse belegt und wie viel freier Arbeitsspeicher verwendet wird. Wenn Sie über einen großen virtuellen Speicherplatz verfügen, aber der gesamte physische RAM-Speicher erschöpft ist, kann dies dazu führen, dass der VM-Speicher überlastet wird. Dadurch kann die Ausführungszeit auf einen Bruchteil der normalen Zeit verkürzt werden.
Einmal habe ich eine Drupal-Site mit mittlerem Datenverkehr auf einer Box ausgeführt, auf der nicht genügend Arbeitsspeicher vorhanden war, um das Setup zu unterstützen. Wenn ich ein Cache-Clearing auf einer nicht verwandten Site mit geringem Datenverkehr durchführte, hat die Cache-Neuerstellung das System an seine Grenzen gebracht und alles andere als gesperrt. Das Gesamtsystemverhalten ist hier also wichtig. Aus diesem Grund sind einfache Tools wie 'top' ein praktischer Ausgangspunkt.
Ich werde (etwas) mit @ greg_1_anderson hier nicht einverstanden sein.
Wenn das System während eines nicht vollständig abstürzt, liegt meines Erachtens cc all
kein allgemeines Speicherproblem vor. Wenn einem LAMP-Server der Speicherplatz ausgeht, wird Swap aktiviert. Ein aktiver Server, der Swap schlägt, führt zu einer Unzulänglichkeitsrate. httpd-Prozesse beginnen sich aufgrund von Systemverlangsamung zu stapeln (Swap bewirkt, dass ein System sehr langsam läuft), was dazu führt, dass mehr Swap-Prozesse verwendet werden. und eine Tonne aktiver httpd-Prozesse.
Wenn Ihr System irgendwann wiederkommt, sind Sie meiner Meinung nach schlecht eingestellt. drush cc all
wird zu einer Menge von Datenbankzugriffen führen, so dass ich denke, dass es das Problem mehr zeigt. Mein Vorschlag wäre, mysqltuner auf der Site auszuführen . Wenn Sie ein Multi GB Datenbank haben, meine Vermutung ist , dass Ihr innodb_buffer_pool_size
nicht einmal fern richtig dimensioniert und Ihre MySQL - Instanz ist Dreschen. Ich würde auch ein alternatives Cache-Backend untersuchen, um zu versuchen, den Datenbank-Footprint kleiner zu halten.
Es könnte Ihre Webhosting-Umgebung sein. Beziehen Sie sich auf ein lokales Setup oder auf ein Hosting auf Shared Hosting oder einen VPS / Server?
max_execution_time
. Sie können dies drush php-eval "print ini_get('max_execution_time');"
jedoch überprüfen.
Dies ist keine vollständige Lösung, sondern nur ein weiteres Tool, mit dem Sie die Ursache Ihrer Verzögerungen ermitteln können.
Neben der Verwendung top
Prozesse zu überwachen, könnten Sie die Ausgabe finden mytop
informativ. (Andere Antworten setzen MySQL voraus, aber wenn Sie ein anderes DB-Backend verwenden, müssen Sie mytop gegen ein gleichwertiges Tool austauschen.)
mytop
Führt MySQL einfach SHOW FULL PROCESSLIST
in einer Schleife aus und zeigt Ihnen, welche Abfragen ausgeführt werden (was also viel Zeit in Anspruch nimmt). Wenn es lange dauert, bis der Cache geleert ist, werden Sie hier genau sehen, worauf es ankommt. Wenn Sie keinen Zugang zur Installation haben mytop
, machen Sie einfach eine grobe Version in Ihrer Shell -
while true; do mysql -e 'SHOW FULL PROCESSLIST' && sleep 5 && clear ; done
Wenn die Verzögerung nicht auf MySQL-Abfragen zurückzuführen ist, kann dieses Tool dies zumindest für Sie bestätigen.
Ich fand einen Blog-Beitrag mit dem Titel "Cache-Löschung beschleunigen" auf Drupal 7 sehr hilfreich, um genau einzugrenzen, welcher Teil des Cache-Löschvorgangs die Dinge verlangsamte. Die Probleme, die im Funktionsmodul und im Entity-API-Modul festgestellt wurden, betrafen meine Website. Der in diesem Beitrag beschriebene Prozess half mir jedoch auch dabei, Probleme im Drupal-Kern- und Haltepunktmodul aufzuspüren .
Es dauert einige Zeit, bis der Prozess abgeschlossen ist, aber es hat mir geholfen, das Leeren des Caches von mehreren Minuten auf unter eine Minute zu reduzieren.