大量 CLOSE_WAIT 的原因及解决方法

通过命令 netstat -an|grep CLOSE_WAIT|wc -l 查看当前服务器上处于 CLOSE_WAIT 状态的连接数,根据服务器上的业务量来判断 CLOSE_WAIT 数量是否超出了正常的范围

问题原因

TCP连接断开时需要进行四次挥手,TCP连接的两端都可以发起关闭连接的请求,若对端发起了关闭连接,但本地没有进行后续的关闭连接操作,那么该链接就会处于CLOSE_WAIT状态。虽然该链接已经处于半开状态,但是已经无法和对端通信,需要及时的释放掉该链接。

解决方法

建议从业务层面及时判断某个连接是否已经被对端关闭,即在程序逻辑中对连接及时进行关闭检查。

JavaIO 可以通过 read 方法来判断,当 read 方法返回 -1 时则表示流已经到达末尾,可以使用 close 方法关闭该链接。C 语言中检查 read 的返回值,若是 0 则可以关闭该连接,若小于 0 则查看一下 errno,若不是 AGAIN 则同样可以关闭连接。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器