Mon site Drupal 6 fonctionne sans heurts depuis des années, mais a récemment connu des périodes intermittentes de lenteur extrême (chargement de pages de 10 à 60 secondes). Plusieurs heures de lenteur suivies par des heures de chargement de page normal (4-6 s). La page se charge toujours sans erreur, cela prend parfois une éternité.
------ Edit ----- Question mise à jour:
Comment puis-je résoudre ce problème?
J'ai utilisé:
------ Fin éditer -----------
Ma configuration:
Trafic: 1-3 hits/s en moyenne
Dépannage
Le problème semble être lié à la réponse d'Apache aux requêtes, mais je n'avais auparavant vu ce comportement que sous une charge de 100% du processeur. À en juger uniquement par la surveillance des ressources, il semble que très peu de choses se passent.
Voici le kicker - environ la moitié de l'accès du site provient de notre réseau local, mais si je désactive la règle de pare-feu et si je bloque l'accès de l'extérieur de notre réseau, l'accès interne (réseau) (plus de 1000 périphériques) est rapide. Mais dès que l'accès extérieur est rétabli, le site est paralysé.
Apache config? Des robots ou des robots? Des attaquants? Je suis au bout du rouleau, où devrais-je chercher pour savoir où se situe le problème?
------Modifier:-----
Ci-joint un graphique en cascade de webpagetest.org montrant un temps de chargement de 15 secondes, j'ai déjà vu des temps pouvant atteindre plusieurs minutes. Et encore une fois, le serveur fonctionne très bien la plupart du temps. Les zones vertes indiquent que le navigateur a envoyé une demande et attend de recevoir le premier octet de données du serveur. C’est certes un retard d’arrière plan, mais il est étonnant que le processeur soit à peine utilisé pendant cette lenteur.
Après de nombreuses recherches, j'ai peut-être trouvé la solution. Si je ne me trompe pas, c'était un problème de configuration Apache. Plus précisément, la directive "ThreadsPerChild". Voir ... http://httpd.Apache.org/docs/2.2/platform/windows.html
Comme Apache pour Windows est multithread, il n’utilise pas de processus distinct pour chaque demande, comme Apache le peut sous Unix. Au lieu de cela, seuls deux processus Apache sont en cours d'exécution: un processus parent et un enfant qui gère les demandes. Dans le processus enfant, chaque demande est gérée par un thread séparé.
ThreadsPerChild: Cette directive est nouvelle. Il indique au serveur combien de threads il doit utiliser. Il s'agit du nombre maximal de connexions que le serveur peut gérer à la fois. Veillez donc à définir ce nombre suffisamment haut pour votre site si vous recevez beaucoup de hits. La valeur par défaut recommandée est ThreadsPerChild 150, mais cette valeur doit être ajustée pour refléter le plus grand nombre de connexions simultanées anticipées à accepter.
Il s'avère que cette directive n'était pas du tout définie dans ma configuration et donc par défaut à 64. Je l'ai confirmé en affichant le nombre de threads pour le second processus httpd.exe dans le gestionnaire de tâches. Lorsque le serveur établissait plus de 64 connexions, les requêtes excédentaires devaient simplement attendre que le thread s'ouvre. J'ai ajouté ThreadsPerChild 150 dans mon httpd.conf.
De plus, j'ai activé le module d'état Apache http://httpd.Apache.org/docs/2.2/mod/mod_status.html
... qui permet entre autres de voir le nombre total de requêtes actives sur le serveur à un moment donné. J'ai tout de suite vu des pics allant jusqu'à 80 demandes actives. Le temps nous le dira, mais je suis convaincu que cela résoudra mon problème. Jusqu'à présent, 30 heures sans hoquet.