繁体   English   中英

使用nodejs redis时出现EMFILE错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM