
在許多 TCPIP 和 Web 調整指南中,建議在出現「開啟文件過多」錯誤時增加文件描述符的最大數量
但是,我在“lsof -i”的輸出中看不到 TIME_WAIT
有誰知道 TIME_WAIT 消耗文件描述符?或不
答案1
應用程式使用檔案描述符從套接字讀取/寫入。因此,如果應用程式呼叫 close(),則檔案描述符將立即釋放。
另一方面,如果應用程式呼叫 shutdown(),檔案描述符將保持有效,以便應用程式仍然可以從套接字讀取/寫入。
引述自https://oroboro.com/file-handle-leaks-server/:
迷思:TCP TIME_WAIT 中的套接字正在劫持檔案句柄
當您關閉 TCP/IP 套接字時,作業系統不會立即釋放該套接字。由於複雜的原因,套接字結構必須在幾分鐘內保持不循環,因為 IP 封包在套接字關閉後到達該套接字的可能性很小。如果作業系統重新使用套接字,則該連接的新使用者的會話將受到其他人遺失的資料包的影響。
但這並不會使文件句柄保持開啟狀態。當關閉套接字的檔案描述符時,檔案描述符本身也被關閉。您不會收到“打開的文件太多”錯誤。如果開啟的套接字太多,那麼您的伺服器可能會停止接受新連線。有多種方法可以解決這個問題(允許重複使用套接字,或降低 TCP TIME_WAIT ),但提高檔案句柄限制不是其中之一。
迷思:釋放檔案句柄需要時間
這與 TCP TIME_WAIT 神話有關。人們錯誤地認為,當關閉檔案句柄時,必須等待作業系統一段時間才能釋放該句柄。
關閉檔案句柄將呼叫任何釋放資源的os 方法,作業系統將立即釋放該資源,或有時稍後(如套接字的情況)釋放該資源,但close() 將立即釋放檔案句柄表中的檔案句柄。您的進程完全控制其檔案句柄表,並且不需要等待任何內容來釋放其自己的檔案描述符表中的插槽。
答案2
TIME_WAIT 是一種 TCP 狀態,本身不消耗檔案描述符。然而,TIME_WAIT 中的套接字將消耗檔案描述符。套接字是一個文件,就像 UNIX 中的其他所有東西一樣。如果這是 Linux,您可以調整套接字的過期時間(它們等待的時間)以及在/proc/sys/net/ipv4/
.
特別感興趣的兩項可能是:
sysctl -w net.ipv4.tcp_tw_recycle=1
sysctl -w net.ipv4.tcp_tw_reuse=1
像往常一樣,如果可以的話,請提前測試這些。