检测到可能的EventEmitter内存泄漏 - nodejs v.0.10.4 - 在centos上

时间:2013-07-31 13:23:16

标签: node.js http memory-leaks static-files eventemitter

我正在尝试使用Node.js创建简单的静态文件服务器,即将视频服务视频/ mp4(内容类型),以便通过http下载。

要注意,文件很大(超过100mb)

尝试使用package node-serve,建议用于静态文件服务,但不能满足我的目的(并且看起来使用阻塞读取)。

我的自定义代码确实有效,但是每次请求都会收到内存泄漏,这是10-20次请求之后的 使用以下错误导致进程崩溃: 致命错误:CALL_AND_RETRY_2分配失败 - 处理内存不足

每次刷新都会使node.js的内存占用量增加大约200mb。

在这里查看了大多数有关node.js内存泄漏的答案,没有答案 解决我的问题,因为它似乎有点特定于平台或组合...而且严格来说不是代码错误,也注意到开发人员遇到了这个问题,因为版本0.6以上的node.js ......

还看到声称发生在Express(https://npmjs.org/package/express

的帖子

使用的代码:

var fs = require('fs');
var http = require('http');
var mediaPath = '/mypublicdir';


function error404(res) {
    res.writeHead(404,{'content-type':'text/plain'});
    res.end();
} 

function err(str) {
    console.log(str);
}

var server = http.createServer(function (req,res){

  var filename,readStream;


  filename = mediaPath+req.url
  if (fs.existsSync(filename)) {
    readStream = fs.createReadStream(filename, {
        'flags': 'r',
            'mode': 0666,
            //'encoding': 'binary',
            'bufferSize': 8 * 1024      
    });

  } else {

    return;

  }

  readStream.on('data',function(data){
    res.write(data);
  });   

  readStream.on('open',function(data){
    console.log('Stream Open');
    res.writeHead(200,{'content-type':contentTypeSelector('video'),
    'Content-Transfer-Encoding' : 'binary',
    'Transfer-Encoding' : 'chunked'
    });
  });

  readStream.on('error',function(e){
    error404(res);
    err('Stream Read Error',{request:collectRequestMeta(req),filename:filename,error:e});
  });

  readStream.on('end',function(data){
  });

});


server.listen(8080);

每个请求的完整警告:

(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at Socket.EventEmitter.addListener (events.js:160:15)
    at Socket.Readable.on (_stream_readable.js:653:33)
    at Socket.EventEmitter.once (events.js:179:8)
    at TCP.onread (net.js:527:26)
写这篇文章时,我发现了以下问题: NodeJS : How to debug "EventEmitter memory leak detected. 11 listeners added"

表示这是nodejs核心中的错误:(

奇怪的是,在我的Windows机器上,它不会发生。 除了安装旧版本v0.8.23之外的任何其他想法 不胜感激..

3 个答案:

答案 0 :(得分:0)

我实际上在节点0.10.4(Node.js app becomes unresponsive if I reload multiple times in quick succession)上遇到了同样的问题 - 最好的解决方案是升级到0.10.15 - 错误已在新版本中修复。

答案 1 :(得分:0)

我在Windows上有版本0.10.36但仍然会发生:/

答案 2 :(得分:-1)

正如GitHub上的问题所讨论的那样,自节点v0.10.11以来已经修复了这个问题。如果您遇到节点错误,请先尝试更新,看看它是否已经修复。