node.js - Socket IO 无限循环超过 1000 个连接

标签 node.js socket.io ulimit

我需要对多个套接字连接进行基准测试。我有一个带有以下代码的 NodeJS 服务器:

var io = require('./lib/node_modules/socket.io').listen(12345)

io.sockets.on("connect", function(socket) {
    console.log("Socket " + socket.id + " connected.")

    socket.on("disconnect", function() {
        console.log("Socket " + socket.id +" disconnected.")
    })
})

和一个nodejs客户端:

var port            = 12345
,   nbSocket        = 1000
,   io              = require("./lib/node_modules/socket.io-client")

for (var i = 1;i <= nbSocket;i++)
{
    var socket = io.connect("http://<<my_ip>>:" + port, {forceNew: true})
}

执行客户端代码时,服务器正确连接套接字并正常结束。

但是如果我们将 nbSocket 更改为 2000,服务器将永远不会结束连接和断开套接字。

我们已经尝试通过以下方式更改限制:

ulimit -n5000

但是没有成功。是否还有其他限制或我们错过的东西?

最佳答案

我在运行 Node v0.12.4 和 socket.io v1.3.5 的 OSX 上进行了测试,它开始给我带来关于 nbSocket=5000 的问题。

尝试将此代码段附加到服务器脚本的末尾:

process.on('uncaughtException', function(err) {
    console.info(util.inspect(err, {colors: true}));
});

此外,我对您的代码进行了一些更改,并添加了一个计时器,该计时器每秒两次打印打开的套接字数量:

var
    util = require('util'),
    io = require('socket.io').listen(12345);

var
    clientCount = 0;

function onClientDisconnect() {
    clientCount--;
}

io.on('connect', function(socket) {
    clientCount++;
    socket.on('disconnect', onClientDisconnect);
});

console.info('Listening...');

setInterval(function () {
    console.info('Number of open sockets: %d', clientCount);
}, 500);

process.on('uncaughtException', function(err) {
    console.info(util.inspect(err, {colors: true}));
});

当打开的套接字数量开始接近 5000 时,我开始多次看到这 2 条消息:

{ [Error: accept ENFILE] code: 'ENFILE', errno: 'ENFILE', syscall: 'accept' }
{ [Error: accept EMFILE] code: 'EMFILE', errno: 'EMFILE', syscall: 'accept' }

根据libc manual :

  • ENFILE:整个系统中有太多不同的文件打开
  • EMFILE:当前进程打开的文件过多

所以事实上我的问题是文件描述符的限制,所以通过将上面的代码片段附加到您的服务器脚本来检查这是否也是您的问题。如果出现异常,您应该调查如何 properly increase the limit of open files in your system .

关于node.js - Socket IO 无限循环超过 1000 个连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31140342/

相关文章:

mysql - 如何在nodejs中启动http服务器之前查询mysql

node.js - Mongoose :父级的预保存钩子(Hook)是否总是在嵌入文档的预保存钩子(Hook)之前执行?

node.js - collection.findOne({query}) 不应该返回文档本身吗?

sockets - 打开比 `ulimit -n` 更多的服务器套接字

linux - 软虚拟内存限制 (ulimit -v)

javascript - NodeJS 可以在网络上使用而不是在命令行上使用吗

android - 如何避免 viber 弹出窗口以编程方式获得我的 android 应用程序的焦点?

node.js - 如何托管 HTML Node.js 应用程序

c - 了解非阻塞套接字上的 EWOULDBLOCK

linux - 限制Linux中程序的内存使用