在NODE.JS中“连接EMFILE”错误解决方法

发布时间:2022-2-14 10:29

最近收到很多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个文件。 如果超过此限制意味着open , pipe和dup系统调用将失败并产生EMFILE错误。

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

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

  • lsof含义list open files命令给出list open files的列表。 假设你的nodeJS程序有泄漏,所以要找出你的程序打开的文件描述符的总数:
  • lsof | grep节点| wc -l
  • 要找出套接字的文件描述符,使用:
  • lsof -n -i -P | grep节点

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

Vue3学习笔记之依赖注入Provide/Inject 网站建设

Vue3学习笔记之依赖注入Provide/Inject

Provide / Inject 通常,当我们需要从父组件向子组件传递数据时,我们使用 props。想象一下这样的结构:有一些深度嵌套的组件,而深层的子组件只需要父组件的部分内容。在这种情况下,如果...
Vue3全局实例上挂载属性方法案例讲解 网站建设

Vue3全局实例上挂载属性方法案例讲解

在大多数开发需求中,我们有时需要将某个数据,或者某个函数方法,挂载到,全局实例身上,以便于,在项目全局的任何位置都能够调用其方法,或读取其数据。 在Vue2 中,我们是在 main.js 中 直...