Node.js和打开文件在linux中限制

时间:2014-10-12 15:40:23

标签: linux node.js amazon-web-services amazon-s3

我运行了一个node.js客户端,它向我的服务器发送了很多请求(也写在node.js中)。

服务器获取特定文件的请求,并将其上传到S3。

两分钟后我发现以下错误:一切顺利:

{ [NetworkingError: getaddrinfo ENOTFOUND]
  message: 'getaddrinfo ENOTFOUND',
  code: 'NetworkingError',
  errno: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  region: 'us-east-1',
  hostname: 'XXXX.s3.amazonaws.com',
  retryable: true,
  time: Sun Oct 12 2014 11:27:54 GMT-0400 (EDT),
  _willRetry: false }

在我进行了一项小型研究之后,我发现它发生了probably because I'm trying to open too many file handles, or sockets, which can really only happen after a while.

但据我了解,node.js应该为我封装这个问题。换句话说,node.js应该理解文件描述符的限制,并根据此限制打开一个新的限制。这是基于事件使用一个用户线程的优势(我错在哪里?)

如果node.js没有这样做,那么这个错误的最佳解决方案是什么,这不是为了增加我的打开文件限制(这是一个坏主意,因为我们需要在这台机器上有一个良好的性能。这个和更多,我如何确定如果我增加数量,这个错误就不会再出现?我怎么知道操作系统应该为这个应用程序提供的数字?)

1 个答案:

答案 0 :(得分:2)

Ubuntu中的默认打开文件描述符是1024。 您可以使用

从终端设置ulimit -n
ulimit -n   #a number

但这只会在当前登录会话中进行更改。使更改永久使用这些命令。

ulimit -n   #see the number of open files

sudo vi /etc/security/limits.conf    #open the file in vi

现在设置两个:

用户软件nofile 9000

用户硬件nofile 65000

root soft nofile 9000

root hard nofile 65000

sudo vi /etc/pam.d/common-session

现在添加以下行:

会话需要pam_limits.so

http://posidev.com/blog/2009/06/04/set-ulimit-parameters-on-ubuntu/

编辑:

关于如何在不弄乱ulimits的情况下解决这个问题,那么你必须将被解雇的请求的总数限制为小于你当前的ulimit -n。

通过创建一个Http长期连接池并开始通过它们推送您的请求,或者限制从您的应用程序触发的最大并发请求,并且任何超过此限制的请求将它们添加到队列中,以便您以后可以处理它们。

如果你想要更多关于这个问题的帮助,这只是一个概念,向我们展示一些代码,以便我们可以想象你想要做什么。

希望这会有所帮助。