Node.js中的"连接EMFILE"错误

cod*_*ick 55 connect node.js express socket.io

我最近收到了运行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)
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会崩溃?和想法如何解决?

我正在使用Express.js和Socket.io.它运行在Ubuntu上.

ste*_*ewe 57

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

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

  • 增加套接字限制不会解决泄漏,它只会让你的应用程序暂停一段时间. (10认同)
  • @Robert有时增加ulimit实际上是解决方案,就好像它是256并且你有高流量,虽然我是我的情况我反复打开文件流并且从不关闭它们,我用lsof -p <nodes抓住了这个漏洞PID>.如果失败,您可以使用izaacs graceful-fs模块 (3认同)
  • 不幸的是,优雅的fs模块不适合我.我因为套接字而达到极限,不是因为用`fs'打开了很多文件,而是感谢你的帮助. (2认同)

Gau*_*hra 10

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

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

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

检查系统使用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节点

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


Mic*_*nin 5

就我而言,我们已经在Mac上设置了ulimit设置和kern.maxfiles配置。

解决该问题的方法是限制全局最大套接字数。在更高版本的节点中,限制为无穷大。

尝试添加以下代码行:

var https = require('https');
var http = require('http');

https.globalAgent.maxSockets = 5;
http.globalAgent.maxSockets = 5;
Run Code Online (Sandbox Code Playgroud)

在使用请求库的情况下,您可以配置这些设置。

参见:https : //github.com/request/request#request---simplified-http-client

以下是有关maxSockets的更多信息:https ://nodejs.org/api/http.html#http_agent_maxsockets