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!
Antworten:
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:
quelle
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
(odertcp_tw_recycle
) auf dem System besteht darin, eine gemeinsam genutzte Bibliothek (usingLD_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,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 vonlibkeepalive.c
von zu ändernzu
Wenn Sie nicht weiterkommen, senden Sie mir eine E-Mail, und ich schreibe den Code und sende ihn Ihnen.
quelle
Ich denke, es ist in Ordnung, diesen Wert auf 1 zu ändern. Ein geeigneterer Weg könnte sein, den Befehl zu verwenden:
Es gibt keine offensichtlichen Gefahren, die ich kenne, aber eine schnelle Google-Suche erzeugt diesen Link, der bestätigt, dass dies
tcp_tw_reuse
die bessere Alternative ist alstcp_tw_recycle
, aber trotzdem mit Vorsicht verwendet werden sollte.quelle
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.
quelle