socket.io 1.3.3版本内存泄露问题
发布于 5 年前 作者 JamCode 3804 次浏览 最后一次编辑是 4 年前 来自 问答

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

8 回复

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

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

没人遇到吗???

@mengao89 解决了吗

Mark 起来,明天试试

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

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

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

回到顶部