100% CPU usage on 1000 connection - Node.js, socket.io, clusters and Redis ... -
my chat works on 24 threads (2x 6 cores x5650 @ 2.67ghz) ... if there 1000 connections cpu usage (on every thread) grows 80-100% .... think wrong code ... node shouldn't generate such load 1000 connections. can please give me idea look
my code:
express = require('express') http = require('http'); cluster = require("cluster"); numcpus = require("os").cpus().length, port = 55678; usercount = 0; interv = false; redisstore = require("socket.io/lib/stores/redis"), redis = require("socket.io/node_modules/redis"), pub = redis.createclient(), sub = redis.createclient(), client = redis.createclient(), counter = redis.createclient(); counter.set('count',0); client.set('searching',0); client.del('freeusers'); if (cluster.ismaster) { (var = 0; < numcpus; i++) { cluster.fork(); } } else { app = express(); server = http.createserver(app).listen(port); io = require('socket.io').listen(server); io.configure(function () { // io.set("transports", ["websocket"]) io.set("store", new redisstore({ redispub: pub, redissub: sub, redisclient: client }) ); io.set('log level', 0); io.enable('browser client minification'); io.enable('browser client etag'); io.enable('browser client gzip'); }); app.get('/', function (req, res) { res.sendfile(__dirname + '/index.php'); }); io.sockets.on('connection', function (socket){ var address = socket.handshake.address; socket.set('options', json.stringify({'sex':'male','seek':'both'})); socket.set('partner', 5); socket.set('ip', address.address); socket.emit('setsocket',socket.id); counter.incr('count', function(err, newid){ usercount = newid; socket.emit('people', usercount); socket.broadcast.emit('people', usercount); // console.log(date(date.now()) + ' connected user ('+socket.id+' | '+address.address+':'+address.port+') '+usercount); }); socket.ip = address.address; socket.on('syscmd', function(cmd){ switch (cmd.cmd){ case 'new': socket.set('options', json.stringify({'sex':cmd.sex,'seek':cmd.seek})); socket.emit('updatechat', 'poszukujemy dla ciebie obcego, poczekaj ...'); socket.emit('setflag',1); addnewuser(socket.id); lookforpartner(socket.id); break; case 'reconnect': socket.set('options', json.stringify({'sex':cmd.sex,'seek':cmd.seek})); socket.get('partner', function(err, partner){ stopchat(socket.id,partner); socket.emit('updatechat', 'poszukujemy dla ciebie obcego, poczekaj ...'); socket.emit('setflag',1); addnewuser(socket.id); lookforpartner(socket.id); }); break; default: } }); socket.on('sexchange', function (sex) { socket.get('options',function(err,options){ socket.set('options', json.stringify({'sex':sex,'seek':options.seek})); }); }); socket.on('seekchange', function (seek) { socket.get('options',function(err,options){ socket.set('options', json.stringify({'sex':options.sex,'seek':seek})); }); }); socket.on('updatechat', function(data){ socket.get('partner', function(err, partner) { io.sockets.socket(partner).emit('updatechat',data); }); socket.emit('updatechat',data); }); socket.on('msgchat', function (data) { socket.get('partner', function(err, partner) { io.sockets.socket(partner).emit('msgchat',socket.id,data); // console.log('message between: '+socket.id+ ' , '+partner+': '+data); }); socket.emit('msgchat',socket.id , data); }); socket.on('typing', function (data) { socket.get('partner', function(err, partner){ io.sockets.socket(partner).emit('typing'); }); }); socket.on('stoptyping', function (data) { socket.get('partner', function(err, partner){ io.sockets.socket(partner).emit('stoptyping'); }); }); socket.on('disconnect', function(){ var address = socket.handshake.address; socket.get('partner', function(err, partner){ stopchat(socket.id,partner) counter.decr('count', function(err, newid){ usercount = newid; socket.broadcast.emit('people', usercount); // console.log(date(date.now()) + ' disconnected user ('+socket.id+' | '+address.address+':'+address.port+') '+usercount); }); }); }); function removeuser(id) { client.srem('freeusers',id); } function addnewuser(id) { removeuser(id); client.sadd('freeusers',id); } function lookforpartner(id) { // console.log('('+id+') searching ...') client.get('searching',function(error,result){ if(parseint(result) == 1) { return true; } else { client.smembers('freeusers',function(error,freeusers){ if(freeusers.length > 1) { client.set('searching',1); partner = freeusers[math.floor(math.random()*freeusers.length)]; while(partner == id) { partner = freeusers[math.floor(math.random()*freeusers.length)]; } socket.get('options',function(err,options){ options = json.parse(options); if(err || options == null || typeof options != 'object' || !options.hasownproperty('seek') || !options.hasownproperty('sex')) { client.set('searching',0); return false; } // console.log('partner: '+id+' (sex:'+options.sex+' , seek:'+options.seek+')'); io.sockets.socket(partner).get('options',function(err,poptions){ poptions = json.parse(poptions); if(err || options == null || typeof poptions != 'object' || !poptions.hasownproperty('seek') || !poptions.hasownproperty('sex')) { removeghost(partner); client.set('searching',0); return false; } // console.log('partner: '+partner+' (sex:'+poptions.sex+' , seek:'+poptions.seek+')'); if((options.seek == poptions.sex || options.seek == 'both') && (poptions.seek == options.sex || poptions.seek == 'both')) { // console.log('parred: '+partner+' (sex:'+poptions.sex+' , seek:'+poptions.seek+') , '+id+' (sex:'+options.sex+' , seek:'+options.seek+')'); removeuser(partner); removeuser(id); io.sockets.socket(id).set('partner', partner); io.sockets.socket(partner).set('partner', id); io.sockets.socket(id).emit('chatunblock',1); io.sockets.socket(partner).emit('chatunblock',1); io.sockets.socket(id).emit('updatechat', 'obcy podłączony, napisz cześć :-)'); io.sockets.socket(partner).emit('updatechat', 'obcy podłączony, napisz cześć :-)'); } client.set('searching',0); }); }); } }); } }); } function removeghost(id) { console.log('removing ghost: '+id); removeuser(id); io.sockets.socket(id).set('partner', 5); io.sockets.socket(id).emit('disconnected','end'); } function stopchat(id,partner) { removeuser(id); if(partner != 5) { socket.set('partner', 5); io.sockets.socket(partner).set('partner', 5); io.sockets.socket(partner).emit('updatechat', 'obcy wyszedł :-('); io.sockets.socket(partner).emit('disconnected','end'); } io.sockets.socket(id).emit('disconnected',2); } }); }
Comments
Post a Comment