2015-06-10 6 views
6

ho scritto codice sotto usando nodejs E socket.io per una semplice applicazione socket (solo connessione e disconnessione), per circa 50 l'utilizzo della memoria utente non cambia molto, ma per un massimo di 300 utente e dopo un'ora, l'utilizzo della memoria cresce (vicino a 300 MB per server.js proccess e cresce con il passare del tempo), sembra che quel nodojs non rilasci memoria.nodejs, socket.io codice semplice perdita di memoria

var server = require('http').createServer(); 
var io = require('socket.io')(server); 
var port = 9090; 
var sockets = {}; 

server.listen(port, function() { 
    console.log('Server listening at port ', port); 
    //timer and logs are not problem , i tested it before. 
    setInterval(function(){ 
     console.log(Object.keys(sockets).length+' Online Devices At '+Date()); 
    }, 1000 * 60 * 1); 
}); 

io.on('connection',function(socket){ 
    sockets[socket.id]={id:socket.id}; 
    console.log('connected '+socket.id + ' count ' + Object.keys(sockets).length); 
    socket.on('disconnect', function (data) { 
     delete sockets[socket.id]; 
     console.log('disconnected '+socket.id+ ' count ' +Object.keys(sockets).length); 
    }); 
}); 

sto facendo qualcosa di sbagliato ?!

Modifica

14 ore dopo il file che inizia con forever enter image description here

300 socket aperti e circa 500MB di utilizzo della memoria che è legato alla mia nodejs proccess.

Modifica

dopo 16 ore, 300 socket connessi enter image description here Dopo il processo interrotto. enter image description here

Modifica

bottino al mio nuovo codice per favore.

var server = require('http').createServer(); 
var io = require('socket.io')(server); 
var port = 90; 
var counter = 0; 
var clients = {} 
server.listen(port, function() { 
     console.log('Server listening at port ', port); 
}); 
io.on("connection",function(socket){ 
     clients[socket.id] = socket; 
     counter++; 

     socket.on('disconnect', function (data) { 
       counter--; 
       delete clients[socket.id]; 
     }); 
}); 

sto provando questo con 1000 utente collegato (un altro server è richieste Simulare utenti e socket aperti) utilizzo

memoria prima dell'inizio: 100MB, dopo 5 minuti e 1000 stabili connessioni aperte: 400MB

risposta

0

Il codice sembra buono. La tua perdita di memoria proposta non è quasi certamente nella parte del codice che hai condiviso.

Questo non è pertinente alla tua domanda principale, ma se si desidera elencare il numero di socket connessi, è necessario utilizzare un contatore intero invece di chiamare Object.keys() sull'oggetto sockets, in questo modo:

var express = require('express'); 
var app  = express(); 
var server = require('http').createServer(app); 
var io  = require('socket.io')(server); 

var port = 9090; 
var connectedSockets = 0; 
var sockets = {}; 

server.listen(port, function() { 
    console.log('Server listening at port ', port); 
    //timer and logs are not problem , i tested it before. 
    setInterval(function(){ 
     console.log(connectedSockets + ' Online Devices At ' + Date()); 
    }, 1000 * 60 * 1); 
}); 

io.on('connection',function(socket){ 
    if (!sockets[socket.id]) connectedSockets++; 
    sockets[socket.id]={ id: socket.id }; 
    console.log('connected ' + socket.id + ' count ' + connectedSockets); 
    socket.on('disconnect', function (data) { 
     delete sockets[socket.id]; 
     connectedSockets--; 
     console.log('disconnected ' + socket.id + ' count ' + connectedSockets); 
    }); 
}); 
+0

Cosa mantiene manualmente un contatore quando l'oggetto socket ha già un elenco di socket connessi? Che cosa ha a che fare con la domanda? – jfriend00

+0

@galactocalypse, innanzitutto grazie per la tua risposta ma "La tua perdita di memoria proposta non è quasi certamente nella parte del codice che hai condiviso. Questo è tutto dei miei codici! . "sul conteggio delle prese" lo so! , ma ho provato a mostrare che il problema NON riguarda il disinserimento di variabili o elementi dell'array. – Mojtabye

+0

@ jfriend00: Avevo menzionato all'inizio di quel punto che "Questo non è pertinente alla tua domanda principale". Object.keys() gira in O (n) e mentre 300 non è molto, O (1) sarà certamente preferibile in una scala significativamente più alta. @ ALU0075: suggerisco di fare un heapdump e condividere ciò che trovi come suggerito qui: 'http://jpallen.net/2013/03/08/tracking-down-a-memory-leak-in-node-js -and-socket-io/'Condivide anche le versioni di node e socketio che stai utilizzando. – galactocalypse

9

V8 è pigro quando si tratta di liberare memoria inutilizzata, quindi potrebbe sembrare una perdita di memoria quando in realtà solo V8 non esegue il suo garbage collector. Per vedere se questo è il caso, esegui il processo con il flag --expose-gc impostato ad es.

node --expose-gc yourscript.js 

E forzare la garbage collection manuale su un intervallo (ho usato un intervallo di 30 secondi).

setInterval(function(){ 
    global.gc(); 
    console.log('GC done') 
}, 1000*30); 
+0

grazie, ma controlla il mio nuovo codice! , anche dopo aver scollegato 1000 socket e con la dimensione dell'array 0 e senza alcun log, 300 MB per 5 minuti sono troppo: | – Mojtabye

+0

Cosa succede se rimuovi completamente l'oggetto 'clients' dal codice? Hai ancora la perdita? –

+1

stesso RISULTATO! , mi sembra che ci sia qualcosa di sbagliato in socket.io – Mojtabye