我最近收到了很多流量到我的网站运行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上。
3条答案
按热度按时间r3i60tvu1#
EMFILE
错误意味着操作系统拒绝您的程序打开更多文件/套接字。请看:How do I change the number of open files limit in Linux?
a11xaf1n2#
EMFILE
表示error maximum files
,表示操作系统拒绝您的程序打开更多的文件描述符。请注意,系统中打开的文件包括磁盘文件、命名管道、网络套接字和所有进程打开的设备。
您的操作系统指定每个进程打开文件的限制。
使用
ulimit -a
命令检查系统的打开文件限制。一般在unix系统上默认为1024。如果限制为1024,则表示您/进程最多可以打开1024个文件。如果超过此限制,则意味着
open
、pipe
和dup
系统调用将失败并产生EMFILE错误。当你得到
EMFILE
时,它主要表明你的代码中有漏洞。将ulimit增加到更高的值并不是一个好的解决方案,以防程序中存在泄漏。你应该设法找出泄漏的原因。下面的代码可以用来在unix类操作系统中进行调试:
lsof
的意思是list open files
命令给出打开的文件列表。假设你的nodeJS程序有漏洞,那么你可以找出你的程序打开的文件描述符的总数:lsof| grep节点|wc -l
1.要查找套接字的文件描述符,请用途:
lsof -n -i -P| grep节点
利用这个我们可以找到泄漏的地方,然后我们可以纠正它。
vmdwslir3#
在我的例子中,我们已经设置了ulimit和克恩配置,它可以在Mac上运行。
解决这个问题的方法是在全局范围内限制最大套接字数量。在节点的后续版本中,极限是无穷大。
尝试添加以下代码行:
在使用请求库的情况下,可以配置这些设置。
参见:https://github.com/request/request#request---simplified-http-client
以下是maxSockets的更多信息:https://nodejs.org/api/http.html#http_agent_maxsockets