Notre serveur est surchargé de sessions TCP / IP, nous en avons 1200 - 1500. La plupart d'entre eux sont suspendus dans l'état TIME_OUT. Il s'avère qu'une connexion dans l'état TIME_OUT occupe un socket jusqu'à l'expiration du délai de 60 secondes.
Le problème est que le serveur ne répond plus et que de nombreux clients ne sont pas servis.
J'ai fait un test simple: téléchargez un fichier XML depuis le serveur avec Internet Explorer 8.0 Le téléchargement se termine en une fraction de seconde. Mais je vois que la connexion TCP / IP est suspendue dans l'état TIME_OUT pendant 60 secondes.
Existe-t-il un moyen de se débarrasser de TIME_OUT en attente ou de réduire le temps de libérer le socket pour de nouvelles connexions?
Je comprends pourquoi la connexion TCP / IP entre dans l'état TIME_OUT, mais je ne comprends pas pourquoi Internet Explorer ne ferme pas la connexion une fois le téléchargement du fichier XML terminé.
Les détails.
Notre serveur exécute un service Web écrit en Perl (mod-perl). Le service fournit des données météorologiques aux clients. Le client est une application Flash (en fait un contrôle Flash ActiveX intégré à l'application Windows).
OS: Ubuntu
L'option Apache "Keep Alive" est définie sur 0
KeepAlive on|off
.KeepAlive 0
est la syntaxe Apache 1.1; Je suppose que vous n'utilisez pas cela.Réponses:
Il s'agit d'un paramètre de votre pile TCP. Puisque nous ne savons pas sur quelle plateforme vous vous trouvez, nous ne pouvons pas dire exactement comment elle s'appelle et comment la changer.
MISE À JOUR
Vous utilisez donc Ubuntu. Vous pouvez utiliser
sysctl
pour réduire lanet.inet.tcp.msl
valeur à la moitié de laTIME_WAIT
durée souhaitée (en millisecondes - voirman -S 4 tcp
), par exemplesysctl net.inet.tcp.msl=2500
. Méfiez-vous des implications de le faire en ce qui concerne les paquets errants qui peuvent arriver après la fin de laTIME_WAIT
période.la source
Je suppose que tu veux dire
TIME_WAIT
. L'homologue qui initie la fermeture active est celui qui entreTIME_WAIT
(voir le diagramme de transition d'état ici ), donc si vous pouvez demander à votre client de fermer la connexion, vous déplacerez l'TIME_WAIT
arrêt vers le client. Voir cette réponse pour plus de détails et un lien vers un bon article sur lesTIME_WAIT
problèmes et comment les résoudre.Une autre alternative, si vous ne parvenez pas à ce que le client émette la fermeture active, est de réinitialiser la connexion en définissant la temporisation sur false avant de la fermer. Cela provoque
RST
l'envoi d'un plutôtFIN
.la source
TIME_WAIT
est normal et à moins que les performances de votre serveur ne souffrent à cause de cela, ce n'est pas quelque chose dont je m'inquiéterais trop. Lorsque le socket est en place,TIME_WAIT
il prend des ressources mais cela ne signifie pas que la connexion est toujours ouverte ou que le serveur la traite toujours.Le serveur qui ne répond pas n'a probablement rien à voir avec le nombre de connexions dans l'état TIME_WAIT. On ne sait pas exactement ce que vous entendez par «occupe un socket» - le serveur devrait depuis longtemps avoir
close
le socket à ce stade. Le système doit être capable de gérer des dizaines de milliers de connexions dans l'état TIME_WAIT.la source