After several attempt to scale my chat socket io application i hit some kind of wall when trying to establish more than 2k websocket connections on the same machine . This number seems a bit low considering that my local machine is a 8 core 6 giga of rams and during test only half the ram and the cpu is used . Being a noob to websocket and linux i might have not configured my server perfectly so far i raised max number of open files to 560000 and max number of open socket (maxconn) to 60000 with no effect .
So my question are : - Is there a limit in the number of connections that can be created locally using socket io ? - How many concurent connection have you been able to establsh on a single machine using this kind of setup ? - Are there any other linux settings to tweak in order to improve performance ?
Here 'is an example of the code that i used for the demo
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');
}
});
});
}
Test results doesn't give me any error so i don't even know how to debug this i just noticed that after the 2000 socket connection the server no longer try to establish new connection but just continue to emit handshake to keep the existing connection alive
here's an example of the test output
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::