Qu'est-ce qui contribue au temps d'exécution de la page drupal?

17

J'ai un site que j'étudie qui a des problèmes de performances majeurs, en utilisant memcache j'ai pu réduire le nombre de requêtes en nombre et en temps d'exécution total (de 3 secondes à 230 ms) mais le temps d'exécution de la page m'échappe (je suis en regardant les valeurs générées par devel) ma compréhension est que le temps d'exécution de la page = le temps nécessaire à php pour s'exécuter donc j'ai installé APC et je peux voir l'opcode php mis en cache et les statistiques montrant les hits dans le panneau de contrôle APC (apc.php livré avec APC) mais le temps d'exécution de ma page ne diminue pas. Je pense donc que ma question est double:

  • Qu'est-ce qui contribue (ralentit mieux) le temps d'exécution des pages? Est-ce juste du temps pour exécuter php?
  • Quelles approches dois-je adopter pour réduire le temps d'exécution des pages. J'ai essayé APC mais pas beaucoup d'aide

Le nombre de modules PS utilisés sur ce site est juste énorme (168) mais pour le moment je ne suis pas en mesure de faire cette recommandation, c'est plus comme un incendie dans la situation du trou.

Edit: Sortie de l'exécution de xhprof sur une instance locale (recommandée par mikeytown), cela semble être fou, je pense que les résultats ultérieurs sont dus à la thrashing? diff s'exécute pour la même URL a une différence drastique et son utilisation des ressources est trop importante. Je ne sais pas non plus pourquoi affiche des valeurs qui ne sont pas d'aujourd'hui: | (Je viens d'installer xhprof sur cet ordinateur portable)

Sortie de l'exécution de xhprof sur une instance locale

Dipen
la source

Réponses:

4

Obtenez un cachegrind de votre site. xdebug ou xhprof peut en générer un. Cela vous indiquera quelles fonctions prennent le plus de temps à s'exécuter. Jusqu'à ce que vous fassiez cela, c'est un mauvais jeu de devinettes.

mikeytown2
la source
Hé, merci pour la suggestion que je viens d'exécuter xhprof sur ma version de développement local (ordinateur portable pas sur le serveur) et je vois cela - picasaweb.google.com/lh/photo/… Est-ce réel? Je veux dire, est-il même possible qu'une page consomme 750 Mo de mémoire?
Dipen
Pourrait-il être coz de raclée? les données profilées plus tard pour la même URL, si vous regardez en bas, la même URL prend beaucoup moins de ressources mais une analyse diff montre une utilisation des ressources complètement différente et extrême.
Dipen
1
Cela dépend vraiment, mais pour 99,9% des configurations, si vous utilisez plus de 100 Mo de RAM, quelque chose ne va pas.
mikeytown2
Autre que le nombre de modules, pourrait-il y avoir autre chose de mal? Je ne sais pas si les modules peuvent être retirés de la production immédiatement. Btw, sur local j'utilise nginx + php-fpm et sur la production le site utilise lighspeed avec cgi rapide.
Dipen
1
Vous devez explorer le cachegrind et répertorier les fonctions qui vous dévorent tout le temps. img715.imageshack.us/i/cgrindout.png
mikeytown2
1

EDIT: J'ai mal lu le message d'origine. 168 modules, c'est beaucoup, et 300 à 700 ms de requêtes SQL, c'est énorme . Plus vous utiliserez de modules, plus il y aura de requêtes dès que les modules en feront.

Utilisez une mise en cache agressive pendant que vous le pouvez, mettez tout en cache, si cela ne suffit pas, essayez un cache de proxy inverse. L'utilisation d'un CDN pour les fichiers peut grandement améliorer le tout. Un cache de proxy inverse peut également vous aider en supprimant certains cookies d'authentification lorsque vous accédez à des pages qui n'en ont pas besoin (le noyau pensera que l'utilisateur est anonyme pour ceux-ci et maximisera la mise en cache).


Le dynamisme du noyau Drupal ralentit toute l'aube dès que vous avez trop de modules interagissant en même temps.

Je dirais, par exemple, que si vous utilisez beaucoup de modules qui chargent des données au moment de hook_node_load () au lieu d'utiliser des champs, cela fera beaucoup de requêtes tandis que l'utilisation des champs aurait assuré l'efficacité de la mise en cache.

Le rendu peut également prendre beaucoup de temps, drupal_render () (l'API de rendu étant parfois appelée) est un bon morceau d'API (vraiment utile) mais aussi un peu lent. Le passage au PDO (D7) et au DBTNG complet (ce qui est génial au passage) ajoute également une latence non négligeable.

Cela dit, le cœur en lui-même est assez rapide (mais il fait trop de requêtes SQL, même avec presque rien installé), les modules mal codés sont souvent le goulot d'étranglement.

APC peut diviser le temps d'exécution par 2 ou 3, selon le code qui s'exécute. si vous le configurez bien (activez toutes les optimisations APC, le manuel officiel APC est bien écrit et vous guidera).

Si vous êtes sur une boîte avec un système de fichiers lent (système de fichiers réseau ou disque dur lent), cela peut impliquer un impact visible sur le temps d'exécution. Drupal est fait à partir de nombreux petits fichiers, ce qui oblige PHP à faire des E / S sur le FS à chaque fois qu'il en charge un (APC aide également beaucoup pour cela).

Un SGBD mal configuré peut également être un goulot d'étranglement assez laid, si vous utilisez MySQL pensez à faire un réglage fin. Si vous êtes sur un hébergement partagé, s'il n'est pas spécifique à Drupal (ou prêt), la pile SGBD et PHP sera probablement mal configurée ou non réglée, ce qui peut conduire à des sites vraiment lents.

N'oubliez pas d'activer toutes les caches. Si votre site n'est pas orienté utilisateur authentifié, alors activez la mise en cache de page agressive (c'est vraiment incroyable).

Plus vous aurez de blocs, plus les pages complètes seront lentes, les blocs du module Views seront un goulot d'étranglement (selon les plugins Views que vous utilisez, le bloc OG peut être une vraie douleur) si vous ne restreignez pas leur visibilité sur une base par page, ou avec du code PHP personnalisé (tout autre bloc également, définissez toujours votre visibilité de bloc manuellement, aide grandement le framework en évitant de tenter de rendre les blocs vides).

Évitez les modules qui utilisent hook_init (), hook_init () est exécuté sur chaque page, même si vous obtenez un 403 ou un 404, ce qui ralentit tout (cela ralentit même le temps de génération du style imagecache |, et les erreurs 404 sur les fichiers seraient aube lente juste pour vous dire que le fichier n'existe pas).

Pierre
la source
Salut, ici quand je dis le temps d'exécution de la page, je veux dire la valeur qui est affichée par le module de développement au bas de la page et ne pas l'utiliser dans le sens général du cycle de demande / réponse drupal qui inclut également les requêtes SQL, etc. Ma question est dans le contexte d'un utilisateur authentifié. Ainsi, lorsque le temps de développement des pages de rapports de développement inclut-il également des requêtes SQL?
Dipen
Je ne sais pas si le système de fichiers serait un goulot d'étranglement car je suis sur un système de fichiers Linux 15k RPM. Les requêtes SQL prennent environ 300 à 700 ms selon la page mais le temps d'exécution de la page ~ = 3 sec (rapporté par devel). Je ne sais pas quoi d'autre pourrait être le problème.
Dipen
Oh désolé, j'ai mal lu votre message d'origine. La valeur de Devel est calculée du démarrage à l'arrêt (le module de développement a son propre gestionnaire d'arrêt PHP pour faire beaucoup de choses, y compris cela). Je ne sais pas exactement quand il démarre et s'arrête, mais à peu près tout le temps de construction de la page Drupal et les spécificités de l'entreprise sont inclus dans ce temps d'exécution de la page. Oui, il comprend tout (y compris le temps et la latence des requêtes SQL), et sa propre latence (la journalisation des requêtes de développement a également un impact sur les performances).
Pierre