Node.js 为什么request和hyperquest在257个GET请求中都开始抛出错误?

Node.js 为什么request和hyperquest在257个GET请求中都开始抛出错误?,node.js,Node.js,我们正在实现一个node.js服务器来获取网页和资产,通常是并行的,并将它们保存到s3。似乎是一个完美的节点适合。仅供参考,我们正在aws ebs上运行节点v0.8.25,因为v0.10在ebs上不稳定,我们无法使其可靠构建。然而,让我们感到舒适的是好的: Error: connect ECONNRESET at errnoException (net.js:770:11) at Object.afterConnect [as oncomplete] (net.js:761:19) 我们从mi

我们正在实现一个node.js服务器来获取网页和资产,通常是并行的,并将它们保存到s3。似乎是一个完美的节点适合。仅供参考,我们正在aws ebs上运行节点v0.8.25,因为v0.10在ebs上不稳定,我们无法使其可靠构建。然而,让我们感到舒适的是好的:

Error: connect ECONNRESET
at errnoException (net.js:770:11)
at Object.afterConnect [as oncomplete] (net.js:761:19)
我们从mikeal的请求库开始,它处理303、缓冲和其他现成的细节。现在原型已经完成了,我们很难扩展它。在4或5页时,它开始抛出上述错误。我们将globalAgents设置为1000,将agent(请求池)设置为false,并设置许多其他配置选项。没有爱

然后我们做了一些额外的研究,发现了substack的Hyperquest。流媒体很难,因为我们不想依赖内容长度标题,但如果它可以扩展,我们愿意尝试一下。Substack有一个漂亮的测试套件,可以将请求与hyperquest进行比较:

var http = require('http');
var hyperquest = require('hyperquest');
var startTime = (new Date()).getTime();


var server = http.createServer(function (req, res) {
    res.write(req.url.slice(1) + '\n');
    setTimeout(res.end.bind(res), 3000);
});

server.listen(5000, function () {
    var pending = 200;
    for (var i = 0; i < 200; i++) {
        var r = hyperquest('http://localhost:5000/' + i);
        r.pipe(process.stdout, { end: false });
        r.on('end', function () {
            if (--pending === 0) server.close();
            console.log('ending test at ' + (Date.now() - startTime));            
        });
    }
});

process.stdout.setMaxListeners(0); // turn off annoying warnings
请求:

var http = require('http');
var request = require('request');
var startTime = (new Date()).getTime();

var server = http.createServer(function (req, res) {
    res.write(req.url.slice(1) + '\n');
    setTimeout(res.end.bind(res), 3000);
});

server.listen(5000, function () {
    console.log('starting test at ' + (Date.now() - startTime));
    var pending = 100;
    for (var i = 0; i < 100; i++) {
        var r = request('http://localhost:5000/' + i, {pool: false});
        r.pipe(process.stdout, { end: false });
        r.on('end', function () {
            if (--pending === 0) {
                server.close();
                console.log('ending test at ' + (Date.now() - startTime));
            }
        });
    }
});

process.stdout.setMaxListeners(0); // turn off annoying warnings
考虑到256可以工作,但不是257,必须有一些系统配置变量需要增加,但我找不到它,需要帮助。ulimit-n是2048,ulimit-a是:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2048
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited

任何帮助都将不胜感激

web服务器可能因为你发送垃圾邮件而挂断了连接。事实上,这听起来像是一个节点错误,因为我可以在Mac OS X上重现确切的问题(256个可用,257个不可用)。0.8和0.10都是如此。@Brandon web服务器在同一进程中运行……好的,更多信息(仅测试
请求
):如果你不流(但通过了一个完成回调),它可以在256以上正常工作(测试到1000)。我在osx 10.8.4上。Max files设置为1024/65536,在ram上最大化,并有大量未使用的文件。我们在AWS linux上的EC2实例上也看到了这种行为。解决方法似乎是将http.globalAgent.maxSockets设置为200。看起来所有的core node.js的人都认为使用代理是纯粹的邪恶,考虑到我们首先访问node是为了处理大量http请求,这看起来很愚蠢。
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2048
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited