Sur un de mes sites, l' drush cc all
exécution prend plus de 4 minutes. Le site db fait quelques Go. Cependant, je ne vois pas de raison claire pour laquelle cela prend trop de temps. Que puis-je faire pour localiser le goulot de la bouteille?
Sur un de mes sites, l' drush cc all
exécution prend plus de 4 minutes. Le site db fait quelques Go. Cependant, je ne vois pas de raison claire pour laquelle cela prend trop de temps. Que puis-je faire pour localiser le goulot de la bouteille?
Réponses:
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ème qui analyse tous les nouveaux crochets et tous vos dossiers Drupal pour les nouveaux fichiers de modèle, le système qui analyse les fichiers pour les nouveaux modules et les fichiers de classe, et similaires.
Vous pouvez toujours vider le cache spécifique en spécifiant drush cc theme-registry
ou tout autre.
Il est fortement recommandé d'utiliser le mécanisme de mise en cache PHP (par exemple OPCache, XCache, etc.) pour accélérer le traitement. Et le cache basé sur la mémoire pour remplacer une utilisation intensive sur les tables SQL (par exemple memcached ou redis), ainsi 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 en:
echo "SHOW TABLES LIKE 'cache%'" | $(drush sql-connect) | tail -n +2 | xargs -L1 -I% echo "DELETE FROM %;" | $(drush sql-connect) -v
Pour vérifier spécifiquement ce qui prend le plus de temps, vous devez le déboguer / profiler (par exemple XDebug, XHProf, phpdbg, dtrace).
Sous OS X / Unix, cela peut être réalisé par dtrace
(après l'exécution 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 chercher des choses spécifiques, essayez d' ajouter par exemple: strace ... 2>&1 | grep -C5 UPDATE
.
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 boîte 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 de RAM libre est utilisée. Si vous avez une grande quantité d'espace virtuel, mais que toute votre RAM physique est épuisée, cette opération peut entraîner le blocage de la mémoire de la machine virtuelle, 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 Drupal à trafic moyen sur une boîte sans mémoire suffisante pour prendre en charge la configuration. Lorsque j'ai exécuté un effacement du cache sur un site à faible trafic indépendant, 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.
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, je suppose que votre innodb_buffer_pool_size
taille n'est même pas à distance correctement et que votre instance MySQL est débordante. J'enquêterais également sur un autre backend de cache pour essayer de réduire l'empreinte de la base de données.
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?
max_execution_time
. Vous pouvez faire drush php-eval "print ini_get('max_execution_time');"
une double vérification, cependant.
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 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
en 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 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.
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. Les problèmes qu'il identifie dans le module de fonctionnalités et le module API d'entité affectaient mon site, mais le processus détaillé dans le message m'a également aidé à localiser les problèmes que nous rencontrions dans le module de base et de points d'arrêt Drupal .
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.