Nodejs socket.io socket memory leak

I wrote the code below using nodejs AND socket.io for a simple socket application (just plug and unplug), there will not be much user memory to use 50, but for up to 300 users and after one hour the memory usage just grows (about 300 MB for server.js proccess and grow in time), it looks like nodejs are not freeing memory.

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); }); }); 

Am I doing something wrong ?!

Edit

14 hours after starting the file with forever enter image description here

300 open sockets and about 500 MB of memory usage associated with my nodejs process.

Edit

After 16 hours, 300 connected sockets enter image description here After the termination of the process. enter image description here

Edit

loot in my new code, please.

 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]; }); }); 

I am trying to use this with 1000 connected users (another server simulates user requests and open sockets)

memory usage before launch: 100 MB, after 5 minutes and 1000 stable open connections: 400 MB

+6
source share
2 answers

V8 is lazy when it comes to freeing up unused memory, so it may look like a memory leak, when in fact just V8 doesn't start the garbage collector. To verify that this is the case, start the process using the --expose-gc flag, for example.

 node --expose-gc yourscript.js 

And forced garbage collection manually with an interval (I used an interval of 30 seconds).

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

The code looks great. Your alleged memory leak is almost certainly not part of your code.

This does not apply to your main question, but if you just want to indicate the number of connected sockets, you should use an integer counter instead of calling Object.keys() on the sockets object, for example:

 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
source

Source: https://habr.com/ru/post/988873/


All Articles