J'ai un site Web wordpress qui est devenu trop volumineux pour un seul serveur. Je dois décider si je dois héberger la base de données en externe, c'est-à-dire acheter un autre serveur pour la base de données ou si je dois héberger les images sur un CDN.
Déplacer la base de données en externe est la solution la plus rapide et la plus simple. Cela réduira l'utilisation d'E/S et RAM, ce qui aidera beaucoup. D'un autre côté, déplacer toutes les images sur un autre serveur (je pense à utiliser le compartiment AWS S3) signifiera beaucoup moins de demandes au serveur principal et je n'aurai pas à séparer le site et la base de données. Il s’agit bien entendu d’une procédure extrêmement compliquée car il existe sur le site d’autres outils basés sur la communauté qui permettent aux utilisateurs de télécharger des images.
Il semblerait que le fait de déplacer les images vers S3 serait le meilleur avantage, car il existe plus de 15 images sur la plupart des pages lorsque vous comptabilisez les "publications récentes" et d'autres éléments dans la barre latérale. Cependant, étant donné que la mise en cache du navigateur est activée, il est possible que cela ne soit pas aussi important qu'il y parait. En raison de la nature dynamique et axée sur les utilisateurs de ce site, je ne peux pas mettre en cache les requêtes de base de données car la plupart contiennent une jointure à la table des utilisateurs où ID = valeur de session. Pour cela, je pense que la DB pourrait en tirer le meilleur parti. L’inconvénient bien sûr est que le fait d’éloigner la base de données de localhost signifie que je dois faire une demande sur Internet. Il est actuellement impossible de stocker la base de données dans un cluster ou un réseau interne. La base de données sera sur un serveur distant et j'utiliserai son adresse IP publique pour communiquer.
De manière générale, pour un site Web moyen, quels sont les avantages les plus avantageux si vous ne pouvez choisir que 1. Déplacer toutes les images vers un emplacement distant et les diffuser via un sous-domaine, par exemple. images.mysite.com ou dois-je déplacer la base de données vers son propre serveur dédié?
J'ai actuellement un serveur autonome dédié avec un disque de 2 To, 8 core xeon @ 2,7 GHz et 16 Go de RAM. J'ai une bande passante illimitée sur une connexion de 100 Mo. Le coût de la mise à niveau vers quelque chose de plus gros est de l'argent fou, je pourrais avoir plusieurs fois le même serveur que j'ai maintenant pour le même prix. Il semble qu'Apache et mysql accaparent la plus grande partie du processeur, mais Apache fournit toutes les images, c'est donc là que réside mon problème.
Il n'y a aucune raison pour que cela soit d'une manière ou d'une autre. Je dirais d'optimiser les deux. Si vous avez un grand nombre d'images, un CDN a du sens, indépendamment de ce que vous faites sur le serveur. De plus, même si cela résout le problème, de meilleures performances de base de données sont utiles en général, je vous recommande donc de traiter les deux options.
J'aime vraiment les outils AWS. Ils sont intéressants pour l'argent que vous payez, et ils ne paient que pour ce que vous utilisez. En outre, pour les connexions lors du téléchargement, les performances sont excellentes. Cependant, les rares fois où j'ai vu des compartiments S3 être utilisés en tant que CDN, ils ne semblaient pas fonctionner aussi bien que les autres CDN. Il est donc conseillé de tester différentes options de CDN. Si vous avez beaucoup d'images téléchargées par l'utilisateur, il est indispensable de disposer d'une sorte d'intégration de plug-in.
Pour la base de données, je ne recommande pas d'avoir un serveur de base de données séparé sur Internet s'il s'agit d'une connexion lente. Plus vos connexions à la base de données sont lentes, plus vous aurez de ressources liées et plus vos pages seront lentes à se charger. Mais cela ne signifie pas que vous n'avez pas d'options. Si vous ne pouvez pas ajouter un autre serveur, je vous recommande d'ajouter un lecteur SSD. Vous n'avez pas précisé si votre lecteur était un disque SSD ou non, mais il semble que ce ne soit pas le cas. MySQL peut être très intensif en E/S, et c’est exactement ce que les disques SSD sont bien avant. Vous pouvez monter un lecteur SSD distinct que vous utilisez uniquement pour MySQL afin d'améliorer vos performances. J'ai apporté ce changement à de nombreux clients pour le voir avoir un impact important.
De plus, réglez votre installation MySQL. C'est une étape souvent oubliée qui peut apporter de grandes améliorations. Vous pouvez récupérer l'outil ici:
https://raw.github.com/major/MySQLTuner-Perl/master/mysqltuner.pl
Voici un article qui pourrait vous aider à l'utiliser:
https://www.percona.com/blog/2014/01/28/10-mysql-performance-tuning-settings-after-installation/
Il n'est jamais inutile de rechercher des enregistrements transitoires excessifs dans la table d'options WordPress, ce qui peut parfois ralentir les choses.
Tout cela étant dit, ne supposez pas que ce sont les problèmes. Testez pour voir où sont vos goulots d'étranglement. Les recommandations ci-dessus ne sont que de bonnes recommandations génériques, mais des tests sont nécessaires pour connaître le problème. Si ce n'est déjà fait, installez sysstat et familiarisez-vous avec son utilisation. Cela devrait vous donner plus de détails sur ce que votre CPU fait réellement. Voici un article qui pourrait aider:
http://www.thegeekstuff.com/2011/03/sar-examples/
J'aime courir sar
par lui-même, sans option, pour avoir une idée de l'endroit où mon gros usage a été. Voici une ligne personnelle que j’utilise pour vérifier l’utilisation de la semaine:
(sar -u; for d in {1..7} ; do sar -u -f /var/log/sa/sa$(date -d"-$d day" +%d);done)|awk '$4~/20[1-2][0-9]/{d=$4}$9~/[0-9]/{print d" "$0}'|sort -nrk8|sort -nrk10|awk -v t="50" 'BEGIN{n="\033[0m";c="\033[1;31m";w="\033[1;33m"}$10~/[0-9]/{us=$5+$7;io=$8;id=$10;if (us>io){ioc=n;if (us>t){usc=c}else{usc=w}}else{usc=n;if (io>t){ioc=c}else{ioc=w}}printf "%s\tUser/System: %s%4.2f%s\tI/O: %s%4.2f%s\tIdle: %4.2f\n",$1" "$2" "$3,usc,us,n,ioc,io,n,id}'|tail -10
Je divise l'utilisation par Système/Utilisateur et E/S car je trouve qu'en général, si c'est l'ancien, c'est un problème mieux résolu en adressant les scripts PHP, et si c'est le plus tard, j'ai tendance regarder d'abord MySQL. Si c'est juste lié au processeur, alors je me concentrerais sur l'optimisation des scripts eux-mêmes, comme peut-être supprimer des plugins, etc. Si c'est une E/S, je pourrais vérifier iotop
pour confirmer le coupable. Si elle est purement basée sur RAM (vérifiez avec sar -q
), alors peut-être ajouter de la RAM, sinon, le SSD peut vous aider. Bien sûr, YMMV.
La première étape consistera à vérifier le serveur pour voir ce qui utilise le plus de ressources système par le biais de cycles de mémoire et de CPU. Un serveur de base de données MySQL, en fonction du nombre de connexions, peut épuiser les ressources du système.
Transfert de la base de données sur un serveur distinct
Ce faisant, vous réduirez la charge sur le serveur transmise par le service de base de données. Si possible avec votre fournisseur, essayez d’opter pour une plate-forme de base de données basée sur le cloud, car elle devrait pouvoir être éclatée pour gérer les pics soudains mais de courte durée.
Transférer des images
En transférant les images sur une autre plate-forme, par exemple un compartiment S3, vous réduirez le nombre de connexions à votre serveur, ce qui contribuera également à réduire la charge globale du système.
Ce que les autres ont dit Découvrez où vont vos ressources système. Puis corrigez ce problème. Si vous souhaitez disposer d'un budget durable, vous ne pouvez pas lancer aveuglément des ressources générales sur le problème.
Il est étrange qu'un seul site WordPress s'emballe de cette façon. Il peut s'agir d'un module spécifique ou, comme d'autres l'ont mentionné, d'appels excessifs à la base de données.
Vous faites référence à "localhost" à un moment donné. Cela ne devrait faire partie d'aucun service Web public - c'est quelque chose qui ne devrait apparaître que si vous utilisez un bac à sable auquel on s'est connecté directement à des fins de développement. Je suppose que vous voulez simplement dire que les références aux images supposent actuellement que toutes sont présentes sur le même serveur?
Juste quelque chose à noter *
Si vous planifiez les ressources et/ou les ressources cloud dont vous avez besoin pour votre projet sur une feuille Excel, envoyez-les à AWS. Ils correspondront à vos tarifs et les baisseront probablement pour correspondre à votre plan "rentable". Tout ce qu'il faut, c'est un email et un appel téléphonique. De plus, vous pouvez obtenir des ressources de plus en plus dynamiques pour votre projet.
Combien de demandes par seconde voyez-vous? Le matériel est assez bon et s'il n'héberge qu'un seul site WordPress, il devrait être en mesure de gérer beaucoup de trafic si tout est configuré correctement, avant de songer à utiliser davantage de serveurs.
Vous avez mentionné qu'Apache nécessite beaucoup de ressources. Peut-être envisager de passer à nginx. D'après mon expérience, il réduit considérablement l'utilisation des ressources pour les demandes de fichiers statiques et est plus facile à configurer pour des charges élevées.
Vous devriez également vérifier quelles requêtes de base de données utilisent le plus de ressources.