我最近收到了很多运行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上。
答案 0 :(得分:53)
EMFILE
错误表示操作系统拒绝您的程序打开更多文件/套接字。
答案 1 :(得分:8)
EMFILE
表示error maximum files
表示操作系统拒绝您的程序打开更多文件描述符。
请注意,系统中的打开文件包括磁盘文件,命名管道,网络套接字和所有进程打开的设备。
您的操作系统指定每个进程的打开文件限制。
要检查系统的打开文件限制,请使用ulimit -a
命令。通常在类似unix的系统上,默认为1024。
如果限制为1024,则表示您/进程可以打开最多1024个文件。如果超出此限制,则表示open
,pipe
和dup
系统调用将失败并产生EMFILE错误。
获得EMFILE
时,它主要表示代码中存在泄漏。如果程序中存在泄漏,将ulimit增加到更高的值并不是一个好的解决方案。
你应该试着找出泄漏的原因。以下内容可用于在unix中进行调试,如操作系统:
lsof
表示list open files
命令提供打开文件的列表。假设您的nodeJS程序有泄漏,以便找出程序打开的文件描述符总数:
lsof | grep节点| wc -l </ strong>
要查找套接字的文件描述符,请使用:
lsof -n -i -P | grep节点
使用它我们可以找出泄漏的位置,然后我们可以纠正它。
答案 2 :(得分:4)
在我的情况下,我们已经有了ulimit set和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