使用nodejs redis时出现EMFILE错误

我想testing一下我的redis服务器可以容纳多less连接,所以我在一个循环中调用redis.createClient(),而redis服务器仍然运行良好,我得到了EMFILE错误,我知道我已经使用了我的fds。

但是等一下,我刚刚testing了我的mqtt服务器,我对我的mqtt服务器做了同样的事情,我在一个10000,20000的循环中调用mqtt.createClient()…但是我从来没有得到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临时端口范围足够大以容纳这样多的客户端连接。