【问题标题】:How to handle the nodejs EMFILE exception without modifying ulimit?如何在不修改ulimit的情况下处理nodejs EMFILE异常?
【发布时间】:2011-07-11 11:00:39
【问题描述】:

我是 Node.JS 的新手,遇到了 EMFILE 错误。我正在寻找一种捕获 EMFILE 异常并在代码中处理它的方法。

似乎有很多关于“错误:EMFILE,打开的文件太多”错误的问题,但大多数答案似乎都与“增加你的 ulimit”有关。

我的第一个问题是,我如何捕捉这个异常?当我使用 许多 连接运行以下代码时,它会引发 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.jsSimple nodejs http proxy fails with "too many open files" 作为参考,但我不确定如何将 npm 中的 graceful 方法应用于 createConnection 调用。

非常感谢!

【问题讨论】:

    标签: asynchronous node.js


    【解决方案1】:

    即使你能捕捉到这个异常,你有什么有用的办法吗?如果某处有泄漏,则需要修复泄漏,如果负载正常但非常高,则需要以某种方式处理此问题。无论哪种方式,当您遇到这种情况时,您的节点进程中的情况就会非常糟糕。

    不幸的是,当您处理 uncaughtException 事件时,唯一安全的做法是记录错误消息,然后退出进程。抛出异常的堆栈现在已经消失了,很可能很快就会产生深刻的内部混乱。

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

    【讨论】:

    • 我真的只是想捕获异常,以此来学习处理这种应用程序异常的最佳方法。特别是对于应用程序,我最终创建了一个带有下一个连接的数组 - 当一个连接结束时,它会从数组中拉出下一个。
    • 要增加进程可用的文件描述符的数量,在 OSX 上运行 ulimit -S -n 5000
    • 我想说处理这种异常的最好方法是调试原因。 EMFILE(在你的情况下基本上是文件描述符泄漏)不是一个应该出现在功能正常的代码中的异常(除非你的代码真的打开了大量的文件)。我建议在尝试样板文件try/catch 策略之前使用lsof 来调试泄漏发生的位置、方式和原因。
    猜你喜欢
    • 2012-05-05
    • 2013-03-21
    • 1970-01-01
    • 2012-12-16
    • 2020-03-08
    • 2018-01-06
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    相关资源
    最近更新 更多