Node.js NodeJS Socket.io:许多处于关闭等待和FIN等待2状态的连接没有释放

Node.js NodeJS Socket.io:许多处于关闭等待和FIN等待2状态的连接没有释放,node.js,socket.io,Node.js,Socket.io,我使用ubuntu(12.04)+nodejs(v0.10.22)+socket.io(v0.9.14)来传输消息 有大约300个同时连接。几个小时后(大约1或2小时以上,它不会立即显示),一些连接将持续处于状态CLOSE\u WAIT或FIN\u WAIT 2 这些非死连接随着时间线性增长。当连接数达到限制(默认1024)时,用户将很难连接套接字服务器,除非某些连接正常释放 以下是套接字服务连接状态,运行约3小时 netstat -anl | grep <PORT_OF_NODE_PRO

我使用ubuntu(12.04)+nodejs(v0.10.22)+socket.io(v0.9.14)来传输消息

有大约300个同时连接。几个小时后(大约1或2小时以上,它不会立即显示),一些连接将持续处于状态CLOSE\u WAITFIN\u WAIT 2

这些非死连接随着时间线性增长。当连接数达到限制(默认1024)时,用户将很难连接套接字服务器,除非某些连接正常释放

以下是套接字服务连接状态,运行约3小时

netstat -anl | grep <PORT_OF_NODE_PROCESS> | awk '/^tcp/ {t[$NF]++}END{for(state in t){print state, t[state]} }'

FIN_WAIT2 23
LISTEN 1
CLOSE_WAIT 27
TIME_WAIT 12
ESTABLISHED 333
FIN_WAIT1 12
尽量让连接难以达到极限

3.减少保持活动超时 让操作系统在短时间内自动关闭连接,但我还没有尝试

问题: 我找到了一些可能的解决办法来解决这个问题。但上述解决方案并没有真正解决与状态CLOSE_WAITFIN_WAIT2的持久连接问题。我发现这是由于服务器(CLOSE\u WAIT)或客户端(FIN\u WAIT2)未正确关闭连接造成的。我认为socket.io会在超时后强制关闭这些连接。但它似乎不能正常工作

我尝试在测试环境中重新出现状态关闭等待FIN_WAIT2问题。但它从来没有出现过这种连接情况

  • 连接套接字服务器并断开网络连接后
  • 长时间连接套接字服务器
  • 我发现以前有人问过相关问题(),但仍然找不到解决方案。有人知道如何解决这个问题吗


    谢谢

    我尝试同时使用多个连接来连接套接字服务器,我发现一些客户端套接字将使用相同的套接字ID(从xhr获取,看起来像nmXTMmCGNQp4EncrfHqj)来建立连接。当所有连接建立后,我关闭浏览器,这将导致许多close_WAIT连接未释放。少数连接将关闭(基于已生成的唯一套接字ID的数量)。因为服务器将从套接字ID建立TCP/IP连接。但是,如果连接池中已经存在套接字ID连接,则此连接不会存储在连接池中。所以当客户端发送FIN数据包试图关闭连接但不存在于服务器连接池中时。服务器将始终不发送ACK数据包来准备关闭连接。因此,这些连接将保持在关闭\u等待状态,且不会释放

    var host = 'http://socket.server/';
    var sockets = [];
    for(var i=0;i<200;i++){
        var socket = io.connect(host,{"force new connection":true});
        sockets.push(socket);
    
      socket.on("message",function(message){
        console.log(message);
      });
      socket.on("disconnect",function(){
        console.log("disconnect");
      });
    }
    
    以下是套接字服务连接状态,运行约6小时

    netstat -anl | grep <PORT_OF_NODE_PROCESS> | awk '/^tcp/ {t[$NF]++}END{for(state in t){print state, t[state]} }'
    
    FIN_WAIT2 37
    LISTEN 1
    TIME_WAIT 13
    ESTABLISHED 295
    FIN_WAIT1 20
    
    netstat-anl | grep | awk'/^tcp/{t[$NF]+}END{for(t中的状态){print state,t[state]}
    财政司司长2 37
    听1
    时间等13
    成立295
    财政司司长1 20
    

  • 上述解决方案可以解决CLOSE_WAIT,但不能解决FIN_WAIT 2。此处的最新讨论()提供了可能的替代解决方案。本讨论还指出,问题出在node.js本身,而不是socket.io。

    如果您使用本机
    集群
    模块并生成工作进程,请注意,如果您的工作进程被连接到它的客户端强制终止(即由于系统内存不足),它将留下
    CLOSE\u WAIT
    sockets,这将无限期地阻塞系统资源

    解决方法是在操作系统终止一个工作进程后立即终止main Node.js进程。一旦master Node.js进程被终止,系统将销毁属于已死亡工作进程的
    CLOSE\u WAIT
    中的所有套接字


    此外,似乎从Node.js上的工作进程调用
    socket.destroy()
    也会导致套接字卡在
    CLOSE\u WAIT
    状态。更新到Node.js
    v6.9.5
    LTS为我解决了这个问题。

    那么您是否确实提交了这个补丁作为拉取请求?其他人(包括我自己)也有这个问题。
    if (!this.connected[data.id]) {
      if (transport.open) {
        if (this.closed[data.id] && this.closed[data.id].length) {
          transport.payload(this.closed[data.id]);
          this.closed[data.id] = [];
          }
    
          this.onOpen(data.id);
          this.store.publish('open', data.id);
          this.transports[data.id] = transport;
        }
    
        this.onConnect(data.id);
        this.store.publish('connect', data.id);
        //....etc
      }
    }
    
    netstat -anl | grep <PORT_OF_NODE_PROCESS> | awk '/^tcp/ {t[$NF]++}END{for(state in t){print state, t[state]} }'
    
    FIN_WAIT2 37
    LISTEN 1
    TIME_WAIT 13
    ESTABLISHED 295
    FIN_WAIT1 20