Ist es gefährlich, den Wert von / proc / sys / net / ipv4 / tcp_tw_reuse zu ändern?


10

Wir haben einige Produktionssysteme, die kürzlich in virtuelle Maschinen konvertiert wurden. Es gibt eine unserer Anwendungen, die häufig auf eine MySQL-Datenbank zugreift und für jede Abfrage eine Verbindung erstellt, diese Verbindung abfragt und trennt.

Es ist nicht die geeignete Art zu fragen (ich weiß), aber wir haben Einschränkungen, die wir scheinbar nicht umgehen können. Das Problem ist jedenfalls das folgende: Während der Computer ein physischer Host war, lief das Programm einwandfrei. Nach der Konvertierung in eine virtuelle Maschine haben wir zeitweise Verbindungsprobleme mit der Datenbank festgestellt. Zu einem bestimmten Zeitpunkt gab es in TIME_WAIT mehr als 24000 Socket-Verbindungen (auf dem physischen Host sah ich höchstens 17000 - nicht gut, verursachte aber keine Probleme).

Ich möchte, dass diese Verbindungen wiederverwendet werden, damit wir dieses Verbindungsproblem nicht sehen, und so:

Fragen:

Ist es in Ordnung, den Wert von tcp_tw_reuse auf 1 zu setzen? Was sind die offensichtlichen Gefahren? Gibt es einen Grund, warum ich es niemals tun sollte?

Gibt es auch eine andere Möglichkeit, das System (RHEL / CentOS) dazu zu bringen, zu verhindern, dass so viele Verbindungen in TIME_WAIT gelangen, oder sie wiederzuverwenden?

Was würde eine Änderung von tcp_tw_recycle bewirken und würde mir das helfen?

Im Voraus danke!


1
Dieser Link erklärt gut die Gefahr von tcp_tw_recycle und tcp_tw_reuse. Benutze das nicht.

Antworten:


8

Sie können die Ausfallzeit sicher verkürzen, es können jedoch Probleme mit nicht ordnungsgemäß geschlossenen Verbindungen in Netzwerken mit Paketverlust oder Jitter auftreten. Ich würde nicht bei 1 Sekunde anfangen zu stimmen, bei 15-30 anfangen und mich nach unten arbeiten.

Außerdem müssen Sie Ihre Anwendung wirklich reparieren.

RFC 1185 hat eine gute Erklärung in Abschnitt 3.2:

Wenn eine TCP-Verbindung geschlossen wird, bindet eine Verzögerung von 2 * MSL im Status TIME-WAIT das Socket-Paar für 4 Minuten (siehe Abschnitt 3.5 von [Postel81]. Auf TCP basierende Anwendungen, die eine Verbindung schließen und eine neue öffnen (z Eine FTP-Datenübertragungsverbindung im Stream-Modus muss jedes Mal ein neues Socket-Paar auswählen. Diese Verzögerung dient zwei verschiedenen Zwecken:

 (a)  Implement the full-duplex reliable close handshake of TCP. 

      The proper time to delay the final close step is not really 
      related to the MSL; it depends instead upon the RTO for the 
      FIN segments and therefore upon the RTT of the path.* 
      Although there is no formal upper-bound on RTT, common 
      network engineering practice makes an RTT greater than 1 
      minute very unlikely.  Thus, the 4 minute delay in TIME-WAIT 
      state works satisfactorily to provide a reliable full-duplex 
      TCP close.  Note again that this is independent of MSL 
      enforcement and network speed. 

      The TIME-WAIT state could cause an indirect performance 
      problem if an application needed to repeatedly close one 
      connection and open another at a very high frequency, since 
      the number of available TCP ports on a host is less than 
      2**16.  However, high network speeds are not the major 
      contributor to this problem; the RTT is the limiting factor 
      in how quickly connections can be opened and closed. 
      Therefore, this problem will no worse at high transfer 
      speeds. 

 (b)  Allow old duplicate segements to expire. 

      Suppose that a host keeps a cache of the last timestamp 
      received from each remote host.  This can be used to reject 
      old duplicate segments from earlier incarnations of the 

* Hinweis: Es könnte argumentiert werden, dass die Seite, die eine FIN sendet, weiß, welchen Grad an Zuverlässigkeit sie benötigt, und daher in der Lage sein sollte, die Länge der TIME-WAIT-Verzögerung für den Empfänger der FIN zu bestimmen. Dies könnte mit einer geeigneten TCP-Option in FIN-Segmenten erreicht werden.

      connection, if the timestamp clock can be guaranteed to have 
      ticked at least once since the old conennection was open. 
      This requires that the TIME-WAIT delay plus the RTT together 
      must be at least one tick of the sender's timestamp clock. 

      Note that this is a variant on the mechanism proposed by 
      Garlick, Rom, and Postel (see the appendix), which required 
      each host to maintain connection records containing the 
      highest sequence numbers on every connection.  Using 
      timestamps instead, it is only necessary to keep one quantity 
      per remote host, regardless of the number of simultaneous 
      connections to that host.

Danke für die Erklärung. Das Problem liegt in der Bibliothek, über die ich keine Kontrolle habe.
Sagar

6

Dies beantwortet Ihre Frage nicht (und es ist 18 Monate zu spät), schlägt jedoch eine andere Möglichkeit vor, Ihre Legacy-App dazu zu bringen, Ports wiederzuverwenden:

Eine nützliche Alternative zum Einstellen tcp_tw_reuse(oder tcp_tw_recycle) auf dem System besteht darin, eine gemeinsam genutzte Bibliothek (using LD_PRELOAD) in Ihre App einzufügen . Diese Bibliothek kann dann die Wiederverwendung des Ports ermöglichen. Auf diese Weise ermöglicht Ihre Legacy-App die Wiederverwendung von Ports, ohne dies für alle Apps auf Ihrem System zu erzwingen (es ist keine Änderung Ihrer App erforderlich), wodurch die Auswirkungen Ihrer Optimierung begrenzt werden. Beispielsweise,

    LD_PRELOAD=/opt/local/lib/libreuse.so ./legacy_app

Diese gemeinsam genutzte Bibliothek sollte den socket()Aufruf abfangen , den realen Socket () aufrufen und SO_REUSEADDR und / oder SO_REUSEPORT für den zurückgegebenen Socket festlegen. Unter http://libkeepalive.sourceforge.net finden Sie ein Beispiel dafür (dies aktiviert Keepalives, aber das Aktivieren von SO_REUSEPORT ist sehr ähnlich). Wenn Ihre schlecht benommene Legacy-App IPv6 verwendet, denken Sie daran, Zeile 55 von libkeepalive.cvon zu ändern

    if((domain == PF_INET) && (type == SOCK_STREAM)) {

zu

    if(((domain == PF_INET) || (domain == PF_INET6)) && (type == SOCK_STREAM)) {

Wenn Sie nicht weiterkommen, senden Sie mir eine E-Mail, und ich schreibe den Code und sende ihn Ihnen.


5

Ich denke, es ist in Ordnung, diesen Wert auf 1 zu ändern. Ein geeigneterer Weg könnte sein, den Befehl zu verwenden:

[root@server]# sysctl -w net.ipv4.tcp_tw_reuse=1

Es gibt keine offensichtlichen Gefahren, die ich kenne, aber eine schnelle Google-Suche erzeugt diesen Link, der bestätigt, dass dies tcp_tw_reusedie bessere Alternative ist als tcp_tw_recycle, aber trotzdem mit Vorsicht verwendet werden sollte.


2
Nein, das steht nicht. Es heißt (über tcp_tw_reuse): "Es ist im Allgemeinen eine sicherere Alternative zu tcp_tw_recycle."
Fantius

0

Die Verbindung kann nicht wiederverwendet werden, wenn sie sich in TIME WAIT befinden. Wenn zwischen der Anwendung und MySQL kein Paketverlust im Netzwerk auftritt, können Sie das Zeitlimit verringern.

Die beste Lösung besteht jedoch darin, dauerhafte Verbindungen zur Datenbank und zu einem Verbindungspool zu verwenden.


1
Eigentlich ist das nicht unbedingt wahr. Einige Systeme erlauben die Verwendung von Sockets in TIME_WAIT, worum es in meiner Frage geht. Nicht ob es möglich ist, sondern was sind die offensichtlichen und nicht so offensichtlichen Gefahren. Vielen Dank!
Sagar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.