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

Popular posts from this blog

How to mention the localhost in android -

php - Calling a template part from a post -

c# - String.format() DateTime With Arabic culture -