web-dev-qa-db-fra.com

Apache TRÈS haut temps de chargement de page

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é:

  1. webpagetest.org
  2. gestionnaire de tâches Windows
  3. netstat
  4. Journaux Apache et Windows
  5. Capture de paquets de pare-feu

------ Fin éditer -----------

Ma configuration:

  • Windows Server 2003
  • Apache/2.2.15 (Win32) Jrun/4.0
  • PHP 5 MySql 5.1
  • Drupal 6
  • Fusion à froid 9
  • Environnement virtuel VMware
  • DMZ derrière un pare-feu d'entreprise
  • Trafic: 1-3 hits/s en moyenne

    Dépannage

  • Aucune erreur applicable dans le journal des erreurs Apache
  • Aucune erreur dans le journal des événements drupal
  • Le module de développement Drupal affiche 242 requêtes en 366,23 millisecondes, temps d’exécution de la page de 2069,62 ms. (Donc, il semble que les requêtes et les scripts php ne sont pas le problème)
  • AUCUN processeur, mémoire ou E/S de disque exceptionnellement élevé
  • Les applications de fusion à froid et autres pages statiques en dehors de drupal se chargent également lentement
  • le test webpagetest.org montre un temps très court jusqu'au premier octet

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.

Waterfall Chart

2
Aaron Waller

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.

4
Aaron Waller