如何在不修改ulimit的情况下处理nodejs EMFILE异常?

我是Node.JS的新手,并且遇到EMFILE错误。 我追捕EMFILE异常,并在代码中处理它。

似乎有关于“错误:EMFILE,太多打开的文件”错误的许多问题,但大多数答案似乎与“增加你的限制”一致。

我的第一个问题是,我如何捕获这个异常? 当我用许多连接运行下面的代码时,会引发EMFILE错误:

  stream = net.createConnection(port, host);

  stream.addListener('connect', function() {
    return stream.write(request);
  });
  stream.addListener('data', function(data) {
    return console.log(data);
  });
  stream.addListener('end', function() {
    stream.end();
    return callback();
  });
  stream.addListener('timeout', function() {
    stream.destroy();
    console.log("timeout");
    return callback();
  });
  stream.addListener('error', function(e) {
    console.log("this never gets called");
    return
  });

“错误”侦听器中没有捕获异常。 我试图用try{} catch (e) {}来包装上述内容,但没有任何反应。 我为createConnection使用了一个回调方法,并且它不返回任何错误。

我能够发现异常的唯一方法是:

process.on('uncaughtException', function(err) {
  console.log(err);
});

这看起来不安全,因为它抓住了一切。

所以我的第二个问题是:什么是“最佳实践”方式来捕捉错误并重试呼叫?

我已经看过:https://github.com/isaacs/npm/blob/master/lib/utils/graceful-fs.js和简单nodejs http代理失败与“太多打开的文件”作为参考,但我' m不知道如何将npm中的优雅方法应用到createConnection调用。

非常感谢!


即使你能够发现这个例外,你会对此有所帮助吗? 如果你有泄漏的地方,你需要修复泄漏,如果你的负载正常但负载很高,那么你需要以某种方式处理。 无论哪种方式,当你遇到这种情况时,你的节点进程中的事情就会非常糟糕。

不幸的是,当你处理一个uncaughtException事件时,唯一安全的事情就是记录一条错误消息,然后退出进程。 抛出异常的堆栈现在不存在了,内部深层的困惑很快就会产生。

最好的解决方案是增加进程可用的文件描述符的数量。 好消息是文件描述符非常便宜。

链接地址: http://www.djcxy.com/p/8111.html

上一篇: How to handle the nodejs EMFILE exception without modifying ulimit?

下一篇: How to use $ORIGIN and suid application?