apache webserver ne répond pas avec l'état du serveur montrant tous les processus enfants en attente de connexion [fermé]


10

Ma configuration: J'ai 3 machines de serveur Web presque identiques desservant le même site Web dynamique à haute charge avec un équilibrage de charge simple sur DNS. Le service fonctionne depuis plus de deux ans avec la même configuration apache: apache2, php5, ubuntu 8.04 linux 2.6.24-29-server.

Mon problème: depuis environ deux semaines, je rencontre des problèmes avec cette configuration. Presque tous les jours, j'ai un petit moment pendant environ 5 minutes, dans lequel le site Web est inaccessible. Je peux toujours me connecter aux serveurs via ssh. Si je cours htop, je vois la machine ne rien faire. J'ai environ 1000 processus apache en cours d'exécution, mais aucune activité de processeur.

J'ai utilisé l'apache mod_status pour déboguer cette situation. Le tableau de bord du processus ressemble à ceci:

_C.___K_______________________R._______.__K_K____K___C_______.__
_______C__________.___________________________________.________C
_.____K__________K___K_WK_____._K_____________________________._
W______K__________K________.____________________._______C_______
_C_.__K__K____.._.._____________________________________C_______
_R___________K___.______C________.C_________.______._____C______
____________KKC____K_____K__WC_________________C_____.__.____.__
_____________________C_________K______.____C______._____________
_.___C____.___.___________________________.K______.____K________
W__.___________________C.__.____K________K_______R_._.__._______
__C__C_.__________C__C_______._____W______________C_.___C_______
____.______C_____________C________.____C____________.________._K
__.__________.K_____________K_________._____C____.K__________KW_
__K.W________R_________._______.___W___________.____.__K_____W__
W___.___..________W____K

Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process

La plupart des processus n'attendent donc que la connexion. après environ 5 minutes, la situation reviendra à la normale: j'ai beaucoup moins de processus sur chaque machine, la plupart des employés ont le statut "." (c'est-à-dire qu'ils sont ouverts pour traiter une demande) et bien sûr, le site Web est accessible!

donc j'essaie de trouver quelque chose dans les journaux, mais il n'y a tout simplement rien ... le journal d'accès apache est silencieux pendant environ 4 minutes, il en va de même pour le journal des erreurs. Je ne peux pas non plus comprendre quoi que ce soit de mal dans les autres journaux système.

la situation est la même sur les 3 serveurs Web (tous ont ce pic de charge et ne répondent pas en même temps), donc je ne pense pas que ce soit lié au matériel. mais je pense que cela pourrait être lié à un problème de réseau (TCP).

des idées?

EDIT: quelques informations supplémentaires que je viens de découvrir:

Cela vient de se reproduire et j'ai pu vérifier que je ne pouvais pas non plus me connecter localement lorsque ce problème se produit.

J'ai fait quelques statistiques de connexion avec la commande suivante après qu'elle soit arrivée: netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c

  • 109 CLOSE_WAIT
  • 2652 ÉTABLI
  • 2 FIN_WAIT1
  • 11 LAST_ACK
  • 12 ÉCOUTER
  • 91 SYN_RECV
  • 1 SYN_SENT
  • 16 TIME_WAIT

Si j'exécute la même commande quelque temps plus tard, j'ai quelque chose comme ceci:

  • 4 CLÔTURE
  • 108 ÉTABLI
  • 18 FIN_WAIT1
  • 182 FIN_WAIT2
  • 37 LAST_ACK
  • 12 ÉCOUTER
  • 50 SYN_RECV
  • 11276 TIME_WAIT

Donc, dans la situation normale, je n'ai que 100 à 200 connexions ouvertes par des clients gérés par apache en ce moment. Quand j'ai ce "plantage", j'ai beaucoup plus de connexions. Quelle est la meilleure façon d'analyser cela?

EDIT2: les lignes importantes dans apache2.conf sont:

KeepAlive On
MaxKeepAliveRequests 20
KeepAliveTimeout 1
<IfModule mpm_prefork_module>
ServerLimit           920
StartServers          30
MinSpareServers       80
MaxSpareServers      120
MaxClients          920
MaxRequestsPerChild   700
</IfModule>

C'est une préfork apache2 avec php_mod.

Le serveur a 8 Go de RAM et une partition de swap de 4 Go.


Le site Web présente-t-il les mêmes symptômes lorsque vous exécutez un wget ou une boucle à partir de l'hôte local ou entre des serveurs (s'ils sont sur le même réseau)?
Alex Forbes

Peut-être qu'un dump de trafic ( tcpdump) vous aidera à aller à la racine du problème ... btw quelles sont vos politiques d'utilisation de la mémoire et de pare-feu?
drcelus

@ al4 la dernière fois que cela s'est produit, j'ai pu me connecter à la page d'état du serveur depuis l'hôte local, alors que je n'ai pas pu me connecter à la page Web de l'extérieur. je ne suis pas tout à fait sûr, car cela pourrait aussi être une chose aléatoire, alors que certains des travailleurs sont devenus disponibles. je vais tester cela plus la prochaine fois que le problème se produit. quelle serait votre suggestion, si je pouvais confirmer une différence entre les connexions externes et locales?
Jeff

Si vous pouvez confirmer qu'il fonctionne localement mais pas de l'extérieur, cela renforce les arguments en faveur du réseau - ce qui signifie que vous devriez tester avec tcpdumps et wirehark aux deux extrémités pour voir ce qui se passe, plutôt que de renforcer les processus apache. Je testerais également à partir d'un hôte sur le même LAN si possible. Et vérifiez dmesg pour voir s'il y a des messages qui pourraient être liés mais qui semblent avoir déjà été faits.
Alex Forbes

cela vient de se reproduire. et j'ai pu vérifier que je ne pouvais pas non plus me connecter localement lorsque ce problème se produit. j'ai également fait quelques statistiques de connexion avec netstat: voir le texte de la question
Jeff

Réponses:



1

Premièrement: vérifiez votre Max open fileslimite sur le processus. Une connexion socket active compte comme un fichier ouvert. cat /proc/###/limitsest un bon moyen de vérifier la valeur effective d'un autre processus. Vous pouvez obtenir une liste de fichiers ouverts avec lsof -p ###où ### est l'ID de processus de votre serveur Web. Vous pouvez comparer lsof -p ### | wc -lpour voir à quel point vous vous rapprochez de la limite. Vous devriez également voir des messages dans le fichier error_log d'apache si vous atteignez la limite.

Vous avez besoin d'un descripteur de fichier pour chaque connexion socket, ainsi que pour chaque script cgi ou référence de fichier de données. Pour 920 MaxClients, vous devez configurer au moins 4 000 fichiers pour le processus httpd. Vous pouvez augmenter le nombre de fichiers en ajoutant un fichier dans /etc/security/limits.d/ avec le contenu suivant. Assurez-vous que le nom d'utilisateur correspond à ce que vous utilisez pour votre serveur Web.

apache soft nofile 10000
apache hard nofile 10000

Deuxièmement: si l'épuisement du port est votre problème, vous pouvez ajuster certains paramètres IP dans /etc/sysctl.conf. (À commencer par net.ipv4.tcp_fin_timeout). C'est généralement un problème uniquement avec beaucoup de très petites connexions. De nombreuses sockets TIME_WAIT en sont un indicateur, mais cela indique l'épuisement du port uniquement lorsqu'il est accompagné d'erreurs dans syslog about possible SYN floodinget Sending cookies. Vous devez également vous assurer que votre serveur se trouve derrière un pare-feu qui peut contrecarrer les attaques SYN malveillantes.


0

Gardez également à l'esprit que dans le MPM prefork, chaque processus aura PHP dans son espace mémoire (quel est son paramètre de limite de mémoire?). Vous pouvez essayer de passer au MPM de travail, qui peut nécessiter un module PHP légèrement différent.

Également une boucle d'oreille à distance pour couper votre configuration Apache de modules étrangers

D'après mon expérience, de telles choses sont déclenchées par des choses comme un robot de recherche ou des choses comme les conflits ARP. Ou les niveaux de trafic dans une partie connexe du réseau.

Vous pourriez bien trouver 'sar' utile ... pas le plus amical, mais certainement utile.

Peut-être aussi lié à io. Sar peut vous dire (si vous le configurez pour enregistrer l'activité du disque), quel est le temps d'attente io moyen. Vous pouvez également consulter le temps d'attente IO en haut (qui est un pourcentage, lisez ce qu'il signifie réellement). Cela peut être important si vous utilisez un SAN ou un environnement virtuel.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.