Node.js EMFILE错误,流量增加

lstz6jyr  于 2023-05-17  发布在  Node.js
关注(0)|答案(3)|浏览(120)

我最近收到了很多流量到我的网站运行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上。

r3i60tvu

r3i60tvu1#

EMFILE错误意味着操作系统拒绝您的程序打开更多文件/套接字。
请看:How do I change the number of open files limit in Linux?

a11xaf1n

a11xaf1n2#

EMFILE表示error maximum files,表示操作系统拒绝您的程序打开更多的文件描述符。
请注意,系统中打开的文件包括磁盘文件、命名管道、网络套接字和所有进程打开的设备。
您的操作系统指定每个进程打开文件的限制。
使用ulimit -a命令检查系统的打开文件限制。一般在unix系统上默认为1024。
如果限制为1024,则表示您/进程最多可以打开1024个文件。如果超过此限制,则意味着openpipedup系统调用将失败并产生EMFILE错误。
当你得到EMFILE时,它主要表明你的代码中有漏洞。将ulimit增加到更高的值并不是一个好的解决方案,以防程序中存在泄漏。
你应该设法找出泄漏的原因。下面的代码可以用来在unix类操作系统中进行调试:

  1. lsof的意思是list open files命令给出打开的文件列表。假设你的nodeJS程序有漏洞,那么你可以找出你的程序打开的文件描述符的总数:

lsof| grep节点|wc -l

1.要查找套接字的文件描述符,请用途:

lsof -n -i -P| grep节点

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

vmdwslir

vmdwslir3#

在我的例子中,我们已经设置了ulimit和克恩配置,它可以在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

相关问题