[英]EMFILE error when using nodejs redis
我想测试我的redis服务器可以容纳多少个连接,所以我在一个循环中调用redis.createClient(),而redis服务器仍然运行得很生,我得到了EMFILE错误,我知道我已经用完了我的fds。
但是等等,我之前只测试了我的mqtt服务器,我对我的mqtt服务器做了同样的事情,我在10000的循环中调用了mqtt.createClient(),20000 ......但我从未得到过EMFILE错误。
那么,nodejs mqtt库是否在下面使用了不同的机制?
redis-client.js:
var redis = require('redis');
function start() {
var client = redis.createClient();
client.on('error', function(err) {
console.log('Error ' + err);
});
}
exports.start = start;
Redis的-test.js
var redis_client = require('./redis-client');
for(var i = 0 ; i < 10000 ; ++i) {
redis_client.start();
console.log('redis client ' + i + ' started');
}
MQTT-subclient.js
var mqtt = require('mqtt');
function start() {
var client = mqtt.createClient();
client.subscribe('message');
//client.publish('message', 'hello me!');
client.on('message', function(topic, message) {
console.log('receive message: ');
console.log(message);
});
client.on('connack', function(packet) {
console.log(packet);
if(packet.returnCode == 0) {
console.log('connect successfully');
}
});
client.on('suback', function(packet) {
console.log(packet.messageId);
});
client.on('error', function(err) {
console.log(err);
});
}
exports.start = start;
MQTT-test.js
var subclient = require('./mqtt-subclient.js');
for(var i = 0 ; i < 10000 ; ++i) {
subclient.start();
console.log('client ' + i + ' started');
}
Redis不能接受多于x个同时连接尝试,其中x是listen系统调用的backlog参数。
它受somaxconn内核参数(128是常见默认值)和512之间的最小值的限制。因此,如果尝试超过min(somaxconn,512)并发连接,则可能会出错。 如果在连接尝试之间添加一个小延迟,则应解决此问题。
然后,您需要检查是否有足够的资源来打开10000个文件描述符(检查ulimit -a的输出),并且您的TCP / IP临时端口范围足够大以容纳这么多客户端连接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.