Comment améliorez-vous les performances de Drupal?

54

Drupal est rapide à développer, mais les performances sont si médiocres. Il est difficile d’atteindre 50 demandes par seconde.

Et il y a tellement de requêtes SQL dans une simple page Web. Si vous testez l'heure de la demande d'un formulaire soumis sur Drupal.org, il faudra toujours quelques secondes pour le terminer.

Comment améliorez-vous la vitesse de votre site Web?

Bruce Dou
la source
3
Avez-vous réellement cherché sur le site? Je ne peux pas imaginer que cela n'ait pas été discuté à plusieurs reprises auparavant.
Letharion
1
Commander mes diapositives goo.gl/30yi39 devrait vous aider
mikeytown2

Réponses:

61

Mise en cache, mise en cache et mise en cache.

Quelques suggestions que j'ai déjà données à une question similaire sur do

  1. Placer Varnish ou un autre proxy inverse devant votre http-deamon est probablement la meilleure chose à faire.
  2. Au cours de DrupalCon Copehagen, Rasmus a déclaré que l'utilisation d'un cache opcode php, tel que APC , est l'une des meilleures choses que vous puissiez faire pour accélérer PHP en général. Les performances s'améliorent avec les nouvelles versions de PHP. La mise à niveau de PHP lors de la mise à niveau de Drupal présente également des avantages supplémentaires. De 6 à 8 ans, Drupal connaîtra un changement majeur d'orientation vers les objets, qui a également entraîné une amélioration majeure des performances dans les nouvelles versions de PHP.
  3. Memcache est un choix populaire pour accélérer le cache en le mettant en mémoire plutôt qu'en disque.
  4. Les panneaux + la mise en cache combinés aux actions de cache peuvent améliorer considérablement les performances, même pour les utilisateurs connectés, car ils prennent en charge une logique assez complexe.
  5. Le cache d'entités est un accélérateur de vitesse sans compromis pour tous ceux qui utilisent Drupal 7.
  6. Les sites à forte écriture ont moins de solutions "bien établies". Certaines options incluent.
    1. Le déplacement fréquent de toutes les écritures, par exemple des statistiques, ailleurs, comme Google Analytics.
    2. Mettre en cache des opérations d'écriture fréquentes avec une solution personnalisée dans quelque chose comme NodeJS, qui écrira dans la base de données une fois toutes les X secondes.
    3. Sacrifiez l' ACID sacré et utilisez une base de données telle que MongoDB . (Voir le commentaire de Berdir ci-dessous)
    4. Cluster votre base de données SQL. Ne lit d'une base de données, écrit à une autre. Ceci est natif de D7 et Pressflow peut vous aider avec cela dans D6.
Letharion
la source
Tout cela a été ajouté, mais tout cela est destiné à la mise en cache de lecture, ce qui n’est pas bon car les sites ont beaucoup d’écriture.
Bruce Dou
Vous n'avez rien dit de spécifique à propos des écritures. :) Je vais ajouter quelque chose à ce sujet dans ma réponse.
Letharion
1
Clarification sur MongoDB. Vous ne pouvez pas basculer votre base de données complète vers MongoDB. MongoDB est quelque chose de complètement différent d’un SGBD comme MySQL et n’utilise par exemple pas SQL. Vous ne pouvez remplacer que certains composants enfichables et les utiliser pour stocker une partie de vos données dans MongoDB, par exemple des champs, des journaux, des blocs, etc.
Berdir
@Letharion >> Cluster votre base de données SQL. Ne lit d'une base de données, écrit à une autre. Pressflow peut aider à cela. Comment cela peut il etre accompli ?
GoodSp33d
1
Très bonne réponse! Définitive. Pour ajouter à cela, jetez un coup d’œil au module d’ agrégation avancée CSS / JS car j’ai bien compris que l’agrégation réduisait les demandes de fichiers CSS et JS uniques, contribuant ainsi à améliorer les performances.
therobyouknow
23

Ce sont des notes tirées de mes expériences et qui pourraient différer de celles des autres. J'utilise principalement la pile LAMP et j'ai pris en compte la même chose dans mes suggestions.

Règles du pouce pour la mise en cache que je suis généralement.

  1. Traiter une fois, utiliser plusieurs fois.
  2. Vivez avec des données obsolètes quand c'est possible
  3. Effacez les caches rarement et gardez-le très spécifique
  4. Si possible, effectuez les modifications au niveau le plus bas de la pile. LAMP - DCCc: Linux, Apache, Mysql, PHP, Drupal Core, Contrib et un module personnalisé.

Améliorer les performances d'un site Drupal (dans l'ordre croissant de complexité)

  1. Gardez le noyau mis à jour, le module contrib et les thèmes à jour. Oui c'est important.

  2. Installez APC sur votre serveur. (Déplacé vers le haut sur la suggestion de Letharion)

  3. Mise en cache de la page: admin / config / development / performance Différence entre la durée de vie minimale du cache et l'expiration des pages en cache

  4. Bloquer la mise en cache https://drupal.org/project/blockcache_alter Options de mise en cache pour tous les blocs.
  5. Regrouper les fichiers javascript et css - Améliorations frontales https://www.drupal.org/project/advagg
  6. Désactiver les modules inutiles. Chaque module ajoute à la quantité de code qui doit être disponible pour le chargement d'une page. Et cela augmente également le nombre de recherches. Dans la mesure du possible, utilisez un module générique à la place de plusieurs modules proposant des fonctionnalités spécifiques.
  7. Mettre en cache le contenu des vues - Mettre en cache le contenu pour les vues avec https://www.drupal.org/project/views_content_cache
  8. Désactiver la journalisation de la base de données - Utilisez https://drupal.org/project/syslog_ng
  9. Réduisez les erreurs 404 - http://www.brokenlinkcheck.com/
  10. Réponses rapides 404 - https://drupal.org/project/fast_404 - Essayez de gérer au niveau du serveur.
  11. Validations côté client - https://www.drupal.org/project/clientside_validation
  12. Compress Image - https://www.drupal.org/project/imageapi_optimize
  13. Chargement paresseux d'images - Ne chargez pas d'images inutiles - https://www.drupal.org/project/lazyloader
  14. Utiliser des feuilles de Sprite - https://www.drupal.org/project/spritesheets

  15. Définissez la valeur minimale de la durée de vie du cache sur un nombre plus élevé et utilisez des modules d'effacement du cache pour effacer les caches de pages spécifiques. Chaque fois que je modifie / mets à jour un nœud, tous les caches de pages pour les utilisateurs anonymes sont perdus.

  16. Utilisez le module Devel pour consulter les requêtes.
  17. Réécrire les requêtes de vues / éviter les vues si elles sont excessives.
  18. XHProf - https://www.drupal.org/project/XHProf
  19. FPM, HHVM.
  20. Profilage et réglage de la base de données - https://www.drupal.org/project/dbtuner
  21. Utilisez Boost , ne démarrez pas DB si ce n’est pas nécessaire. https://drupal.org/project/boost Pour la plupart des sites de taille petite à moyenne, Boost suffit et vous n'avez peut-être pas besoin de procurations inversées.
  22. Utiliser des CDN - https://www.drupal.org/project/cdn Il est facile à configurer.
  23. Si vos tables de cache sont très volumineuses, utilisez Memcached - Si vous pouvez installer memcached et configurer sa mémoire vive, ce n’est pas aussi complexe que cela en a l'air.
  24. Etags - Configurez Etags correctement. https://developer.yahoo.com/blogs/ydnfiveblog/high-performance-sites-rule-13-configure-etags-7211.html
  25. Utilisez Reverse Proxy Server - Varnish (au moins pour les actifs). Cela aide beaucoup si la plupart de vos utilisateurs sont anonymes.
  26. Transfert compressé - Activer la compression gzip
  27. Keep Alive - Utilisez des connexions persistantes dans la mesure du possible.
  28. JPEG progressif -
  29. CACHING IN CODE - Le blog d'Eaton est génial. http://www.lullabot.com/blog/article/beginners-guide-caching-data-drupal-7
  30. Implémenter Cache Warming - https://www.drupal.org/project/cache_warmer - Cache Réchauffe les pages avant que l'utilisateur final ne les ait affichées.
  31. La configuration de base de données maître esclave - https://www.drupal.org/project/autoslave facilite la configuration.
  32. Clusters de bases de données - https://stackoverflow.com/questions/1163216/database-cluster-and-load-balancing
  33. Load Balancers - http://en.wikipedia.org/wiki/Load_balancing_(computing)
  34. Utiliser le réchauffement heuristique du cache - https://www.drupal.org/project/cache_graceful
  35. Mise en cache utilisateur authentifié - https://www.drupal.org/project/authcache
Gokul NK
la source
Republier la réponse que j'avais écrite pour drupal.stackexchange.com/questions/118990/… . BTW il a été fermé en disant qu'il était trop large. Je ne suis pas sûr qu'il y ait beaucoup de différence entre ces deux questions :)
Gokul NK
18

Le module Boost est également très utile, il crée des caches de fichiers statiques à partir de vos pages Web. C'est surtout pour les sites Web avec beaucoup de trafic d'utilisateurs anonymes.

Boost fournit à Drupal une mise en cache statique des pages, ce qui améliore considérablement les performances et l'évolutivité des sites qui reçoivent principalement du trafic anonyme. Pour l'hébergement mutualisé, c'est votre meilleure option en termes d'amélioration des performances. Sur des serveurs dédiés, vous voudrez peut-être envisager Varnish.

Apache est entièrement pris en charge, avec Nginx, Lighttpd et IIS 7 semi-pris en charge. Boost mettra en cache et gzip compressera html, xml, ajax, css et javascript. La logique d’expiration du cache Boosts est très avancée; C'est assez simple d'avoir différentes durées de vie de cache pour différentes parties de votre site. Le robot intégré veille à ce que le contenu expiré soit régénéré rapidement pour un chargement rapide des pages.

Abeille
la source
1
Boost fonctionne très bien pour Drupal 7 maintenant imao. Sur une solution d'hébergement partagé, c'est un excellent moyen de le faire (car ils n'autorisent souvent pas Varnish, par exemple).
Sage
5

Il vaut la peine de mentionner que si vous utilisez le pilote de base de données SQLIte, vous devrez peut-être désactiver la synchronisation de disque.

/**
 * Implements hook_init().
 */
function HOOK_init() {
  db_query('PRAGMA synchronous = OFF');
}

Sur certaines configurations de serveur, les performances seront considérablement améliorées.

ya.teck
la source
2
Comme cela l’a désactivé à chaque chargement de page, je me demandais s’il existait un meilleur moyen de le désactiver de manière permanente. Devrait passer du temps à vérifier.
Gokul NK
1
Il est possible de le faire dans sites / default / settings.php, en ajoutant un élément 'init_commands' au tableau $ databases. J'ai trouvé un exemple pour "PRAGMA synchrone = OFF" ici: bitacoles.enging.com/node/210
dinopmi
4

Le secret des performances de Drupal réside dans la mise en cache et dans le respect des bonnes pratiques. Suggestions:

Drupal back-end

  • Activer la mise en cache dans la section Performances .
  • Vérifiez la performance et la performance et Evolutivité Liste de contrôle des modules.
  • Vérifiez les options d’optimisation des performances de Drupal 7 et la liste de contrôle .
  • Désactivez les modules inutilisés et non destinés à la production (tels que Devel, l'interface de visualisation, l'interface de règles, etc.).
  • Désactiver les modules instables.
  • Désactiver les statistiques .
  • Désactivez le module principal dblog et remplacez-le par syslog .
  • Désactivez le module principal d'Update Manager .
  • Cron: utilisez le cron intégré à Drupal, pas le poormanscron (pensez à Elysia ou Ultimate cron).
  • Vues: utilisez le cache pour les vues de différentes couches (requête de base de données, annotations, base de temps).
  • Blocs: Utilisez la mise en cache de blocs si votre vue est un bloc (par page, utilisateur, etc.).
  • Blocs: envisagez de modifier les paramètres de cache par bloc à l'aide du module Block Cache Alter .
  • Panneaux: utilisez autant que possible le cache (pour D7, vérifiez les modules PCC et PHC ).
  • Entité: Activer le cache d'entité .
  • Lorsque vous utilisez plusieurs environnements, considérez le module manquant, ce qui peut améliorer le chargement de la page.
  • Activez la mise en cache des utilisateurs authentifiés avec le module Authcache .
  • Évitez les redirections qui ralentissent l'expérience utilisateur.
  • Améliorez l'invalidation du cache en utilisant le module Expire .
  • Utilisez le profilage PHP avant la production (par exemple, XDebug ).

Drupal front-end

  • Minimiser les requêtes HTTP par:
    • Activer l'agrégation JS / CSS dans la section Performances .
    • Utilisez les sprites CSS pour réduire le nombre de demandes d’image.
    • Utilisez de petites images en tant que données en ligne (URI dans une feuille de style).
    • Utilisez les cartes d’image pour combiner plusieurs images en une seule image.
    • Pensez également à utiliser le chargement d’images paresseuses (voir: Image Lazyloader ).
    • Installez le module BigPipe pour réduire les temps de chargement.
    • Considérer le chargement paresseux vs l'évaluation paresseuse.
    • Voir: Utilisation du cache du navigateur - Exposed!
  • Pensez à faire du JavaScript et du CSS externe (dans certains cas, c'est plus rapide).
  • Minify JavaScript and CSS (voir: module Speedy ). Évitez inline.
  • Lorsque vous faites référence à un JS, utilisez les attributs deferou async.
  • Minimiser le nombre d'iframes.
  • Optimisez les images, les polices et les sprites CSS, optimisez la taille des favicon et réduisez la taille des cookies.
  • Réduisez le nombre d'éléments DOM et de références de cache aux éléments accédés.
  • Accélérez le chargement de vos pages 404 en utilisant le module Fast 404 .
  • Activez l'agrégation et la mise en cache des ressources frontales avec Advanced CSS / JS Aggregation .
  • Placez les feuilles de style en haut et les scripts en bas.
  • Ajouter un Expires ou Cache-Control en- tête, également ETAG pour réduire les réponses.
  • Utilisez GET pour AJAX et rendez-les cachables.
  • Les composants de préchargement et de post-chargement permettent de tirer parti du temps d'inactivité du navigateur.
  • Parfois, le fractionnement de composants entre domaines peut maximiser les téléchargements parallèles.
  • Ne redimensionnez pas les images au format HTML et ne conservez pas moins de 25 000 composants.
  • Évitez les filtres, les expressions CSS, les éléments HTML avec des src ou href vides.
  • Utilisez le proxy inverse pour déboguer vos demandes Web (par exemple, Charles ).
  • Utilisez des outils tels que Y-Slow et PhantomJS pour les contrôles de performances de base.
  • Utilisez les outils Google PageSpeed pour analyser et optimiser votre site Web.
  • Lisez à propos des spécifications de synchronisation de navigation du W3C ( GitHub ).

PHP

  • Activer la mise en cache PHP (par exemple, OpCache , APC ) et les paramètres de réglage.
  • Envisagez d'utiliser PHP-FPM au lieu de mod_php plus Nginx au lieu d'Apache.

Base de données

Serveur

  • Vérifiez la configuration système requise pour Drupal.
  • Vérifiez les paramètres de serveur Web recommandés pour Drupal.
  • Vérifiez les paramètres de configuration PHP recommandés pour Drupal.
  • Assurez-vous que l'hébergement est sur des périphériques de stockage rapides (par exemple, SSD).
  • Utilisez un serveur dédié rapide et fiable pour vous opposer à l'hébergement partagé.
  • Installez Redis ou memcached (avec le support igbinary) et configurez Drupal pour l’utiliser.
  • Définissez des durées de vie plus longues pour les moteurs de recherche (par exemple, une durée de vie de 24h évite que des robots atteignent le serveur).
  • Réduisez les recherches DNS (assurez-vous qu'elles sont mises en cache).

Sites Web à fort trafic

Si vous vous attendez à une charge élevée pour votre site Web, utilisez Varnish. Pensez également à utiliser CDN.

Pour en savoir plus, consultez: Expérience du monde réel dans les performances de mise à l'échelle et de réglage


Autres ressources:

Kenorb
la source
3

Il existe un livre intitulé High Performance Drupal qui fournit les meilleures pratiques, des exemples et des explications détaillées pour résoudre plusieurs problèmes de performances et d’évolutivité. Vous apprendrez à appliquer les techniques de codage et d'infrastructure aux ressources internes de Drupal, aux performances des applications, aux bases de données, aux serveurs Web et à l'analyse des performances.

Dans l'article Performances et évolutivité de Drupal 7, vous trouverez des exemples sur Drupal 6 et Drupal 7, ainsi que la liste suivante:

Les projets de performance et d’évolutivité de Drupal 7 à surveiller:

Adrian Cid Almaguer
la source
2

Il y a eu de nombreux ajustements pour optimiser les performances de votre site Drupal - mais tous ne sont pas impératifs. Nous devons rechercher certaines alternatives et techniques qui permettraient d’optimiser la plate-forme de Drupal. La mémoire cache, oui, c’est un moyen d’optimiser le site Web par différents moyens, mais quelques ajouts et conseils supplémentaires peuvent augmenter et optimiser votre site Web sans processus fastidieux.

Nous avons récemment publié un article similaire sur notre site Web qui, à mon avis, pourrait vous aider à peaufiner votre travail.

Source: http://www.cloudreviews.com/blog/drupal-performance-optimization-tips

Sabih
la source
2

Il est possible d’améliorer la vitesse de Drupal à un niveau raisonnable en n’installant aucun nouveau module. Oui, Drupal a une configuration de performance.

  1. Vous pouvez le configurer en allant dans: YourSiteDomain / admin / config / development / performance
  2. Activer 'Cache pages pour les utilisateurs anonymes' sous Chaching
  3. Durée de vie minimale du cache: 1 jour (si vous ne faites pas de mises à jour régulières)
  4. Expiration des pages en cache: 1 jour (si vous ne faites pas de mises à jour régulières)
  5. Activer 'Compresser les pages en cache'
  6. Activer 'Agréger et compresser les fichiers CSS'
  7. Activer 'agréger les fichiers JavaScript'

  8. Une fois ces configurations définies, accédez à: VotreSiteDomaine / admin / reports / status

  9. Vérifiez s'il y a des problèmes d'autorisation pour les répertoires 'css' et 'js'
  10. Corrigez l'autorisation comme défini sur la page Rapport d'état

Et maintenant, vous avez terminé l'optimisation de la vitesse pour votre site drupal 7.

Il existe peu d'outils de test de vitesse en ligne pour vérifier la vitesse. Veillez à utiliser l'un des outils de vérification de la vitesse et à effectuer un test avant de mettre à jour les paramètres ci-dessus. Et une fois que vous avez mis à jour le paramètre de performance, exécutez à nouveau le test de vitesse. Vous allez certainement voir une amélioration.

Pingdom et HTTP Fox (plug-in FireFox) sont les meilleurs outils pour vérifier la vitesse du site.

Les paramètres ci-dessus mettent non seulement vos pages en cache pour les utilisateurs anonymes, mais aussi les fichiers CSS et JS. Exemple si votre site charge 80 fichiers, publiez ces paramètres, le nombre de requêtes sera réduit à au moins 50%. Vous avez donc ici une amélioration de la vitesse de 2x sur votre site Drupal.

AnAnD
la source
2

En tant que développeur backend, il est toujours possible d'améliorer votre code afin d'améliorer les performances du site Web. Quelques lignes directrices pour les développeurs backend pourraient être:

1) Nettoyez votre table de surveillance

2) Ne pas abuser de la variable API

3) Faire moins ou mieux requêtes HTTP

4) Gardez votre "module de points" court

En ce qui concerne les constructeurs de polices et de sites, bien plus peut être réalisé, mais il est important de prendre en compte les performances à tous les points de vue.

Source: Optimiser avant de commencer

Targoo
la source
2

Un site Drupal 7 non optimisé avec 2 Go de RAM peut traiter de manière satisfaisante environ 20 à 25 demandes par seconde. Si vous voulez aller plus loin, le site nécessitera quelques modifications. Ce que vous peaufinez dépend si la plupart des utilisateurs du site sont anonymes ou authentifiés. Voici les principales choses que vous pouvez faire pour améliorer les performances:

Le site sert principalement des utilisateurs anonymes:

1) Installez et configurez définitivement APC, memcache et entitycache.

2) Placez le proxy Varnish devant le serveur Web. L'installation et la configuration prennent environ 30 minutes, mais réduiront considérablement le temps de chargement de vos pages. En fait, Varnish peut traiter environ 300 demandes par seconde sur un ordinateur de 2 Go si toutes les pages sont mises en cache. Utilisez le module Expirer pour n'expirer que les pages sélectionnées lors de la mise à jour / suppression de contenu.

3) Utilisez le module d’agrégation avancée CSS / JS pour regrouper les fichiers CSS et JS. Essayez de déplacer tous les fichiers JS au bas de la page. Mais notez que cela peut casser votre site, alors implémentez-le en production après des tests approfondis. Également expérimenter avec l'inlining CSS critique. D'après mon expérience, le temps de chargement d'une page sera réduit d'environ une demi-seconde.

4) Les images CSS / JS / doivent avoir un en-tête d'expiration très lointain. Cela garantira que les navigateurs ne demanderont pas toujours les mêmes CSS / JS / images.

5) Assurez-vous que le serveur Web sert des pages compressées / CSS / JS.

Après avoir implémenté les 5 étapes ci-dessus, votre serveur RAM de 2 Go devrait pouvoir traiter 50 requêtes par seconde assez facilement.

Le site sert principalement des utilisateurs authentifiés:

Optimiser un tel site est plus complexe. Ces sites appartiennent à l'une des deux sous-catégories à des fins d'optimisation:

(a) La plupart des pages du site sont identiques, à l'exception de 1 ou 2 blocs contenant des informations spécifiques à l'utilisateur. Par exemple, le site Drupal Commerce.

(b) La plupart des pages sont entièrement personnalisées pour l'utilisateur. Par exemple, le site Drupal Commons.

Si votre site entre dans la catégorie (a), appliquez la plupart des techniques dont nous avons parlé pour le site servant principalement des utilisateurs anonymes. La seule différence est que pour les pages non admin, Varnish devra supprimer le cookie SESSION de l'en-tête et servir les pages en cache. Utilisez le module AJAX Block pour les blocs de serveurs contenant des informations spécifiques à l'utilisateur à l'aide d'AJAX. De cette façon, la plus grande partie de la page sera servie très rapidement avec Varnish, puis les informations propres à l'utilisateur seront diffusées via AJAX.

Si votre site tombe dans la catégorie (b), utilisez le module Authcache. Je préfère ne pas l'utiliser autant que possible car il nécessite un peu de configuration et de maintenance. Mais ça marche vraiment bien. Ce ne sera pas aussi rapide que d'utiliser Varnish, mais il pourra traiter 50 demandes par seconde que vous recherchez.

Si vous souhaitez aller au-delà de ce que nous avons discuté ici, consultez la liste de contrôle d'optimisation des performances Drupal . Divulgation: Il est écrit par moi. Il cite une liste exhaustive de choses que vous pouvez faire pour que votre site Drupal flambe rapidement.

Neerav Mehta
la source