在许多 TCPIP 和 Web 调试指南中,建议在收到错误“打开的文件太多”时增加文件描述符的最大数量
但是,我在“lsof -i”的输出中看不到 TIME_WAIT
有谁知道 TIME_WAIT 消耗文件描述符?或不
应用程序使用文件描述符从套接字读取/写入。因此,如果应用程序调用 close(),文件描述符将立即释放。
另一方面,如果应用程序调用shutdown(),文件描述符将保持有效,以便应用程序仍然可以从/向套接字读/写。
来自https://oroboro.com/file-handle-leaks-server/ 的报价:
误解:TCP TIME_WAIT 中的套接字持有文件句柄人质
当您关闭 TCP/IP 套接字时,操作系统不会立即释放该套接字。由于复杂的原因,套接字结构必须在几分钟内停止流通,因为在关闭套接字后,IP 数据包可能会到达该套接字的可能性很小。如果操作系统重新使用套接字,则该连接的新用户的会话将受到其他人丢失的数据包的影响。
但这并没有打开文件句柄。当您关闭套接字的文件描述符时,文件描述符本身也将关闭。您不会收到“打开的文件太多”错误。如果您打开了太多套接字,那么您的服务器可能会停止接受新连接。有办法解决这个问题(允许重新使用套接字,或降低 TCP TIME_WAIT )-但提高文件句柄限制不是其中之一。
误区:释放文件句柄需要时间
这与 TCP TIME_WAIT 神话有关。错误地认为关闭文件句柄时必须等待操作系统释放句柄。
关闭文件句柄将调用释放资源的任何 os 方法,操作系统将立即释放该资源,或者有时像套接字一样稍后释放该资源,但 close() 将立即释放文件句柄表中的文件句柄。您的进程完全控制其文件句柄表,并且不需要等待任何操作来释放其自己的文件描述符表中的插槽。
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
Run Code Online (Sandbox Code Playgroud)
与往常一样,如果可以的话,请提前测试这些。
归档时间: |
|
查看次数: |
5493 次 |
最近记录: |