我想知道常见的编程情况/错误可能导致我进入CLOSE_WAIT而不是实际关闭套接字的服务器进程。
我想要做的是触发这种情况,以便我可以解决它。在正常的开发环境中,我无法触发它,但是在实时服务器上使用的相同代码偶尔会得到它们,以便在很多天后我们有数百个。
Google搜索close_wait,它实际上似乎是一个非常常见的问题,即使是在成熟的,据称写得很好的服务,如nginx。
答案 0 :(得分:2)
CLOSE_WAIT
基本上是当远程端关闭套接字但本地应用程序尚未在其上调用close()
时。这通常发生在不期望从套接字读取数据并且因此没有看到它的可读性时。
为方便起见,许多应用程序将始终监视套接字以便于检测关闭。
尝试的方案是:
另见:
(来自man epoll_ctl
)
EPOLLRDHUP(自Linux 2.6.17起) 流套接字对等关闭连接,或关闭写入一半的连接。 (此标志对写入特别有用 简单的代码 在使用边缘触发监视时检测对等关闭。)