在Node.js的“连接EMFILE”错误(“connect EMFILE” error in No

2019-06-24 00:48发布

我已经非常最近收到大量的流量到我的网站运行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。

Answer 1:

EMFILE错误意味着OS否认你的程序打开多个文件/插座。

看一看: 如何更改的打开的文件数限制在Linux呢?



Answer 2:

EMFILE意味着error maximum files表明该OS否认你的程序打开更多的文件描述符。

需要注意的是在系统中打开的文件包括磁盘文件,命名管道,网络插座,所有进程打开的设备。

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

要检查系统的打开文件限制使用ulimit -a命令。 一般在unix系统,它默认为1024。

如果限制是1024,意味着你/进程可以打开最大1024个文件。 如果超出这个限制意味着openpipedup的系统调用将失败,并产生EMFILE错误。

当你EMFILE它主要是指在你的代码的泄漏。 使用ulimit提高到一个更高的价值不万一有在你的程序漏一个很好的解决方案。

你应该尝试找出泄漏的原因。 以下可用于UNIX调试like操作系统:

  1. lsof意思list open files命令给出的打开的文件列表。 假设你的程序的NodeJS是有泄漏,从而找出你的应用程序打开的文件描述符的总数:

    lsof的| grep的节点| 厕所-l

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

    lsof的-n -i -P | grep的节点

利用这一点,我们可以找出泄漏位置,然后我们就可以纠正。



Answer 3:

在我的情况下,我们已经有了的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



文章来源: “connect EMFILE” error in Node.js