我已经非常最近收到大量的流量到我的网站运行Node.js的 随着越来越多的流量,它已经开始崩溃了很多,还没有发生过。 我得到我的日志中的以下错误:
{ [Error: connect EMFILE] code: 'EMFILE', errno: 'EMFILE', syscall: 'connect' }
Error: connect EMFILE
at errnoException (net.js:670:11)
at connect (net.js:548:19)
at net.js:607:9
at Array.0 (dns.js:88:18)
at EventEmitter._tickCallback (node.js:192:40)
任何人有一个想法,为什么它会崩溃? 和想法如何解决呢?
我使用Express.js和Socket.io。 它运行在Ubuntu。
EMFILE
错误意味着OS否认你的程序打开多个文件/插座。
看一看: 如何更改的打开的文件数限制在Linux呢?
EMFILE
意味着error maximum files
表明该OS否认你的程序打开更多的文件描述符。
需要注意的是在系统中打开的文件包括磁盘文件,命名管道,网络插座,所有进程打开的设备。
您的操作系统指定每个进程打开文件的限制。
要检查系统的打开文件限制使用ulimit -a
命令。 一般在unix系统,它默认为1024。
如果限制是1024,意味着你/进程可以打开最大1024个文件。 如果超出这个限制意味着open
, pipe
和dup
的系统调用将失败,并产生EMFILE错误。
当你EMFILE
它主要是指在你的代码的泄漏。 使用ulimit提高到一个更高的价值不万一有在你的程序漏一个很好的解决方案。
你应该尝试找出泄漏的原因。 以下可用于UNIX调试like操作系统:
lsof
意思list open files
命令给出的打开的文件列表。 假设你的程序的NodeJS是有泄漏,从而找出你的应用程序打开的文件描述符的总数:
lsof的| grep的节点| 厕所-l
要找出套接字的文件描述符,使用方法:
lsof的-n -i -P | grep的节点
利用这一点,我们可以找出泄漏位置,然后我们就可以纠正。
在我的情况下,我们已经有了的ulimit设置和kern.maxfiles配置最高可能走在Mac上。
什么固定它限制最大数量全球插槽。 在节点更高版本的限制是无穷大。
尝试添加几行代码:
var https = require('https');
var http = require('http');
https.globalAgent.maxSockets = 5;
http.globalAgent.maxSockets = 5;
在使用请求库的情况下,可以配置这些设置。
请参阅: https://github.com/request/request#request---simplified-http-client
这里更多的是对maxSockets: https://nodejs.org/api/http.html#http_agent_maxsockets