【问题标题】:EMFILE error when using nodejs redis使用nodejs redis时出现EMFILE错误
【发布时间】:2013-07-23 06:57:11
【问题描述】:

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

但是等等,我之前刚刚测试过我的 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');
}

【问题讨论】:

  • 你能显示更多代码吗?
  • @ShivanRaptor 好的,我已经附加了一些代码,你能帮忙吗?
  • @Shivan Raptor 好的,我已经附加了一些代码,你能帮忙吗?

标签: node.js redis mqtt


【解决方案1】:

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

它受到 somaxconn 内核参数(128 是常见的默认值)和 512 之间的最小值的限制。因此,如果您尝试同时连接超过 min(somaxconn,512),则可能会出错。如果您在连接尝试之间添加一小段延迟,它应该可以解决此问题。

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

【讨论】:

  • 谢谢,我添加了一个小延迟(10ms 和 100ms 都可以尝试),这不是同时出现的问题,只是打开的文件描述符过多导致了 EMFILE 错误。但是我还是不知道为什么nodejs mqtt服务器没有这个问题?
  • 您可能需要检查 node.js 客户端程序的 /proc//fd,以查看文件描述符是否按应有的方式有效使用。可能没有维护 mqtt 连接。
猜你喜欢
  • 2016-11-27
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多