在许多TCPIP和Web Tuning指南中,build议在获得错误“打开的文件过多”时增加文件描述符的最大数量
但是,在“lsof -i”的输出中我看不到TIME_WAIT
有谁知道TIME_WAIT消耗文件描述符? 或不
文件描述符被应用程序用来从套接字读取/写入。 因此,如果应用程序调用close(),则立即释放文件描述符。
另一方面,如果应用程序调用shutdown(),则文件描述符将保持有效,以便应用程序仍然可以从套接字读取/写入数据。
来自https://oroboro.com/file-handle-leaks-server/的引用:
误区:TCP TIME_WAIT中的套接字持有文件句柄Hostage
closuresTCP / IP套接字时,操作系统不会立即释放套接字。 出于复杂的原因,套接字结构必须在几分钟内保持stream通状态,因为IP封包在closures之后很可能会到达该套接字。 如果操作系统重新使用套接字,那么该连接的新用户将会让他们的会话受到别人丢失的数据包的影响。
但是这并不包含打开的文件句柄。 当closures套接字的文件描述符时,文件描述符本身是closures的。 你不会得到“太多文件打开”的错误。 如果您打开了太多的套接字,那么您的服务器可能会停止接受新的连接。 有办法来处理(允许重新使用套接字,或者降低TCP TIME_WAIT) – 但是提高文件句柄限制不是其中之一。
神话:文件句柄需要时间才能发布
这与TCP TIME_WAIT神话有关。 误以为当你closures一个文件句柄时,你必须等待一段时间才能让操作系统释放句柄。
closures一个文件句柄将调用任何os方法释放资源,操作系统将立即释放该资源,或者有时候会和套接字一样,但close()会立即释放文件句柄表中的文件句柄。 您的进程完全控制其文件句柄表,并且不需要等待任何东西来释放其自己的文件描述符表中的插槽。
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
像往常一样,如果可以的话,事先testing一下。