首先可以通过命令查看当前TCP连接的状态:
# 查看当前TCP状态
netstat -an | awk '/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}'
CLOSE_WAIT 2209
SYN_SENT 1
FIN_WAIT2 283
ESTABLISHED 407
LISTEN 11
发现有很多CLOSE_WAIT状态的TCP占用着资源没有释放。
关闭socket分为主动关闭(Active closure)和被动关闭(Passive closure)两种情况。前者是指有本地主机主动发起的关闭;而后者则是指本地主机检测到远程主机发起关闭之后,作出回应,从而关闭整个连接。
引起大量CLOSE_WAIT连接的情况是因为客户端被动关闭socket,而服务端没有收到关闭响应,导致服务端socket一直处于打开状态,从而导致大量CLOSE_WAIT。
解决方案:
监控客户端socket,当客户端关闭的时候,服务端也对应的关闭。