Node.js + Socket.io 内存泄漏和最大监听器

Posted

技术标签:

【中文标题】Node.js + Socket.io 内存泄漏和最大监听器【英文标题】:Node.js + Socket.io memory leak and max listener 【发布时间】:2013-04-09 23:59:01 【问题描述】:

我是 node.js 初学者。尝试创建简单的聊天应用程序,但有问题。当页面快速刷新 10 次以上时,我有警告:

(node) 警告:检测到可能的 EventEmitter 内存泄漏。增加了 11 位听众。使用emitter.setMaxListeners() 增加限制。

当我禁用 socket.io 时,此警告消失。所以,socket.io 有问题。如何增加 socket.io 的最大侦听器?或者也许是另一种解决方案?

代码:

var http = require('http')
fs = require('fs');

var server = http.createServer(function(req, response) 
    req.setMaxListeners(0);
    var pathname = __dirname + '/index.html'

    fs.readFile(pathname, "binary", function(err, file) 
        if (err) 
            response.writeHead(500, 'Content-Type': 'text/plain');
            response.end(err);
         else 
            response.writeHead(200, 'Content-Type': 'text/html');
            response.write(file, "binary");
            response.end();
       
    );
);

io = require('socket.io').listen(server);
server.listen(4567);

【问题讨论】:

为什么首先设置maxListener?也许GC会变慢。另外,我不确定 socket.io 在您使用的这种非常不完整的状态下是否可以正常使用。 我这里只是举个小例子。我将在客户端和服务器上使用 websockets。但现在我必须解决内存问题。 【参考方案1】:

我无法重现该问题,但试试这个:

io.setMaxListeners(0);

【讨论】:

已经试过了。还尝试了 io.sockets.setMaxListeners(0)。不能解决问题。 嗯,它只是一个警告,所以你可以忽略它:) 是的,但同时我看到内存使用量大幅增加。高达 60-80%,但没有 socket.io - 只有 1-2%。 您问题中的代码是否正是您正在测试的代码? 当然。当我多次快速刷新页面时,就会出现问题。我认为不应该。【参考方案2】:

在代码顶部尝试此操作以全局增加发射器限制

require('events').EventEmitter.prototype._maxListeners = 100;

【讨论】:

以上是关于Node.js + Socket.io 内存泄漏和最大监听器的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io 聊天应用程序显示检测到 EventEmitter 内存泄漏。增加了 11 位听众。使用发射器.setMaxListeners()

带有 Socket.IO 1.0 的 NodeJS - 堆外的内存泄漏

Node.js内存泄漏分析

Node.js 和 socket.io 的混淆

Node.js内存泄漏分析

node.js、socket.io 和 SSL