我要做的是:
我编写了一个node.js客户端/服务器应用程序,它使用持久的websocket连接(没有longpolling)。我想强调测试我的服务器,以便调整它的性能并知道限制,以便我可以阻止由于过载导致的新传入连接。不幸的是,我每次都遇到一个特定数量的套接字连接,因此我认为它可能与操作系统或节点设置有关。
问题:
我有一个客户端可以创建10k套接字连接,服务器可以完美地处理这个问题。当我用另外10k连接启动第二个客户端时,一旦服务器保持14k并发连接,我就开始在我的客户端应用程序上收到以下错误:
engine.io-client:套接字套接字关闭,原因是:“传输错误” + 0ms engine.io-client:套接字套接字错误{“type”:“TransportError”,“description”:{“code”:“ENOBUFS”,“errno”:“ENOBUFS”,“syscall”:“connect”,“地址 “:” 127.0.0.1" , “端口”:5433, “类型”: “错误”, “目标”:{ “结构域”:空, “_事件”:{}, “_ eventsCount”:4, “_插座” :空, “_ ULTRON”:空, “_ closeReceived”:假的, “与BytesReceived”:0, “readyState的” 0 “支持”:{ “二进制”:真正}, “扩展”:{}, “_ isServer”:假, “URL”: “WS://127.0.0.1:5433 / socket.io / EIO = 3及运输= WebSocket的?”, “protocolVersion”:13, “binaryType”: “缓冲”}}} + 0毫秒
我的client1.js和client2.js如下所示:
function createClient(){
var socket = require('socket.io-client')('http://127.0.0.1:5433', {transports:['websocket']});
socket.connect();
// Send a bit data every 2.5s to simulate a bit traffic
setInterval(function () {
socket.emit("sessionCheck", "ok");
}, 2500);
}
var clients=0;
var id =setInterval(function() {
createClient();
clients++;
if(clients >= 10000)
clearInterval(id);
}, 1);
我的server.js看起来像这样:
var http = require('http');
var httpServer = http.createServer(handler);
var io = require('socket.io')(httpServer, {pingTimeout: 60 * 1000, pingInterval: 5 * 1000});
io.on('connection', function (socket) {
socket.on('sessionCheck', function(data){onSessionCheck(socket,data)});
});
setInterval(function(){
console.log(io.engine.clientsCount + " websockets are connected");
}, 5000);
httpServer.listen(5433, "0.0.0.0", 5000); // port, hostname, backlog
console.log("server running now...");
function onSessionCheck(){
//console.log("Incoming check");
}
function handler (req, res) {
fs.readFile(__dirname + '/index.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
})
};
答案 0 :(得分:1)
你在Slack说过你已经知道–max-old-space-size
并且你尝试了它并没有帮助。现在我可以确认使用此选项(我尝试使用值2048-65000)可以防止我从一台服务器到一台服务器的并发连接超过18-20k。删除选项为我提供了~29500个并发连接。我使用20美元的DigitalOcean vps(2 GB,2核心)和29500获取我服务器的所有可用内存 - 这就是为什么我现在无法获得更多连接。
<强>更新强>
Linux呢? 请尝试检查服务器上的以下值:
net.nf_conntrack_max
(我使用65536
)net.netfilter.nf_conntrack_max
(我使用65536
)cat /proc/sys/fs/nr_open
为我提供1048576
cat /proc/sys/fs/file-nr
为我提供5056 0 2097152
cat /proc/sys/fs/file-max
为我提供2097152
net.ipv4.ip_local_port_range
(我使用2000 65535
)net.core.somaxconn
(我使用65000
)ulimit -n
给了我1048576
这可能会让您了解如何设置参数https://easyengine.io/tutorials/linux/sysctl-conf/
也许您应该检查一下客户端服务器的某些值(例如ip_local_port_range
,file-nr
,ulimit -n
)
您可能还想查看日志(/var/log/messages
,/var/log/syslog
,dmesg
)。
我终于获得了34469个连接,然后在我的客户机上找到了oom-killer kill节点
答案 1 :(得分:0)
正如我已经假设的那样,解决方案是Windows中的一个选项(MaxUserPort),您可以在注册表中进行更改。查看MSDN说明以了解详情:https://support.microsoft.com/en-us/kb/196271。您可以将其设置为最大值65534。