在Node.js中“连接EMFILE”错误
我最近收到很多stream量到我的网站运行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
错误意味着操作系统拒绝您的程序打开更多的文件/套接字。
看看: 如何更改Linux中打开的文件数量限制?
在我的情况下,我们已经有了在Mac上可以使用的ulimit设置和kern.maxfilesconfiguration。
什么修复它是全球限制最大套接字的数量。 在更高版本的节点中,限制是无穷大。
尝试添加这些代码行:
var https = require('https'); var http = require('http'); https.globalAgent.maxSockets = 5; http.globalAgent.maxSockets = 5;
在使用请求库的情况下,可以configuration这些设置。
请参阅: https : //github.com/request/request#request—simplified-http-client
这里是更多关于maxSockets: https ://nodejs.org/api/http.html#http_agent_maxsockets
EMFILE
意味着error maximum files
,这表明操作系统拒绝你的程序打开更多的文件描述符。
请注意,系统中的打开文件包括所有进程打开的磁盘文件,命名pipe道,networking套接字和设备。
您的操作系统指定每个进程的打开文件限制。
要检查系统的打开文件限制,请使用ulimit -a
命令。 通常在unix系统上默认为1024。
如果限制为1024,则表示您/进程最多可以打开1024个文件。 如果超过此限制意味着open
, pipe
和dup
系统调用将失败并产生EMFILE错误。
当你得到EMFILE
它主要表明你的代码泄漏。 如果程序泄漏,将ulimit增加到更高的值并不是一个好的解决scheme。
你应该试图找出泄漏的原因。 以下可以用来在unix中debugging类似的操作系统:
-
lsof
含义list open files
命令给出list open files
的列表。 假设你的nodeJS程序有泄漏,所以要找出你的程序打开的文件描述符的总数:lsof | grep节点| wc -l
-
要找出套接字的文件描述符,使用:
lsof -n -i -P | grep节点
使用这个,我们可以找出泄漏的地方,然后我们可以纠正它。