Linux服务器sockets状态统计:
# netstat -n | awk '/^tcp/ {++State[$NF]} END {for(i in State) print i, State[i]}'
当Client因为某种原因早于Server发出了FIN信号,就会导致Server被动关闭。
若Server不主动关闭socket发FIN给Client,此时服务端Socket会处于CLOSE_WAIT状态。一个CLOSE_WAIT会维持至少2小时(系统默认超时时间为7200秒即2消失)。
如果出现某种原因导致服务器出现大量的CLOSE_WAIT,会大量消耗资源,可能等不到默认超时,系统就崩溃。
要解决CLOSE_WAIT太多的问题:
1,要排查代码是否存在BUG,遗漏关闭socket。
2,可以调整系统默认内核参数。