web-dev-qa-db-fra.com

La commande `drush cc all` prend trop de temps, que puis-je faire?

Sur un de mes sites drush cc all prend plus de 4 minutes pour s'exécuter. Le site db fait quelques Go. Cependant, je ne vois pas de raison claire pour expliquer pourquoi cela prend trop de temps. Que puis-je faire pour localiser le goulot de la bouteille?

12
awm

L'effacement du cache lui-même ne prend pas longtemps, car il s'agit simplement de tronquer les tables de cache. Ce qui prend le plus de temps, c'est de reconstruire le registre de cache après cela. Habituellement, c'est le registre de thèmes qui analyse tous les nouveaux crochets et tous vos dossiers Drupal pour les nouveaux fichiers de modèle, système qui analyse les fichiers pour les nouveaux modules et les fichiers de classe, etc.).

Vous pouvez toujours vider un cache spécifique en spécifiant drush cc theme-registry ou tout autre.

Il est fortement recommandé d'utiliser PHP mécanisme de mise en cache (par exemple OPCache, XCache, etc.) pour accélérer le traitement. Et cache de base de mémoire pour remplacer une utilisation intensive sur les tables SQL (par exemple memcached ou redis ), donc l'effacement du cache ne prendrait pas de temps, simplement en vidant le cache (par exemple echo flush_all > /dev/tcp/127.0.0.1/11211 dans Bash).

Alternativement, vous pouvez toujours vider le cache manuellement , par exemple par:

echo "SHOW TABLES LIKE 'cache%'" | $(drush sql-connect) | tail -n +2 | xargs -L1 -I% echo "DELETE FROM %;" | $(drush sql-connect) -v

Débogage

Pour vérifier ce qui prend le plus de temps spécifiquement, vous devez debug /le profiler (par exemple XDebug, XHProf, phpdbg, dtrace).

Sous OS X/Unix, cela peut être réalisé par dtrace (après avoir exécuté 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); }'

Sous Linux, utilisez strace, par exemple.

strace -e trace=sendto,recvfrom -s1000 -p $(pgrep php)

Pour rechercher des éléments spécifiques, essayez d'ajouter par exemple: strace ... 2>&1 | grep -C5 UPDATE.

6
kenorb

Si vous disposez d'une base de données très volumineuse et que votre système fonctionne correctement lorsque vous n'effacez pas le cache, il est probable que vous ne disposiez pas de suffisamment de mémoire pour prendre pleinement en charge votre configuration.

Si votre site fonctionne sur une machine Linux, exécutez 'top' (à partir de votre shell) et appuyez sur shift-M pour trier la liste des processus en fonction de la mémoire utilisée. Ensuite, exécutez votre opération d'effacement du cache à partir d'un autre terminal. Vous devriez voir mysql et Apache monter en haut de la liste. Vous pourrez voir quel pourcentage de la mémoire totale chacun de ces processus utilise et combien d'espace libre RAM est utilisé. Si vous avez une grande quantité d'espace virtuel, mais tout votre physique RAM est épuisée, cette opération peut provoquer le thrash de la mémoire VM), ce qui peut réduire votre temps d'exécution à une petite fraction de ce qu'il est normalement.

Une fois, j'exécutais un site à trafic moyen Drupal site sur une boîte sans-assez de mémoire pour prendre en charge la configuration. Lorsque j'ai exécuté un cache-clear sur un site non lié à faible trafic , la reconstruction du cache a poussé le système au-delà de sa limite, et tout sauf verrouillé. Ainsi, le comportement total du système est important ici; c'est pourquoi des outils simples comme "top" sont un endroit pratique pour commencer.

5
greg_1_anderson

Je vais être en désaccord (quelque peu) avec @ greg_1_anderson ici.

Si le système ne plante pas totalement pendant un cc all, alors je ne pense pas que vous ayez un problème général de mémoire. Lorsqu'un serveur LAMP manque de mémoire, il va basculer. Un serveur actif frappant l'échange provoquera une avalanche de méchanceté. Les processus httpd commenceront à s’empiler en raison du ralentissement du système (le swap rend le système très lent), ce qui entraînera plus d’échanges, etc. Sur les sites où j’ai vu cela se produire, je verrais la charge du processus atteindre 100, et une tonne de processus httpd actifs.

Si votre système finit par revenir, je pense que vous êtes mal réglé. drush cc all entraînera de nombreux accès à la base de données, donc je pense que cela montre davantage le problème. Ma suggestion serait d'exécuter mysqltuner sur le site. Si vous avez une base de données de plusieurs Go, ma supposition est que votre innodb_buffer_pool_size n'est même pas dimensionné à distance correctement, et votre instance MySQL déborde. J'enquêterais également sur un autre backend de cache pour essayer de réduire l'empreinte de la base de données.

2
mpdonadio

Il pourrait s'agir de votre environnement d'hébergement Web. Faites-vous référence à une configuration locale, ou quelque chose d'hébergement sur un hébergement partagé ou un VPS/serveur?

  • environnement d'hébergement - si vous êtes sur un hébergement web partagé, la quantité de mémoire que Drupal/drush peut utiliser sera limitée voir: https://drupal.org/node/207036
  • temps d'exécution maximum - doit être augmenté
1
geekgirlweb

Ce n'est pas une solution complète, juste un outil de plus pour aider à identifier la source de vos retards.

En plus d'utiliser top pour surveiller les processus, vous pouvez trouver la sortie de mytop informative. (Les autres réponses ci-dessus supposent MySQL mais si vous utilisez un autre backend DB, vous devrez échanger mytop contre un outil équivalent.)

mytop exécute simplement MySQL SHOW FULL PROCESSLIST dans une boucle, et vous montre quelles requêtes sont exécutées (donc qui prennent beaucoup de temps). Si le cache vide prend du temps à nettoyer telle ou telle table, vous verrez exactement ce qui retient les choses ici. Si vous n'avez pas accès à l'installation de mytop, faites simplement une version brute dans votre Shell -

while true; do mysql -e 'SHOW FULL PROCESSLIST' && sleep 5 && clear ; done

Si le retard ne provient pas de requêtes MySQL, cet outil peut au moins le confirmer pour vous.

1
Chris Burgess

J'ai trouvé un article de blog intitulé Accélérer l'effacement du cache sur Drupal 7 pour être très utile pour préciser précisément quelle partie du processus d'effacement du cache ralentissait les choses. Le problèmes qu'il identifie dans module fonctionnalités et module api d'entité affectaient mon site, mais le processus détaillé dans le message m'a également aidé à retrouver les problèmes que nous rencontrions dans Noyau Drupal et module de points d'arrêt .

Cela prend un certain temps pour travailler à travers le processus, mais cela m'a aidé à réduire les vides de cache de plusieurs minutes à moins d'une minute.

1
Matt V.