套接字IO无限循环超过1000个连接
我需要基准多个套接字连接。 我有一个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上进行了testing,并且在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时,我开始几次看到这两条消息:
{ [Error: accept ENFILE] code: 'ENFILE', errno: 'ENFILE', syscall: 'accept' } { [Error: accept EMFILE] code: 'EMFILE', errno: 'EMFILE', syscall: 'accept' }
根据libc手册 :
-
ENFILE
:整个系统中有太多不同的档案开放 -
EMFILE
:当前进程打开的文件太多
所以实际上我的问题是文件描述符的限制,所以通过将上面的代码片段添加到服务器脚本来检查是否也是你的问题。 如果出现exception,您应该研究如何正确增加系统中打开文件的限制 。