5

多くの場合、並行して Web ページとアセットをフェッチし、s3 に保存する node.js サーバーを実装しています。ノードにぴったりのようです。参考までに、v0.10 は ebs では不安定であり、確実にビルドすることができなかったため、aws ebs でノード v0.8.25 を実行しています。しかし、私たちにぴったりのものは古き良きものです:

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

私たちは mikeal のリクエスト ライブラリから始めました。これは、303 の処理、バッファリング、その他の優れた機能をすぐに使用できます。これでプロトタイプが完成しましたが、スケーリングに問題があります。4 ページまたは 5 ページで、上記のエラーが発生し始めます。globalAgents を 1,000 に、エージェント (リクエスト用のプール) を false に設定し、その他の多くの構成オプションを設定しました。愛がない。

その後、追加の調査を行い、サブスタックによって Hyperquest を見つけました。コンテンツの長さのヘッダーを当てにしたくないため、ストリーミングは難しいですが、スケーリングできる場合は喜んで試してみたいと思います。Substack には、リクエストとハイパークエストを比較する気の利いたテスト スイートがあります。

リクエスト:

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

ハイパークエスト:

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 (またはプール: リクエストで false) を設定すると、256 リクエストに対して両方とも 3.229 秒で実行されます。

本当の問題と質問は次のとおりです。保留中のリクエストとループを 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 は機能しないため、システム構成変数を増やす必要がありますが、見つけることができず、支援が必要です。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

どんな助けでも本当に感謝します!

4

0 に答える 0