6

コードあり、

async.series(tasks, function (err) {
    return callback ({message: 'tasks execution error', error: err});
});

ここで、tasksは関数の配列であり、それぞれが (requestモジュールを使用して) HTTP 要求を実行し、MongoDB API を呼び出してデータを (MongoHQ インスタンスに) 保存します。

私の現在の入力(実行するのに約200のタスク)では、

  [normal mode] collection cycle: 1356.843 sec. (22.61405 mins.)

しかし、単純に からseriesに変えてみるとparallel、すばらしい効果が得られます。~30 secsの代わりにほぼ同じ量のタスクが実行されます~23 mins

しかし、何も無料ではないことを知っているので、その変化の結果がどうなるかを理解しようとしています。開いているソケットの数がはるかに多くなり、メモリ消費が増え、DB サーバーへのヒットが増えると言えますか?

コードを実行するマシンは 1 GB の RAM Ubuntu しかないため、アプリが 1 回ハングするようにしましたが、リソース不足が原因でしょうか?

4

4 に答える 4

5

並列処理は無料ではないというあなたの直感は正しいですが、確かにそれを支払うことができるかもしれません。

nodeloadなどの負荷テスト モジュール (またはモジュールのコレクション) を使用すると、この並列操作がサーバーに与える影響を定量化し、許容できるかどうかを判断できます。

Async.parallelLimitは、必要に応じてサーバーの負荷を制限する良い方法ですが、まず、制限が必要かどうかを確認することが重要です。明示的にテストすることは、システムの制限を発見するための最良の方法です (eachLimit には異なる署名がありますが、同様に使用できます)。

これを超えて、 async.parallel を使用する一般的な落とし穴には、その関数が提供するものよりも複雑な制御フローが必要な場合 (説明からは当てはまらないようです) や、大きすぎるコレクションで単純に parallel を使用することが含まれます (たとえば、多くのファイルを書き込んでいる場合、システムのファイル記述子の制限にぶつかる可能性があります)。1 GB の RAM で最大 200 のリクエストと保存操作を行う場合、イベント ハンドラーで多くの操作を行わない限りは問題ないと思いますが、サーバーのハングが発生している場合は、parallelLimit を使用することをお勧めします。

繰り返しますが、テストはこれらのことを把握するための最良の方法です。

于 2013-08-05T21:38:03.790 に答える
3

(完全に)並列async.parallelではなく、複数の関数を同時に実行することを指摘します。これは仮想並列処理に似ています。

同時実行は、マルチタスク/スケジューリングを介して、単一の CPU コアで異なるプログラムを実行するようなものです。真の並列実行とは、マルチコア CPU の各コアで異なるプログラムを実行することです。node.js はシングルスレッドアーキテクチャであるため、これは重要です。

ノードの最も良い点は、I/O について心配する必要がないことです。I/O を非常に効率的に処理します。

あなたの場合、データをMongoDBに保存していますが、ほとんどがI / Oです。したがって、それらを並行して実行するとネットワーク帯域幅が使い果たされ、ディスクから読み書きする場合はディスク帯域幅も使い果たされます。CPU の過負荷が原因でサーバーがハングすることはありません。


この結果、サーバーに過剰な負荷がかかると、リクエストが失敗する可能性があります。エラーが発生する場合がありEMFILEます (開いているファイルが多すぎます)。各ソケットはファイルとしてカウントされます。通常、接続はプールされます。つまり、接続を確立するためにプールからソケットが選択され、終了するとプールに戻ります。でファイル記述子を増やすことができますulimit -n xxxx

ECONNRESET(Error: socket hang up )ECONNREFUSEDETIMEDOUT. したがって、それらを適切に処理してください。また、mongoDB サーバーの最大同時接続数も確認してください。


最後に、ガベージ コレクションが原因でサーバーがハングアップする可能性があります。ガベージ コレクションは、メモリが特定のポイントまで増加すると開始され、しばらくすると定期的に実行されます。V8 が保持できる最大ヒープ メモリは約 1.5 GB であるため、メモリが多い場合は GC が頻繁に実行されることを期待してください。process out of memoryその制限を超えて要求すると、ノードがクラッシュします。したがって、プログラムのメモリ リークを修正します。これらのツールを見ることができます。

于 2013-08-07T06:34:28.957 に答える