我运行了一个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没有这样做,那么这个错误的最佳解决方案是什么,这不是为了增加我的打开文件限制(这是一个坏主意,因为我们需要在这台机器上有一个良好的性能。这个和更多,我如何确定如果我增加数量,这个错误就不会再出现?我怎么知道操作系统应该为这个应用程序提供的数字?)
答案 0 :(得分:2)
Ubuntu中的默认打开文件描述符是1024。 您可以使用
从终端设置ulimit -nulimit -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长期连接池并开始通过它们推送您的请求,或者限制从您的应用程序触发的最大并发请求,并且任何超过此限制的请求将它们添加到队列中,以便您以后可以处理它们。
如果你想要更多关于这个问题的帮助,这只是一个概念,向我们展示一些代码,以便我们可以想象你想要做什么。
希望这会有所帮助。