web-dev-qa-db-fra.com

Problème universel: première demande après environ 25 secondes d'inactivité toujours plus lente (~ 1 seconde) que les demandes suivantes (~ 1/10sec)

C'est quelque chose que j'ai remarqué depuis que je travaille avec WordPress. Il s’agit d’un problème universel, en ce sens que l’installation WP se trouve sur mon compte d’hébergement partagé (je n’ai cependant pas essayé différents fournisseurs) ou une configuration LAMP locale.

Le tout nouveau WordPress épuré, avec 1 post, 1 page et le thème defaukt - ou ancien WP, avec des centaines de posts, un thème épineux et des tonnes de plugins ... ne fait pas la différence.

Travaille actuellement sur une machine virtuelle locale rapide (i7-3930k avec un SSD rapide, CentOS 6.2, Softaculous, Apache standard et MySQL, rien d’autre sur la boîte) et le scénario est le suivant:

  1. Premier chargement, toutes les pages avant ou arrière: délai d'environ 1 seconde.
  2. Chargement ultérieur de la même page ou de TOUTE AUTRE PAGE (avant ou arrière), DANS UN TEMPS DE ~ 25 secondes: réponse pratiquement instantanée.
  3. Attendez 25 secondes, rechargez, le délai d'une seconde est de retour

Cet intervalle de 25 secondes est à peu près la meilleure mesure que j'ai pu faire dans les limites de ma patience, mais il possède une assez bonne précision et répétabilité.

Autres observations:

  • Différentes installations sur la même LAMPE sont "isolées" les unes des autres, c'est-à-dire que le chargement d'un site, puis le chargement immédiat d'un autre site ne permet pas à ce dernier de se charger rapidement.
  • Ma "solution" actuelle consiste à ouvrir un onglet avec une page factice qui se recharge toutes les 20 secondes.

Est-ce que quelqu'un d'autre a remarqué ce problème? Qu'est ce que ça pourrait être? Je serais heureux de fournir tous les détails pour aider à retrouver cette chose. Merci à tous!

1
Flix

Sans regarder votre boîte pour voir exactement ce qui se passe, voici quelques pistes potentielles de lenteur:

Causes potentielles

Apache

Apache est généralement configuré de manière à ce qu'un processus httpd unique soit toujours exécuté en arrière-plan. Lorsqu'une demande arrive sur le réseau, elle lance un nouveau processus httpd pour traiter la demande. Une fois la demande fermée, le nouveau processus httpd reste en place pendant un certain temps et le processus principal lui transmet des demandes supplémentaires, le cas échéant.

Après une certaine période d'inactivité, le processus enfant s'arrête, ce qui signifie que le processus principal doit réaffecter de la mémoire et créer un nouveau processus lors de la prochaine demande.

J'utilise des termes tels que "un certain temps" et "certaine période", car ce sont toutes des options configurables pour votre serveur. Vous pouvez gérer le nombre de processus enfants en attente à l'aide de la directive StartServers. Vous pouvez également envisager de consulter les directives MinSpareThreads et MaxSpareThreads, car elles gèrent le "nombre de threads inactifs permettant de gérer les pics de demande".

Plus de détails sur ces directives sont disponibles dans le manuel .

PHP

Comme Apache, PHP peut être configuré de différentes façons en fonction de la manière dont vous l'installez sur votre serveur. Les deux plus populaires pour Apache sont les scripts CGI et les modules Apache.

En tant que script CGI, PHP sera exécuté en tant que processus séparé. Comme Apache, vous aurez généralement une instance ou deux en attente pour traiter les demandes, mais après une période d'inactivité, elles seront désactivées pour libérer de la mémoire sur votre système.

En tant que module Apache, PHP est compilé dans Apache lui-même. Ainsi, chaque fois que vous avez une instance libre de httpd, vous avez également un PHP gestionnaire mis en place. Mais comme je l'ai décrit dans le système Apache ci-dessus, ces instances supplémentaires disparaîtront à moins que Apache ne soit configuré pour les maintenir actives.

Il y a quelques informations supplémentaires sur mod_php vs PHP en tant que CGI ici .

MySQL

Le plus gros problème ici, cependant, est MySQL. Comme la plupart des autres bases de données, MySQL stocke ses données sur le disque, mais conserve les résultats des requêtes dans un cache en mémoire pour accélérer les recherches. Ce que vous voyez probablement résulte du fait que MySQL a décidé, après environ 25 secondes, que vous êtes parti et que vous n’avez plus besoin des données.

La mise en cache des requêtes de base est incroyablement efficace pour les sites à fort trafic, même ceux où le serveur utilise un SSD pour la persistance des données, car il conserve les résultats et les données en mémoire et ne nécessite aucune recherche pour répondre aux requêtes. Malheureusement, vous êtes probablement confronté à un problème où votre cache devient obsolète (ou atteint un seuil de délai d'expiration configuré de manière interne) et les demandes suivantes doivent extraire à nouveau les données du système de fichiers.

Vous pouvez en savoir plus sur le cache de requêtes dans la documentation de MySQL .

Atténuation

Configuration du serveur

Si vous n'êtes pas administrateur système, je vous conseillerais de vous en procurer un pour quelques heures afin d'examiner vos paramètres de boîte et Tweak. L’installation de nouvelles piles standard convient généralement à tout le monde (et le chargement d’une page de ~ 1 sur un serveur Vanilla, un serveur non mis en cache n’a rien de honteux). Toutefois, les configurations par défaut ne constituent pas un scénario à taille unique. Avoir un expert sur place pour configurer votre pile afin de tirer le meilleur parti de votre matériel sera un bon investissement.

Mise en cache frontale

Si vos pages ne changent pas, vous pouvez utiliser un cache frontal pour stocker les pages rendues et les servir rapidement. Batcache , par exemple, utilise Memcached sur le serveur pour stocker les pages rendues en mémoire. Cela signifie les requêtes suivantes récupèrent la publication entièrement préparée dans Memcached plutôt que d’attendre que WordPress récupère à nouveau les données de la base de données et reconstruise le contenu pour vous.

WP Super Cache fera quelque chose de similaire, mais stockera plutôt la page rendue dans un fichier HTML statique afin que les visiteurs l'utilisent au lieu que WordPress n'analyse rien. Le goulot d'étranglement pour les chargements de page devient alors la vitesse de votre SSD + la bande passante fournie par votre hôte.

6
EAMann