在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个文件。 如果超过此限制意味着openpipedup系统调用将失败并产生EMFILE错误。

当你得到EMFILE它主要表明你的代码泄漏。 如果程序泄漏,将ulimit增加到更高的值并不是一个好的解决scheme。

你应该试图找出泄漏的原因。 以下可以用来在unix中debugging类似的操作系统:

  1. lsof含义list open files命令给出list open files的列表。 假设你的nodeJS程序有泄漏,所以要找出你的程序打开的文件描述符的总数:

    lsof | grep节点| wc -l

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

    lsof -n -i -P | grep节点

使用这个,我们可以找出泄漏的地方,然后我们可以纠正它。