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?