gpt4 book ai didi

node.js - NodeJS 套接字 : Many connections in state CLOSE_WAIT and FIN_WAIT2 without release

转载 作者:搜寻专家 更新时间:2023-10-31 22:34:05 24 4
gpt4 key购买 nike

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

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

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

下面是socket服务连接状态,运行了大约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

可能的解决方案

1。定时触摸js文件

使用 Nodemon Package运行js文件,当修改文件的最后修改时间时,nodemon会重启服务,并释放之前所有未死连接(CLOSEWAITFINWAIT2)

2。增加连接限制

sudo vim /etc/security/limits.conf

* soft nofile 1024
* hard nofile 2048
root soft nofile 4096
root hard nofile 8192
user1 soft nofile 2048
user1 hard nofile 2048

尽量让连接难以达到极限。

3。减少保持事件超时

让操作系统在短时间内自动关闭连接,我还没试过。

问题

我找到了一些可能的解决方案来解决这个问题。但是上述解决方案并没有真正解决持久连接状态为CLOSE_WAITFIN_WAIT2的问题。我发现这是服务器 (CLOSE_WAIT) 或客户端 (FIN_WAIT2) 未正确关闭连接的结果。我认为 socket.io 会在超时后强制关闭这些不正确的连接。但它似乎无法正常工作。

我尝试在我的测试环境中重现状态 CLOSE_WAITFIN_WAIT2 问题。但它从不显示这些连接情况。

  1. 连接套接字服务器并断开网络后
  2. 长时间连接socket服务器

我发现之前有人问过相关问题(Many stale connections in state CLOSE_WAIT and FIN_WAIT2),但仍然找不到解决方案。有谁知道如何解决这个问题??

谢谢

最佳答案

我尝试同时使用多个连接来连接套接字服务器,我发现一些客户端套接字会使用相同的SOCKET ID(从xhr获取,它看起来像 nmXTMmCGNQp4EncrfHqj)建立连接。我在所有连接建立后关闭浏览器,它会导致许多 CLOSE_WAIT 连接没有释放。一些连接将关闭(基于已生成的Unique SOCKET ID 的数量)。因为服务器将从 SOCKET ID 建立 TCP/IP 连接。但是,如果 SOCKET ID 连接已经存在于连接池中,则该连接将不会存储在连接池中。因此,当客户端发送 FIN 数据包尝试关闭连接但不存在于服务器连接池中时。服务器永远不会发送ACK包来准备关闭连接。所以这些连接会一直处于CLOSE_WAIT状态,不会释放。

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");
});
}

修复 lib\manager.js 第 670 行。

当连接池中已存在SOCKET ID连接时,不从SOCKET ID建立TCP/IP连接。

另请参阅:https://github.com/kejyun/socket.io/commit/8d6c02a477d365f019530b4ec992420dfb90eb09

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
}
}

下面是socket服务连接状态,运行了大约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
  1. Benchmarkt socket.io

关于node.js - NodeJS 套接字 : Many connections in state CLOSE_WAIT and FIN_WAIT2 without release,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20777827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com