Beenden von CLOSE_WAIT-Sockets ohne Beenden des übergeordneten Prozesses unter Linux

8

Tomcat verlässt mich mit CLOSE_WAIT-Sockets, die letztendlich die maximale Anzahl von Verbindungen sättigen.

Ich habe viele Methoden in meinem Client- und Servercode ausprobiert, um diese ohne Erfolg zu entfernen, einschließlich des Schließens von Verbindungen, des Aufrufs von System.gc () usw.

Jetzt versuche ich einen Weg zu finden, um diese im Betriebssystem schnell zu beheben. Ich habe Conntrack in Betrieb, bin mir aber nicht sicher, wie ich das verwenden soll, um diese Verbindungen zu beenden. Ich habe auch / proc / sys / net / ipv4 / netfilter / ip_conntrack_tcp_timeout_close_wait auf 1 gesetzt, was natürlich zu niedrig ist, aber die Verbindungen bleiben bestehen.

Gibt es eine Möglichkeit, diese Zombie-Sockel zu töten?

Ubuntu ausführen.

Alex Neth
quelle

Antworten:

3

Ich glaube, CLOSE_WAIT auf der Serverseite der Verbindung bedeutet, dass der Server eine FIN vom Client erhalten hat, dies dem Client zurück bestätigt und dann die Anwendung informiert hat, dass er die Verbindung schließen kann.

Es ist dann Sache der Anwendung, die Verbindung zu trennen, sobald sichergestellt ist, dass alle Daten aus der Verbindung gelesen wurden.

Sobald die Verbindung abgebrochen wird, sendet der Server eine endgültige FIN zurück an den Client und die Verbindung wird vollständig geschlossen.

Schlägt vor, dass es nichts mit "TCP_tuning" zu tun hat

Sind Sie sicher, dass Ihre Anwendung die Sockets schließt?

Als ich einen Python-Server schrieb, lernte ich Folgendes: D.

UPDATE
Abhängig von Ihrer Tomcat-Version ist dieses Problem möglicherweise aufgrund eines in Tomcat 6 mit der Funktion keepAliveTimeout im AJP-Protokoll von Coyote eingeführten Fehlers aufgetreten.
Die Art dieses Problems wurde dadurch verursacht, dass Tomcat Sockets nach Ablauf von keepAliveTimeout nicht schließen konnte. Die Tomcat-Sockets würden in einem CLOSE_WAIT-Status bleiben, aber die entsprechenden mod_jk-Sockets würden wie gewohnt geschlossen.

Sein Fehler wurde in SVN Commit R589062 behoben und in Tomcat 6.0.15 veröffentlicht

Arenstar
quelle
Meine Anwendung ist Tomcat. Ich habe an einigen Stellen gelesen, nämlich hier: old.nabble.com/…, dass Tomcat Sockets nicht immer schließt, bis die Verbindung durch Müll gesammelt wurde, aber System.gc () scheint dies nicht zu tun. Ansonsten habe ich keine Kontrolle über den Socket, da dies Tomcat ist. Meine Anwendung ruft wann immer möglich close () für die Verbindung auf. (Dies tritt auch bei Jetty auf, so dass es sich möglicherweise um ein allgemeineres Java-Problem handelt.)
Alex Neth
Ich hoffe, es gibt eine Möglichkeit, das Betriebssystem CLOSE_WAIT-Sockets nach einer bestimmten Zeit töten zu lassen.
Alex Neth
Verwenden Sie einen SingleClientConnManager und erstellen Sie ihn für jede Anforderung und fahren Sie ihn herunter. Das hat den Trick gemacht. Ich gehe davon aus, dass dies erforderlich ist, um sicherzustellen, dass die Verbindung geschlossen ist. (sagt einen Beitrag, den ich gerade gefunden habe)
Arenstar
Ich glaube nicht, dass es eine Möglichkeit gibt, dies in einem Servlet zu tun.
Alex Neth
Meine Tomcat-Version ist 6.0.26, daher sollte dieser Fehler nicht auftreten.
Alex Neth