Puis-je faire en sorte que la session TCP / IP s'exécute en moins de 60 secondes?

8

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

par
la source
Si vous comprenez pourquoi il entre dans l'état TIME_OUT, vous devez comprendre pourquoi cela est nécessaire pour éviter d'autres attaques et problèmes. Vous pouvez réduire ce délai, mais cela a d'autres conséquences.
davr
La syntaxe est KeepAlive on|off. KeepAlive 0est la syntaxe Apache 1.1; Je suppose que vous n'utilisez pas cela.
mark4o
La session 1500 T / O ne rend pas votre système insensible. Il y a une autre raison.
poige
Les connexions passent-elles par un routeur bon marché?
LatinSuD

Réponses:

7

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 sysctlpour réduire la net.inet.tcp.mslvaleur à la moitié de la TIME_WAITdurée souhaitée (en millisecondes - voir man -S 4 tcp), par exemple sysctl 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 la TIME_WAITpériode.

vladr
la source
Notre serveur fonctionne sous Ubuntu, j'ai mis à jour les détails
par
«1200 - 1500 d'entre eux» ne fonctionnera même pas sur la calculatrice, ce n'est donc pas la raison pour régler msl
poige
1

Je suppose que tu veux dire TIME_WAIT. L'homologue qui initie la fermeture active est celui qui entre TIME_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_WAITarrêt vers le client. Voir cette réponse pour plus de détails et un lien vers un bon article sur les TIME_WAITproblè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 RSTl'envoi d'un plutôt FIN.

Len Holgate
la source
Oh merci beaucoup! Mais comment puis-je contrôler la connexion TCP / IP lorsque l'utilisateur charge un fichier XML avec Internet Explorer?
par
TIME_WAITest 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_WAITil prend des ressources mais cela ne signifie pas que la connexion est toujours ouverte ou que le serveur la traite toujours.
Len Holgate
0

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 closele socket à ce stade. Le système doit être capable de gérer des dizaines de milliers de connexions dans l'état TIME_WAIT.

David Schwartz
la source