各位有使用socket.io出现内存泄露问题吗,我的用法是一个cluster启动一个子进程socket.io来接收前端连接,提供实时消息服务
框架是这样的 /**
if (cluster.isMaster) { for (var i = 0; i < 1; ++i) { cluster.fork();
cluster.on('exit', function(worker, code, signal) {
log.error('socket worker ' + worker.process.pid + ' died, code is ' + code + ", signal is " + signal, log.getFileNameAndLineNum(__filename));
cluster.fork();
email.sendMail('socket worker ' + worker.process.pid + ' died');
});
cluster.on('listening', function(worker, address) {
log.info("A socket worker with pid#" + worker.process.pid + " is now listening to:" + address.port,
log.getFileNameAndLineNum(__filename));
});
}
} else {
process.on('uncaughtException', function(err) {
log.error('SOCKET SERVER Caught exception: ' + err.stack, log.getFileNameAndLineNum(__filename));
email.sendMail('SOCKET SERVER Caught exception: ' + err.stack);
});
startSocketServer();
}
function startSocketServer() {
var io = require('socket.io').listen(socketPort);
log.logPrint(config.logLevel.DEBUG, "start listen socket");
io.sockets.on('connection', function(socket) {
log.logPrint(config.logLevel.DEBUG, process.pid + " get the socket:" + socket.id);
//do some event
socket.on('disconnect', function(msg) {
log.debug(msg, log.getFileNameAndLineNum(__filename));
//delete io.sockets.sockets[socket.id];
//delete socket;
//socket.close();
});
});
}
我的测试客户端每次建立一个连接,就会消耗内存,但是每次disconnect之后,内存不会释放掉,就这样一直增长下去,直到这个进程内存耗用过大被系统杀掉
是否在socket.io执行disconnect事件的时候需要做一些处理???
同问,今天测试时候也遇见了这问题
@mengao89 这问题困扰我一个月了
没人遇到吗???
@mengao89 解决了吗
Mark 起来,明天试试
两年后的今天解决了吗。。。。我也遇到同样的问题
如果是单独用engine.io呢,这个问题还出现吗?
个人理解:node的gc机制是惰性触发为主,所以当你dis掉之后并不会像c那样立即释放出来,相对应的内存并不会明显的减小;举个栗子:假如你在10s内建立1K个连接耗费10M内存,当你断开500个连接后,仍旧是10M内存消耗,但是这时候如果你重新建立到1000个连接他可能就是10M左右的消耗,个人的处理方式:开多个服务实例的方式分担压力,压出自己单个实例的上限后,快到临界值时添加服务节点的方法;