J'ai un serveur Web sur un Linode 1024 VPS basé sur
- Ubuntu 11.10
- Nginx 1.0.5
- PHP 5.3.6 (avec PHP-FPM, APC)
- Vernis 3.0.2
Et quelques blogs basés sur WordPress 3.3.1. L'un d'eux est un simple blog, avec la configuration par défaut, le thème et juste le message "Hello World", pour tester le serveur. L'autre est un blog cloné à partir d'un autre serveur avec près de 10 000 articles et plus de 10 000 commentaires. Ce blog compte environ 5k uniques par jour.
Le serveur donne de bons chiffres sur un test ab pour le blog de test , mais le même test avec le blog cloné est impossible à faire: le test ab charge trop le serveur, et je dois arrêter le processus, ce qui fait de toute façon ab pour montrer ce résultat vraiment médiocre .
Le htop montre également une charge "normale" en fonctionnement normal , mais une grosse charge anormale pendant le test ab.
Il se passe une autre chose étrange (la plus importante pour moi): le Time To First Byte est extrêmement élevé , mais après cela, le site se charge très rapidement. Cela peut être facilement testé avec des services tels que tools.pingdom.com, qui donne ce résultat . Veuillez faire attention à cette région jaune qui signifie "Temps d'attente".
Pourquoi cela arrive-t-il? Idées possibles:
- Mauvaise configuration PHP-FPM
- Le temps de réponse DNS de Linode est horrible. Non-sens - le blog de test résout bien DNS, TTFB est fantastique
- Configuration de Bad Nginx
Si quelqu'un a besoin de plus d'informations,
- Ici, vous avez le fichier de configuration du blog cloné nginx actuel ( /etc/nginx/sites-available/muycomputerpro.com )
- Ici, vous avez la configuration actuelle de my.cnf ( /etc/mysql/my.cnf ) (je sais, pour le moment sans mise en cache, cela n'a pas fait de différence sur TTFB dans le passé)
- Vous avez ici la configuration PHP-FPM actuelle ( /etc/php5/fpm/pool.d/www.conf )
if -f
directive que vous utilisez dans lelocation
conteneur dans la configuration nginx. Sur la base de ce que je lis ici wiki.nginx.org/Pitfalls , j'ai le sentiment que le-f
fait une recherche inefficace du fichier qui pourrait provoquer un problème de Time To First Byte, surtout si vous avez des répertoires avec un grand nombre de des dossiers.ab -n 1000 -c 100 -H 'Host: mysite.com' http://127.0.0.1/
Cela dit, la différence entre les résultats mis en cache (vernis) et non mis en cache est suffisante pour valider la position selon laquelle le problème n'est pas lié au réseau, au DNS, etc. et réside dans le traitement, comme prévu.Réponses:
Tout d'abord, ce n'est pas une réponse, mais une approche diagnostique.
Ce n'est en aucun cas complet - ou même quelque chose de proche, ce n'est qu'un point de départ.
Temps jusqu'au premier octet
Le délai jusqu'au premier octet (TTFB) comprend un certain nombre de composants:
Lorsque vous regardez une sortie ApacheBench, vous voyez également:
Comparaisons pour éliminer les composants
À quelques exceptions près, votre problème va résider dans le traitement backend, qui se résume généralement à un code trop complexe / inefficace ou à une configuration MySQL mal configurée.
Un bon moyen d'aborder ce problème consiste à effectuer une série de comparaisons qui élimineront divers aspects de votre configuration. Une bonne comparaison doit rester aussi constante que possible pour aider à réduire le problème. Actuellement, vous avez fourni les comparaisons suivantes:
Le test idéal vous obligerait à dupliquer votre site complet, puis à supprimer tout le contenu, sauf un article et les commentaires associés. Le but de ce test serait de déterminer de manière concluante si la grande quantité de contenu est le problème ou si d'autres aspects de votre configuration (plugins wordpress, thème, etc.) en sont la cause. Vous compareriez essentiellement les performances de sites identiques, sur le même (nouveau) serveur - en chargeant la même page (même longueur, etc.) - avec la seule différence étant le contenu total du site (par exemple, il y a de fortes chances qu'un plugin ne le fasse pas). bien évoluer avec un contenu accru).
Sans rien changer, vous pouvez faire d'autres comparaisons:
Réglage de votre backend
À ce stade, vous devriez soit avoir trouvé le problème, soit conclu qu'il se trouve dans votre backend. Cela vous laisse Nginx, PHP ou MySQL.
(Je dois mentionner ici, qui est - il toujours utile de savoir si votre goulot d' étranglement est CPU, RAM, ou E / S - entre
sar
,top
,iostat
,vmstat
,free
., Etc , vous devriez être en mesure de venir à une conclusion à ce sujet )Nginx
Nginx prend simplement les demandes et sert du contenu statique ou déplace les demandes vers PHP-FPM - il n'y a généralement pas grand-chose à optimiser avec Nginx.
Idéalement, votre blog de test et votre blog cloné ont des configurations identiques, auquel cas, vous avez effectivement éliminé Nginx comme problème.
Application
Dans le cas où vous essayez d'identifier un problème dans votre code (par exemple un plugin lent, etc.), les journaux lents sont le point de départ.
MySQL
PHP
PHP-FPM
Il convient de noter que vos résultats htop montrent que php-fpm consomme la majeure partie du processeur - et votre problème semble être directement lié à cela.
Mise en cache
Une fois que vous avez optimisé chaque goulot d'étranglement probable, commencez la mise en cache.
Parfois, étant donné les limites de votre application et de votre matériel, il se peut que vous ne puissiez pas améliorer les performances du backend autant - cependant, c'est le point de la mise en cache - pour minimiser l'utilisation du backend.
Lectures complémentaires
la source
memory_limit
, il a été souligné dans un autre post que cela n'aide pas les performances.