TIME_WAIT verbraucht Dateideskriptoren?

TIME_WAIT verbraucht Dateideskriptoren?

In vielen TCP/IP- und Web-Tuning-Anleitungen wird empfohlen, die maximale Anzahl von Dateideskriptoren zu erhöhen, wenn die Fehlermeldung „Zu viele offene Dateien“ auftritt.

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

Weiß jemand, dass TIME_WAIT Dateideskriptoren verbraucht? oder nicht

Antwort1

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

Wenn die Anwendung andererseits shutdown() aufruft, bleibt der Dateideskriptor aktiv, sodass die Anwendung weiterhin vom/auf den Socket lesen/schreiben kann.

Zitate aushttps://oroboro.com/file-handle-leaks-server/:

Mythos: Sockets in TCP TIME_WAIT halten Datei-Handles als Geisel

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 außer Umlauf gehalten werden, da die geringe Wahrscheinlichkeit besteht, dass nach dem Schließen des Sockets ein IP-Paket ankommt. Wenn das Betriebssystem den Socket erneut verwenden würde, wäre die Sitzung des neuen Benutzers dieser Verbindung durch die verlorenen Pakete einer anderen Person beeinträchtigt.

Dies hält jedoch keinen Datei-Handle offen. Wenn Sie den Datei-Deskriptor des Sockets schließen, wird der Datei-Deskriptor selbst geschlossen. Sie erhalten nicht den Fehler „Zu viele Dateien offen“. Wenn Sie zu viele Sockets offen haben, akzeptiert Ihr Server möglicherweise keine neuen Verbindungen mehr. Es gibt Möglichkeiten, damit umzugehen (Sockets wiederverwenden oder TCP TIME_WAIT verringern), aber das Erhöhen des Datei-Handle-Limits gehört nicht dazu.

Mythos: Es dauert eine Weile, bis Dateihandles freigegeben werden

Dies hängt mit dem TCP TIME_WAIT-Mythos zusammen. Der irrige Glaube, dass man beim Schließen eines Datei-Handles eine Weile warten muss, bis das Betriebssystem das Handle freigibt.

Das Schließen eines Dateihandles ruft die Betriebssystemmethode auf, die die Ressource freigibt, und das Betriebssystem gibt diese Ressource entweder sofort oder manchmal später frei, wie im Fall von Sockets. close() gibt das Dateihandle in der Dateihandle-Tabelle jedoch sofort frei. Ihr Prozess hat die vollständige Kontrolle über seine Dateihandle-Tabelle und muss nicht warten, bis ein Slot in seiner eigenen Dateideskriptortabelle freigegeben wird.

Antwort2

TIME_WAIT ist ein TCP-Status und verbraucht an sich keine Dateideskriptoren. Die Sockets in TIME_WAIT verbrauchen jedoch Dateideskriptoren. Ein Socket ist eine Datei wie fast alles andere in Unix. Wenn dies Linux ist, können Sie die Ablaufzeit von Sockets anpassen (wie lange sie in der Wartezeit sind) sowie die Socket-Wiederverwendung aktivieren /proc/sys/net/ipv4/.

Zwei Punkte sind wahrscheinlich von besonderem Interesse:

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

Wie immer gilt: Wenn möglich, testen Sie diese vorher.

verwandte Informationen