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
quelle
KeepAlive on|off
.KeepAlive 0
ist die Apache 1.1-Syntax; Ich nehme an, Sie verwenden das nicht.Antworten:
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
sysctl
dennet.inet.tcp.msl
Wert auf die Hälfte der gewünschtenTIME_WAIT
Dauer (in Millisekunden - sieheman -S 4 tcp
) reduzieren , zsysctl net.inet.tcp.msl=2500
. Beachten Sie die Auswirkungen auf wandernde Pakete, die nachTIME_WAIT
Ablauf der Frist eintreffen können .quelle
Ich nehme an, du meinst
TIME_WAIT
. Der Peer, der das aktive Schließen initiiert, ist derjenige, der eingehtTIME_WAIT
(siehe Zustandsübergangsdiagramm hier ). Wenn Sie also Ihren Client die Verbindung schließen lassen können, verschieben Sie dasTIME_WAIT
Off auf den Client. In dieser Antwort finden Sie weitere Details und einen Link zu einem guten Artikel überTIME_WAIT
Probleme 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
RST
dazu, dass ein gesendet wird und nichtFIN
.quelle
TIME_WAIT
ist normal und wenn Ihre Serverleistung nicht darunter leidet, würde ich mir keine Sorgen machen. Wenn sich der Socket befindetTIME_WAIT
, beansprucht er einige Ressourcen, bedeutet jedoch nicht, dass die Verbindung noch offen ist oder dass der Server sie noch verarbeitet.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
close
den Socket zu diesem Zeitpunkt schon längst haben. Das System sollte in der Lage sein, Zehntausende von Verbindungen im Status TIME_WAIT zu verarbeiten.quelle