webentwicklung-frage-antwort-db.com.de

TIME_WAIT einstellen TCP

Wir versuchen, eine Anwendung zu optimieren, die Nachrichten über TCP akzeptiert und auch TCP für einige der internen Nachrichten verwendet. Während des Lasttests stellten wir fest, dass sich die Antwortzeit erheblich verkürzt (und dann ganz stoppt), wenn mehr gleichzeitige Anforderungen an das System gestellt werden. Während dieser Zeit sehen wir eine Menge von TCP -Verbindungen im TIME_WAIT-Status, und jemand schlug vor, die TIME_WAIT-Umgebungsvariable von standardmäßig 60 Sekunden auf 30 zu senken.

Von was ich verstehe , legt die Einstellung TIME_WAIT im Wesentlichen die Zeit fest, zu der eine TCP -Ressource dem System wieder verfügbar gemacht wird, nachdem die Verbindung geschlossen wurde.

Ich bin kein "Netzwerk-Typ" und weiß sehr wenig über diese Dinge. Ich brauche viel von dem, was in diesem verknüpften Beitrag steht, aber ein wenig "dumm".

  • Ich denke, ich verstehe, warum der TIME_WAIT-Wert nicht auf 0 gesetzt werden kann, aber kann er sicher auf 5 gesetzt werden? Was ist mit 10? Was bestimmt eine "sichere" Einstellung für diesen Wert?
  • Warum ist der Standardwert für diesen Wert 60? Ich vermute, dass die Leute viel klüger waren als ich, einen guten Grund dafür zu haben, dies als vernünftigen Ausfall zu wählen.
  • Was sollte ich noch über die potenziellen Risiken und Vorteile wissen, die sich aus der Überschreitung dieses Wertes ergeben?
64
Vinnie

Eine Verbindung TCP wird vom Tuple angegeben (Quell-IP, Quellport, Ziel-IP, Zielport).

Der Grund, warum es nach dem Herunterfahren der Sitzung einen TIME_WAIT-Status gibt, liegt möglicherweise daran, dass möglicherweise noch Live-Pakete im Netzwerk auf dem Weg zu Ihnen sind (oder von Ihnen, was zu einer Art Reaktion führt). Wenn Sie dasselbe Tuple neu erstellen und eines dieser Pakete angezeigt wird, wird es als gültiges Paket für Ihre Verbindung behandelt (und möglicherweise einen Fehler aufgrund der Sequenzierung verursachen).

Die TIME_WAIT-Zeit wird im Allgemeinen so eingestellt, dass das maximale Alter der Pakete verdoppelt wird. Dieser Wert gibt das maximale Alter an, zu dem Ihre Pakete berechtigt sind, bevor das Netzwerk sie verwirft.

Dies garantiert, dass, bevor Sie eine Verbindung mit demselben Tuple herstellen dürfen, alle Pakete, die zu früheren Inkarnationen dieses Tuples gehören, tot sein werden.

Dies bestimmt im Allgemeinen den Mindestwert, den Sie verwenden sollten. Das maximale Paketalter wird durch die Netzwerkeigenschaften vorgegeben, zum Beispiel, dass die Lebensdauer der Satelliten höher ist als die der LAN-Lebensdauer, da die Pakete noch viel weiter gehen müssen.

91
paxdiablo

Normalerweise sollte nur der Endpunkt, der ein "Active Close" ausgibt, den Status TIME_WAIT annehmen. Wenn möglich, lassen Sie Ihre Clients das aktive Schließen ausgeben, wodurch TIME_WAIT auf dem Client und NICHT auf dem Server verbleibt. 

Siehe hier: http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for-protocols-and-scalable-servers.html und  http://www.isi.edu/touch/pubs/infocomm99/infocomm99-web/ für Details (später wird auch erklärt, warum dies aufgrund des Protokolldesigns, das TIME_WAIT nicht berücksichtigt, nicht immer möglich ist).

19
Len Holgate

Pax stimmt mit den Gründen für TIME_WAIT und den Grund, warum Sie vorsichtig sein sollten, um die Standardeinstellung zu verringern.

Eine bessere Lösung besteht darin, die für das Ursprungsende Ihrer Sockets verwendeten Portnummern zu ändern. Wenn Sie dies getan haben, ist es Ihnen egal, wie lange es dauert, auf einzelne Steckdosen zu warten.

Zum Abhören von Sockets können Sie SO_REUSEADDR verwenden, um das Abhören des Abhörsockels zu ermöglichen, obwohl TIME_WAIT-Sockets herumliegen.

9
Darron

In Windows können Sie kann sich ändern it über die Registrierung :

; Set the TIME_WAIT delay to 30 seconds (0x1E)

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters]
"TcpTimedWaitDelay"=dword:0000001E
3
Synetech

die Einstellung von tcp_reuse ist sinnvoller als das Ändern von time_wait, sofern Sie über den Parameter verfügen (Kernel 3.2 und höher, der leider alle Versionen von RHEL und XenServer disqualifiziert). 

Wenn Sie den Wert vor allem für Benutzer mit VPN-Verbindung herabsetzen, kann dies dazu führen, dass Proxy-Tunnel auf der ausgehenden Verbindung ständig neu erstellt werden. Mit der Standardkonfiguration von Netscaler (XenServer), die niedriger ist als die Standardkonfiguration von Linux, muss Chrome den Proxy-Tunnel manchmal bis zu einem Dutzend Mal neu erstellen, um eine Webseite abzurufen. Anwendungen, die nicht wiederholt werden, wie Maven und Eclipse P2, schlagen einfach fehl. 

Das ursprüngliche Motiv für den Parameter (Duplizierung vermeiden) wurde durch einen RFC TCP überflüssig gemacht, der den Zeitstempel für alle TCP -Anfragen angibt.

2
andrew glynn

Ich habe das Testen einer Serveranwendung (unter Linux) mit einem Testprogramm mit 20 Threads geladen.

In 959.000 Connect/Close-Zyklen hatte ich 44.000 fehlerhafte Verbindungen und viele tausend Sockets in TIME_WAIT.

Ich setze SO_LINGER vor dem Schließen-Aufruf auf 0 und hatte in nachfolgenden Läufen des Testprogramms keine Verbindungsfehler und weniger als 20 Sockets in TIME_WAIT.

0
Michael Taylor