TIME_WAIT 消耗文件描述符?

TIME_WAIT 消耗文件描述符?

在许多 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 神话有关。人们错误地认为,关闭文件句柄时必须等待一段时间,以便操作系统释放该句柄。

关闭文件句柄将调用任何操作系统方法来释放资源,操作系统将立即释放该资源,或者有时稍后释放(如套接字的情况),但 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

与往常一样,如果可以的话,请事先进行测试。

相关内容