TIME_WAIT verbraucht Dateideskriptoren?

9

In vielen TCPIP- und Web-Tuning-Anleitungen wird empfohlen, die maximale Anzahl von Dateideskriptoren zu erhöhen, wenn der Fehler "Zu viele geöffnete Dateien" angezeigt wird.

aber ich kann TIME_WAIT in den Ausgaben von "lsof -i" nicht sehen

Weiß jemand, dass TIME_WAIT Dateideskriptoren verwendet? oder nicht


quelle

Antworten:

6

Der Dateideskriptor wird von der Anwendung zum Lesen / Schreiben aus dem Socket verwendet. Wenn die Anwendung close () aufruft, wird der Dateideskriptor sofort freigegeben.

Wenn die Anwendung hingegen shutdown () aufruft, bleibt der Dateideskriptor wirksam, sodass die Anwendung weiterhin vom / in den Socket lesen / schreiben kann.

Zitate von https://oroboro.com/file-handle-leaks-server/ :

Mythos: Sockets in TCP TIME_WAIT enthalten Dateihandles Hostage

Wenn Sie einen TCP / IP-Socket schließen, gibt das Betriebssystem den Socket nicht sofort frei. Aus komplexen Gründen muss die Socket-Struktur einige Minuten lang nicht im Umlauf sein, da die Wahrscheinlichkeit gering ist, dass ein IP-Paket nach dem Schließen auf diesem Socket ankommt. Wenn das Betriebssystem den Socket erneut verwendet, wird die Sitzung des neuen Benutzers dieser Verbindung von den verlorenen Paketen eines anderen beeinflusst.

Dies hält jedoch kein Dateihandle offen. Wenn Sie den Dateideskriptor des Sockets schließen, wird der Dateideskriptor selbst geschlossen. Sie erhalten nicht den Fehler "Zu viele Dateien geöffnet". Wenn zu viele Sockets geöffnet sind, akzeptiert Ihr Server möglicherweise keine neuen Verbindungen mehr. Es gibt Möglichkeiten, damit umzugehen (Sockets können wiederverwendet werden oder TCP TIME_WAIT wird gesenkt) - aber das Anheben des Limits für das Dateihandle gehört nicht dazu.

Mythos: Es dauert einige Zeit, bis die Dateihandles freigegeben sind

Dies hängt mit dem Mythos TCP TIME_WAIT zusammen. Die falsche Annahme, dass Sie beim Schließen eines Dateihandles einige Zeit warten müssen, bis das Betriebssystem das Handle freigibt.

Durch das Schließen eines Dateihandles wird eine beliebige os-Methode aufgerufen, die die Ressource freigibt, und das Betriebssystem gibt diese Ressource entweder sofort oder manchmal später frei, wie im Fall von Sockets. Close () gibt jedoch das Dateihandle in der Dateihandle-Tabelle sofort frei. Ihr Prozess hat die vollständige Kontrolle über seine Dateihandle-Tabelle und muss nicht warten, bis ein Slot in seiner eigenen Dateideskriptortabelle frei ist.

James Gan
quelle
3

TIME_WAIT ist ein TCP-Status und verbraucht kein Persay für Dateideskriptoren. Die Sockets in TIME_WAIT verbrauchen jedoch Dateideskriptoren. Ein Socket ist eine Datei wie fast alles andere unter Unix. Wenn dies Linux ist, können Sie die Ablaufzeit von Sockets (wie lange sie warten) einstellen und das Socket-Recycling aktivieren /proc/sys/net/ipv4/.

Zwei Punkte von besonderem Interesse sind wahrscheinlich:

sysctl -w net.ipv4.tcp_tw_recycle=1
sysctl -w net.ipv4.tcp_tw_reuse=1

Testen Sie diese wie immer vorher, wenn Sie können.

Kyle Brandt
quelle
Ist es möglich, eine "TIME_WAIT" -Verbindung zu "ESTABLISHED" wieder herzustellen?
JYZ
1
AFAIK, die Seite der Verbindung, die ein close () am Socket ausgeführt hat, geht in TIME_WAIT an diesem Socket, um sicherzustellen, dass die andere Seite das close () / FIN empfängt. Wenn der Peer die FIN nicht sieht, sollte die Seite, die close () aufruft, sie erneut übertragen. Mein Verständnis ist also, dass die Antwort lautet: "Es sollte nicht möglich sein, nein."
James Cape