Node.js中的“连接EMFILE”错误

时间:2012-04-27 17:53:18

标签: node.js express socket.io connect

我最近收到了很多运行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上。

3 个答案:

答案 0 :(得分:53)

EMFILE错误表示操作系统拒绝您的程序打开更多文件/套接字。

查看:How do I change the number of open files limit in Linux?

答案 1 :(得分:8)

EMFILE表示error maximum files表示操作系统拒绝您的程序打开更多文件描述符。

请注意,系统中的打开文件包括磁盘文件,命名管道,网络套接字和所有进程打开的设备。

您的操作系统指定每个进程的打开文件限制。

要检查系统的打开文件限制,请使用ulimit -a命令。通常在类似unix的系统上,默认为1024。

如果限制为1024,则表示您/进程可以打开最多1024个文件。如果超出此限制,则表示openpipedup系统调用将失败并产生EMFILE错误。

获得EMFILE时,它主要表示代码中存在泄漏。如果程序中存在泄漏,将ulimit增加到更高的值并不是一个好的解决方案。

你应该试着找出泄漏的原因。以下内容可用于在unix中进行调试,如操作系统:

  1. lsof表示list open files命令提供打开文件的列表。假设您的nodeJS程序有泄漏,以便找出程序打开的文件描述符总数:

    lsof | grep节点| wc -l <​​/ strong>

  2. 要查找套接字的文件描述符,请使用:

    lsof -n -i -P | grep节点

  3. 使用它我们可以找出泄漏的位置,然后我们可以纠正它。

答案 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