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 错误意味着操作系统拒绝您的程序打开更多的文件/套接字.
Gau*_*hra 10
EMFILE意味着error maximum files这表明OS否认你的程序打开更多的文件描述符.
请注意,系统中的打开文件包括磁盘文件,命名管道,网络套接字和由所有进程打开的设备.
您的操作系统指定每个进程的打开文件限制.
检查系统使用ulimit -a命令的打开文件限制.通常在类似unix的系统上,默认为1024.
如果限制为1024,则表示您/进程可以打开最多1024个文件.如果超出这个限制意味着open,pipe和dup系统调用将失败,并产生EMFILE错误.
当你得到EMFILE它主要表明代码中的泄漏.如果程序中存在泄漏,将ulimit增加到更高的值并不是一个好的解决方案.
你应该试着找出泄漏的原因.以下内容可用于在unix操作系统中进行调试:
lsof含义list open files命令给出打开文件的列表.假设您的nodeJS程序有泄漏,以便找出程序打开的文件描述符总数:
lsof | grep节点| wc -l
要找出套接字的文件描述符,请使用:
lsof -n -i -P | grep节点
使用它我们可以找出泄漏的位置,然后我们可以纠正它.
就我而言,我们已经在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
| 归档时间: |
|
| 查看次数: |
42420 次 |
| 最近记录: |