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
300 socket aperti e circa 500MB di utilizzo della memoria che è legato alla mia nodejs proccess.
Modifica
dopo 16 ore, 300 socket connessi Dopo il processo interrotto.
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
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
@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
@ 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