在许多TCPIP和Web调优指南中,建议在获得错误“打开的文件太多”时增加文件描述符的最大数量。
但是,我在"lsof -i“的输出中看不到-i
有人知道TIME_WAIT使用文件描述符吗?或者不是
发布于 2016-03-11 17:30:53
应用程序使用文件描述符从套接字进行读写。因此,如果应用程序调用close(),文件描述符将立即释放。
另一方面,如果应用程序调用关机(),文件描述符将保持有效,以便应用程序仍然可以从/写入套接字。
来自https://oroboro.com/file-handle-leaks-server/的引文:
误解: TCP TIME_WAIT中的套接字在关闭TCP/IP套接字时会将文件句柄作为人质,操作系统不会立即释放套接字。由于复杂的原因,套接字结构必须保持几分钟不流通,因为IP数据包在关闭后很有可能到达该套接字上。如果操作系统重复使用套接字,那么连接的新用户将受到其他人丢失的数据包的影响。但这不会让文件句柄打开。关闭套接字的文件描述符时,文件描述符本身将关闭。您将不会得到“太多的文件打开”错误。如果您有太多的套接字打开,那么您的服务器可能停止接受新的连接。有一些方法可以解决这个问题(允许重新使用套接字,或者降低TCP TIME_WAIT ),但提高文件句柄限制并不是其中之一。神话:释放文件句柄需要时间,这与TCP TIME_WAIT神话有关。错误的看法是,当您关闭文件句柄时,您必须等待一段时间,操作系统才能释放句柄。关闭文件句柄将调用到释放资源的任何os方法中,操作系统将立即释放该资源,有时也会释放该资源,比如在带有套接字的情况下,但是close()将立即释放文件句柄中的文件句柄。您的进程完全控制了它的文件句柄表,不需要等待任何东西来释放它自己的文件描述符表中的一个插槽。
发布于 2010-09-10 15:32:50
TIME_WAIT是一种TCP状态,不使用文件描述符persay。但是,TIME_WAIT中的套接字将消耗文件描述符。套接字是一个文件,就像unix中的其他所有内容一样。如果这是Linux,您可以调优套接字的过期时间(它们在时间上等待了多长时间),以及在/proc/sys/net/ipv4/中启用套接字回收。
特别令人感兴趣的两个项目可能是:
sysctl -w net.ipv4.tcp_tw_recycle=1
sysctl -w net.ipv4.tcp_tw_reuse=1和往常一样,如果可以的话,先测试一下这些。
https://serverfault.com/questions/179914
复制相似问题