CNode

socket.io 1.3.3版本内存泄露问题

问答
JJamCode发布于11 年前最后回复9 年前8 回复6035 浏览0 收藏

各位有使用socket.io出现内存泄露问题吗,我的用法是一个cluster启动一个子进程socket.io来接收前端连接,提供实时消息服务

框架是这样的 /** *

  • @authors wanghan
  • @date 2014-12-22 14:33:11
  • @version $Id$ */

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事件的时候需要做一些处理???

查看回复

回复 (8)

J
JamCode#1·11 年前
C
crystaldust#2·11 年前

Mark 起来,明天试试

H
haozxuan#3·9 年前

个人理解:node的gc机制是惰性触发为主,所以当你dis掉之后并不会像c那样立即释放出来,相对应的内存并不会明显的减小;举个栗子:假如你在10s内建立1K个连接耗费10M内存,当你断开500个连接后,仍旧是10M内存消耗,但是这时候如果你重新建立到1000个连接他可能就是10M左右的消耗,个人的处理方式:开多个服务实例的方式分担压力,压出自己单个实例的上限后,快到临界值时添加服务节点的方法;

M
mengao89#4·11 年前

同问,今天测试时候也遇见了这问题

J
JamCode#5·11 年前
引用 mengao89同问,今天测试时候也遇见了这问题

@mengao89 这问题困扰我一个月了

J
JamCode#6·11 年前

没人遇到吗???

P
panyunyi#7·9 年前

两年后的今天解决了吗。。。。我也遇到同样的问题

Y
yakczh#8·9 年前

如果是单独用engine.io呢,这个问题还出现吗?

参与回复
登录后即可参与回复。登录