使用socket.io

时间:2016-06-24 08:13:50

标签: javascript node.js windows sockets socket.io

我要做的是:

我编写了一个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);
        })
};

2 个答案:

答案 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_rangefile-nrulimit -n

您可能还想查看日志(/var/log/messages/var/log/syslogdmesg)。

我终于获得了34469个连接,然后在我的客户机上找到了oom-killer kill节点

答案 1 :(得分:0)

正如我已经假设的那样,解决方案是Windows中的一个选项(MaxUserPort),您可以在注册表中进行更改。查看MSDN说明以了解详情:https://support.microsoft.com/en-us/kb/196271。您可以将其设置为最大值65534。