最近收到很多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节点
使用这个,我们可以找出泄漏的地方,然后我们可以纠正它。