68

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

4

3 回答 3

67

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

看看:如何更改 Linux 中打开文件的数量限制?

于 2012-05-02T21:04:05.293 回答
21

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

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

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

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

如果限制为 1024,则意味着您/进程最多可以打开 1024 个文件。如果超过此限制意味着open,系统调用将失败pipedup产生 EMFILE 错误。

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

您应该尝试找出泄漏的原因。以下可用于在 unix 之类的操作系统中进行调试:

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

    lsof | grep 节点 | wc -l

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

    lsof -n -i -P | grep 节点

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

于 2017-05-14T13:55:27.770 回答
5

就我而言,我们已经设置了最高的 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

于 2016-01-04T21:59:11.680 回答