大量 CLOSE_WAIT 的原因及解决方法
通过命令 netstat -an|grep CLOSE_WAIT|wc -l
查看当前服务器上处于 CLOSE_WAIT
状态的连接数,根据服务器上的业务量来判断 CLOSE_WAIT
数量是否超出了正常的范围
问题原因
TCP连接断开时需要进行四次挥手,TCP连接的两端都可以发起关闭连接的请求,若对端发起了关闭连接,但本地没有进行后续的关闭连接操作,那么该链接就会处于CLOSE_WAIT
状态。虽然该链接已经处于半开状态,但是已经无法和对端通信,需要及时的释放掉该链接。
解决方法
建议从业务层面及时判断某个连接是否已经被对端关闭,即在程序逻辑中对连接及时进行关闭检查。
Java
中 IO
可以通过 read
方法来判断,当 read
方法返回 -1
时则表示流已经到达末尾,可以使用 close
方法关闭该链接。C
语言中检查 read
的返回值,若是 0
则可以关闭该连接,若小于 0
则查看一下 errno
,若不是 AGAIN
则同样可以关闭连接。