我有一个nodejs代码通过HTTP在localhost上发布数据,同时测试我发现一旦连接数达到1024,它就会开始出现以下错误:
getaddrinfo EADDRINFO
我通过使用curl
通过节点代码获取此错误,通过建立更多连接来增加最大连接限制并测试HTTP服务器,这可以在没有任何故障的情况下建立连接。
以下是发布数据的代码段:
function post(message, domain, callback){
var self=this;
var json = JSON.stringify(message);
var p = url.parse(domain);
var headers = {
'Content-Type': 'application/json',
'Content-Length': json.length
};
console.log('hostname: ' + p.hostname);
var options = {
host: p.hostname,
port: p.port,
path: p.pathname,
method: 'POST',
headers: headers
};
var req = http.request(options, function(res) {
res.setEncoding('utf-8');
var responseString = '';
res.on('data', function(data) {
responseString += data;
});
res.on('end', function() {
logger.info(responseString);
self.responseQ.push(responseString);
callback(self,message,'success');
});
});
req.on('error', function(e) {
//TODO: handle error.
logger.error('[e] Error while posting: '+e);
callback(self, message,'failure');
});
logger.info("post: "+json);
req.write(json);
req.end();
}
我认为可能存在一些问题(即使我使用的是localhost)我尝试用IP地址替换host
;然后在工作2分钟后,相同的代码开始以类似的方式给出以下错误:
Error: connect EMFILE
可能导致代码间断的原因是什么?
提前感谢任何帮助。
答案 0 :(得分:0)
尝试多个选项后,我发现以下可能导致此问题的原因:
在我的情况下,具体的失败原因是案例2;在这种情况下,我的nodejs进程可以打开的文件的最大限制限制为1024
,而网络服务器可以接受更多连接。
在这种情况下,所有需要的都是改变限制。
$su - username
$ulimit -Hn
$ulimit -Sn
根据您的需要更改值:
vi /etc/security/limits.conf
添加以下行
username soft nofile 4096
username hard nofile 10240
更改打开文件的系统范围限制:
vi /etc/sysctl.conf
添加以下行
fs.file-max = 100000