Kann ich dafür sorgen, dass die TCP / IP-Sitzung weniger als 60 Sekunden dauert?

8

Unser Server ist mit TCP / IP-Sitzungen überlastet, wir haben 1200 - 1500 davon. Die meisten von ihnen hängen im Status TIME_OUT. Es stellt sich heraus, dass eine Verbindung im Status TIME_OUT einen Socket belegt, bis eine Zeitüberschreitung von 60 Sekunden verstrichen ist.

Das Problem ist, dass der Server nicht mehr reagiert und viele Clients nicht bedient werden.

Ich habe einen einfachen Test durchgeführt: Laden Sie eine XML-Datei mit Internet Explorer 8.0 vom Server herunter. Der Download ist in Sekundenbruchteilen abgeschlossen. Aber dann sehe ich, dass die TCP / IP-Verbindung 60 Sekunden lang im Status TIME_OUT hängt.

Gibt es eine Möglichkeit, das Warten auf TIME_OUT zu beseitigen oder den Socket für neue Verbindungen freizugeben?

Ich verstehe, warum die TCP / IP-Verbindung in den Status TIME_OUT wechselt, aber ich verstehe nicht, warum Internet Explorer die Verbindung nicht schließt, nachdem der Download der XML-Datei beendet ist.

Die Details.

Unser Server führt einen in Perl (mod-perl) geschriebenen Webdienst aus. Der Dienst stellt Kunden Wetterdaten zur Verfügung. Der Client ist eine Flash-Anwendung (tatsächlich ein in die Windows-Anwendung eingebettetes Flash ActiveX-Steuerelement).

Betriebssystem: Ubuntu

Die Apache-Option "Keep Alive" ist auf 0 gesetzt

Par
quelle
Wenn Sie verstehen, warum es in den Status TIME_OUT wechselt, müssen Sie verstehen, warum dies erforderlich ist, um andere Angriffe und Probleme zu verhindern. Sie können dieses Zeitlimit reduzieren, dies hat jedoch andere Konsequenzen.
Davr
Syntax ist KeepAlive on|off. KeepAlive 0ist die Apache 1.1-Syntax; Ich nehme an, Sie verwenden das nicht.
Mark4o
Bei einer 1500 T / O-Sitzung reagiert Ihr System nicht mehr. Es gibt noch einen anderen Grund.
Poige
Gehen Verbindungen über einen billigen Router?
LatinSuD

Antworten:

7

Dies ist eine Einstellung in Ihrem TCP-Stack. Da wir nicht wissen, auf welcher Plattform Sie sich befinden, können wir nicht genau sagen, wie sie heißt und wie Sie sie ändern können.

AKTUALISIEREN

Sie verwenden also Ubuntu. Sie können sysctlden net.inet.tcp.mslWert auf die Hälfte der gewünschten TIME_WAITDauer (in Millisekunden - siehe man -S 4 tcp) reduzieren , z sysctl net.inet.tcp.msl=2500. Beachten Sie die Auswirkungen auf wandernde Pakete, die nach TIME_WAITAblauf der Frist eintreffen können .

vladr
quelle
Unser Server läuft Ubuntu, ich habe die Details aktualisiert
Par
«1200 - 1500 von ihnen» werden nicht einmal den Taschenrechner belasten, daher ist es nicht der Grund, msl
poige
1

Ich nehme an, du meinst TIME_WAIT. Der Peer, der das aktive Schließen initiiert, ist derjenige, der eingeht TIME_WAIT(siehe Zustandsübergangsdiagramm hier ). Wenn Sie also Ihren Client die Verbindung schließen lassen können, verschieben Sie das TIME_WAITOff auf den Client. In dieser Antwort finden Sie weitere Details und einen Link zu einem guten Artikel über TIME_WAITProbleme und deren Lösung.

Eine andere Alternative, wenn der Client das aktive Schließen nicht ausgeben kann, besteht darin, die Verbindung zurückzusetzen, indem Sie vor dem Schließen die Option auf false setzen. Dies führt RSTdazu, dass ein gesendet wird und nicht FIN.

Len Holgate
quelle
Oh vielen Dank! Aber wie kann ich die TCP / IP-Verbindung steuern, wenn der Benutzer eine XML-Datei mit Internet Explorer lädt?
Par
TIME_WAITist normal und wenn Ihre Serverleistung nicht darunter leidet, würde ich mir keine Sorgen machen. Wenn sich der Socket befindet TIME_WAIT, beansprucht er einige Ressourcen, bedeutet jedoch nicht, dass die Verbindung noch offen ist oder dass der Server sie noch verarbeitet.
Len Holgate
0

Der Server, der nicht reagiert, hat wahrscheinlich nichts mit der Anzahl der Verbindungen im Status TIME_WAIT zu tun. Es ist nicht klar, was Sie unter "belegt einen Socket" verstehen - der Server sollte closeden Socket zu diesem Zeitpunkt schon längst haben. Das System sollte in der Lage sein, Zehntausende von Verbindungen im Status TIME_WAIT zu verarbeiten.

David Schwartz
quelle