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