Der Befehl "drush cc all" dauert zu lange. Was kann ich tun?

12

Auf einer meiner Seiten drush cc alldauert 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?

ahm
quelle
Überprüfen Sie das erste MySQL-Abfrageprotokoll: drupal.stackexchange.com/questions/75629/…
AgA
Hast du Cron am Laufen?
mpdonadio
Ja, ich habe einen Cron am Laufen. Die Seite ist im Allgemeinen langsam. So viele Legacy-Codes, die es nicht wert sind, neu berechnet zu werden.
awm
Ich stimme @MPD hier zu, ich glaube nicht, dass dies mit dem Speicher zusammenhängt. MySQL ist auch nur einer der möglichen Gründe. Es gibt nur einen Weg, das herauszufinden, und das ist, es zu profilieren. Der einfachste Weg, dies zu tun, ist die Verwendung der xhprof-Erweiterung und -Entwicklung, die auch mit drush funktioniert (verwenden Sie -d, um den Link zum Bericht anzuzeigen). Ich vermute, dass es eine Reihe von Problemen gibt. Ein typisches Problem, wenn die Website für alle Anfragen langsam ist, sind fehlende Module, siehe drupal.stackexchange.com/questions/724/why-is-drupal-7-so-slow . Views hat auch einige wichtige Performance-Probleme mit Caches, siehe drupal.org/node/1944674 .
Berdir
Vielen Dank, ich dachte mir, dass ich ein Profil erstellen muss, aber im Falle einer Drupal-Codebasis ist es immer schwierig, den Engpass zu lokalisieren. Obwohl ich sagte, die Website ist langsam, es ist nicht zu langsam und drush cc alle, ist unverhältnismäßig langsamer.
Awm

Antworten:

6

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-registryoder 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

Debuggen

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 stracez

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.

Kenorb
quelle
5

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.

greg_1_anderson
quelle
Vielen Dank, ich denke, die Ursache ist, dass die Site schon eine Weile existiert, die Datenbank ein bisschen groß ist und der Code schrecklich neu faktorisiert werden muss. Beispielsweise dauert eine node_delete-Operation ungefähr 3 Sekunden. Ich denke, dass es überflüssig sein kann, zu viel Speicher zu geben, stimmst du zu?
Awm
Ich habe es auf meiner Maschine und es ist auch langsam. Ich habe die Speicherkapazität auf 1 GB verdoppelt und zeitlich festgelegt, "Zeit drush cc all". Nicht viel besser wurde nur 4s schneller.
Awm
1
Ja, wenn die gesamte Site trotz viel Arbeitsspeicher immer langsam ist, ist cc nicht das Problem. Sie müssen eine allgemeinere Profilerstellung durchführen.
greg_1_anderson
Wenn die Site sehr alt ist und eine Aktualisierung benötigt, sollten Sie eine Neuerstellung mit neuen Modulen in Betracht ziehen und die Migration von Drupal zu Drupal ( drupal.org/project/migrate_d2d ) verwenden, um den Inhalt zu verschieben.
greg_1_anderson
2

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 allkein 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 allwird 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_sizenicht 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.

mpdonadio
quelle
Danke, Drupal wird nur für redaktionelle Zwecke verwendet, die eine Servie-Ebene haben, die Lackinformationen enthält. Benutzer kommen jetzt zu Drupal. Ich möchte nur untersuchen, was passiert, weil ich denke, dass es einen Engpass gibt. Ich denke, meine beste Wette ist, das langsame MySQL-Protokoll einzuschalten und die Datenbank zu überwachen. Und dann mach ein wenig Profilerstellung mit xdebug
awm
SHOW FULL PROCESSLIST zeigt an, was passiert, ohne dass ein langsames Abfrageprotokoll verwendet werden muss (und dies ohne Neustart des Servers). Siehe auch die andere Antwort für mytop.
Chris Burgess
1

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?

  • Hosting-Umgebung - Wenn Sie ein Shared-Web-Hosting-System verwenden, ist der von Drupal / drush zur Verfügung gestellte Speicherplatz begrenzt (siehe: https://drupal.org/node/207036)
  • maximale Ausführungszeit - muss erhöht werden
geekgirlweb
quelle
Drush ist normalerweise nicht begrenzt durch max_execution_time. Sie können dies drush php-eval "print ini_get('max_execution_time');"jedoch überprüfen.
mpdonadio
1

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 topProzesse zu überwachen, könnten Sie die Ausgabe finden mytopinformativ. (Andere Antworten setzen MySQL voraus, aber wenn Sie ein anderes DB-Backend verwenden, müssen Sie mytop gegen ein gleichwertiges Tool austauschen.)

mytopFührt MySQL einfach SHOW FULL PROCESSLISTin 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.

Chris Burgess
quelle
1

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.

Matt V.
quelle