为什么请求和超级用户都开始抛出257个GET请求的错误?

我们正在实现一个node.js服务器来获取网页和资产,通常是并行的,并将其保存到s3。 看起来像一个完美的适合节点。 仅供参考,我们正在运行节点v0.8.25,因为v0.10在ebs上不稳定,我们无法可靠地构build它。 但是,给我们的东西是合适的,

Error: connect ECONNRESET at errnoException (net.js:770:11) at Object.afterConnect [as oncomplete] (net.js:761:19) 

我们从mikeal的请求库开始,它可以处理303,缓冲和其他的开箱即用function。 现在原型已经完成了,而且我们在扩展时遇到了问题。 在4或5页开始抛出上述错误。 我们将globalAgents设置为1,000,代理(请求池)为false,还有许多其他configuration选项。 没爱。

然后我们做了一些额外的研究,并通过suback发现Hyperquest。 stream媒体是艰难的,因为我们不希望依靠内容长度标题,但是如果可以扩展的话,它愿意放弃它。 Substack有一个比较苛刻的testing套件,可以将请求和超级用户进行比较:

请求:

 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 

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 

到现在为止还挺好。 Hyperquest运行时间超过3秒,请求需要12个。然后我们设置http.globalAgent.maxSockets = 1000(或者在请求中为pool:false),并且它们都在3.229秒内运行256请求。

现在这是真正的问题和问题:如果你增加了挂起的请求和循环到257或更多,这两个库会抛出以下错误:

  stream.js:81 throw er; // Unhandled stream error in pipe. ^ Error: socket hang up at createHangUpError (http.js:1379:15) at Socket.socketCloseListener (http.js:1430:23) at Socket.EventEmitter.emit (events.js:96:17) at Socket._destroy.destroyed (net.js:358:10) at process.startup.processNextTick.process._tickCallback (node.js:245:9) 

鉴于256作品,但不是257必须有一些系统configurationvariables,需要增加,但我找不到,需要一个协助。 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 

任何帮助将真正感激!