该怎么说呢,有2台阿里云服务的server都出现了一个诡异情况:
server程序在运行一段时间后,出现端口在监听,但是新连接进不来,本地telnet都不通。
之前有一台在运行20天以后有这个问题,由于时间比较长我就没管它。
最近另一台服务器一直运行的好好的server程序,居然出现不到24小时,几个小时就出现这个情况,比较容易复现,所以就想彻底搞明白。
在研究了2天之后,我发现情况是这样的:
server程序在运行一段时间后,突然,很突然,差不多一瞬间的事,端口不通了,netstat查看端口依然在监听,然后出现了大概有50个左右CLOSE_WAIT状态的连接。这些CLOSE_WAIT是一起瞬间冒出来的,不是慢慢积累的!
我的服务器是被动关闭连接,给我的感觉就是突然间这个端口被挂起来,连关闭都没来得及,就被挂起冻结的感觉,之后就不通。然后我不用重启server程序,直接调用QTcpServer的close在调用listen就又继续工作了。
一开始我怀疑是我server程序关闭socket有bug,但是检查之后确实都关了。
而且我测试如果服务器故意不关闭socket之后有两点不同:
1,如果服务器不关闭socket,50个左右的CLOSE_WAIT状态根本没影响,可以继续通信。
2,如果服务器不关闭socket,这个CLOSE_WAIT状态,必须要重启这个server程序进程才会消失,但是我现在的情况如上所说不用重启进程,只需要调用QTcpServer的close在调用listen,所有的CLOSE_WAIT状态就没了。
所以我感觉可能99%不是程序的问题。。。
不知道有没有人碰到过这种情况,或者给点提示,真的纠结的一批~~~~