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

我运行了一个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 } 

在我做了一个小小的调查之后,我发现这很可能是因为我试图打开太多的文件句柄或套接字,而这些句柄真的只能在一段时间后才会发生。

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

如果node.js没有这样做,这个错误的最佳解决scheme是什么,这不是增加我的打开的文件限制(这是一个坏主意,因为我们需要在这台机器上的良好性能。我确定如果我增加这个数字,这个错误就不会再出现了,我怎么知道这个应用程序的OS号?

Solutions Collecting From Web of "Node.js和打开文件限制在Linux中"

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

根软nofile 9000

根硬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长寿命连接池并开始通过它们推送请求,或者限制从您的应用程序触发的最大并发请求,并且超出此限制的任何请求将其添加到队列中,以便稍后处理它们。

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

希望这有助于。