socket io集群性能

经过几次尝试扩展我的聊天套接字io应用程序时,我试图build立在同一台机器上超过2k websocket连接时,打到某种types的墙。 这个数字似乎有点低,考虑到我的本地机器是一个8核6千兆的RAM,在testing过程中只有一半的内存和CPU使用。 作为一个noob到websocket和linux我可能还没有完美configuration我的服务器到目前为止,我提出了最大数量的打开的文件为560000和最大数量的开放套接字(maxconn)为60000没有效果。

所以我的问题是: – 在使用socket io在本地创build的连接数是否有限制? – 您能够使用这种设置在单台机器上build立多less个连接? – 有没有其他的Linux设置来调整,以提高性能?

这里是我用于演示的代码示例

cluster = require('cluster') ,http = require('http'); //tell express how to parse post data /* app.use(express.json()); app.use(express.urlencoded());*/ //server.listen(9020); if (cluster.isMaster) { process.on('uncaughtException', function (err) { console.log(err) }); var numberOfCPUs = require('os').cpus().length; for (var i = 0; i < numberOfCPUs; i++) { cluster.fork(); } //catch err errors and restart worker cluster.on('exit', function(worker, code, signal) { console.error('worker ' + worker.process.pid + ' died'); cluster.fork(); }); } if (cluster.isWorker) { var authenticatedSockets = new Array(); var server = http.createServer().listen(9020) ,io = require('socket.io').listen(server); RedisStore = require('socket.io/lib/stores/redis') ,redis = require('socket.io/node_modules/redis'); //io.set('log level', 1); io.set('store', new RedisStore({ redisPub : redis.createClient(), redisSub : redis.createClient(), redisClient : redis.createClient() })); toolbox = require('./utilities/toolbox.js').toolbox ,exception = require('./utilities/exception').exception ,async = require('./utilities/async.js').async; user = {}; message = {}; //tell express how to parse post data //app.use(express.json()); //app.use(express.urlencoded()); //server.listen(9020); process.on('uncaughtException', function (err) { console.log(err); toolbox.handleException(err); }); io.sockets.on('connection', function (socket) { socket.on('auth', function(data){ if (!toolbox.checkvalue(data, ['id', 'token'])) { socket.emit('error', {'type':'auth', 'message':'invalid credentials'}); socket.disconnect(); return false; } else { authenticatedSockets.push(socket); console.log(data.id); console.log(authenticatedSockets.length + 'on worker : ' + cluster.worker.id); console.log('-----------------'); socket.emit('authenticated'); } }); }); } 

testing结果不给我任何错误,所以我甚至不知道如何debugging,我只是注意到,2000套接字连接后,服务器不再尝试build立新的连接,但只是继续发出握手,以保持现有的连接活着

这里是一个testing输出的例子

 debug: websocket writing 5:::{"name":"authenticated"} debug: client authorized info: handshake authorized 4uuaVHiawHt4-JUlGALu debug: setting request GET /socket.io/1/websocket/4uuaVHiawHt4-JUlGALu?channel=chat debug: set heartbeat interval for client 4uuaVHiawHt4-JUlGALu debug: client authorized for debug: websocket writing 1:: 4112 258on worker : 5 ----------------- debug: websocket writing 5:::{"name":"authenticated"} debug: client authorized info: handshake authorized 3jv46TzFB4cjnqsIF_3n debug: setting request GET /socket.io/1/websocket/3jv46TzFB4cjnqsIF_3n?channel=chat debug: set heartbeat interval for client 3jv46TzFB4cjnqsIF_3n debug: client authorized for debug: websocket writing 1:: 4113 259on worker : 5 //1999 connecitons after the server just keep existing connectons by emitting handshake ----------------- debug: websocket writing 5:::{"name":"authenticated"} debug: emitting heartbeat for client dkEc9fB45Gw2cOPoF_4X debug: websocket writing 2:: debug: set heartbeat timeout for client dkEc9fB45Gw2cOPoF_4X debug: got heartbeat packet debug: cleared heartbeat timeout for client dkEc9fB45Gw2cOPoF_4X debug: set heartbeat interval for client dkEc9fB45Gw2cOPoF_4X debug: emitting heartbeat for client SSCX4LXmIVHNiYk1F_3_ debug: websocket writing 2:: debug: set heartbeat timeout for client SSCX4LXmIVHNiYk1F_3_ debug: got heartbeat packet debug: cleared heartbeat timeout for client SSCX4LXmIVHNiYk1F_3_ debug: set heartbeat interval for client SSCX4LXmIVHNiYk1F_3_ debug: emitting heartbeat for client R5u8eM3nJGFaKCLfF_4Y debug: websocket writing 2:: debug: set heartbeat timeout for client R5u8eM3nJGFaKCLfF_4Y debug: got heartbeat packet debug: cleared heartbeat timeout for client R5u8eM3nJGFaKCLfF_4Y debug: set heartbeat interval for client R5u8eM3nJGFaKCLfF_4Y debug: emitting heartbeat for client PMTMfInWBQ2B2RenF_4Z debug: websocket writing 2:: debug: set heartbeat timeout for client PMTMfInWBQ2B2RenF_4Z debug: got heartbeat packet debug: cleared heartbeat timeout for client PMTMfInWBQ2B2RenF_4Z debug: set heartbeat interval for client PMTMfInWBQ2B2RenF_4Z debug: emitting heartbeat for client c6MWHHTJhzmHFwj2F_4a debug: websocket writing 2::