2013-07-23 51 views
2

我想测试我的redis服务器可以容纳多少个连接,所以我在一个循环中调用redis.createClient(),而redis服务器仍然运行活跃,我得到了EMFILE错误,我知道我已经使用了我的fds。使用nodejs redis时出现EMFILE错误

但是等等,我刚才测试了我的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'); 
} 
+0

你能显示更多代码吗? – Raptor

+0

@ShivanRaptor好吧,我附加了一些代码,你能帮忙吗? –

+0

@Shivan猛禽好的,我附加了一些代码,你能帮忙吗? –

回答

0

Redis不能接受x个以上的同时连接尝试,其中x是listen系统调用的backlog参数。

它受到somaxconn内核参数(128是一个常用默认值)和512之间的最小值限制。因此,如果尝试多于min(somaxconn,512)同时连接,则可能有错误。如果在连接尝试之间添加一个小延迟,它应该解决这个问题。

然后,您需要检查是否有足够的资源来打开10000个文件描述符(检查ulimit -a的输出),并且您的TCP/IP临时端口范围足够大以容纳这样多的客户端连接。

+0

谢谢,我添加了一个小延迟(试验了10ms和100ms),这不是同时发生的问题,它只是打开太多导致EMFILE错误的文件描述符。但我仍然不知道为什么nodejs mqtt服务器不存在这样的问题? –

+0

您可能需要检查node.js客户端程序的/ proc//fd,以查看是否有效地使用了文件描述符。也许mqtt连接不被维护。 –

相关问题