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.
tcpdump
) vous aidera à aller à la racine du problème ... btw quelles sont vos politiques d'utilisation de la mémoire et de pare-feu?Réponses:
Vous devez activer le statut étendu de mod_status ( http://httpd.apache.org/docs/2.2/mod/mod_status.html#extendedstatus ) afin de surveiller les hôtes actuels et les demandes en cours de traitement. Je pense qu'il y a un (des) script (s) / page (s) qui prennent trop de temps pour libérer la connexion et cela rend les connexions empilables.
la source
Premièrement: vérifiez votre
Max open files
limite sur le processus. Une connexion socket active compte comme un fichier ouvert.cat /proc/###/limits
est un bon moyen de vérifier la valeur effective d'un autre processus. Vous pouvez obtenir une liste de fichiers ouverts aveclsof -p ###
où ### est l'ID de processus de votre serveur Web. Vous pouvez comparerlsof -p ### | wc -l
pour 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.
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 aboutpossible SYN flooding
etSending cookies
. Vous devez également vous assurer que votre serveur se trouve derrière un pare-feu qui peut contrecarrer les attaques SYN malveillantes.la source
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.
la source