2

node.js のインバウンド/アウトバウンド接続について質問があります。私の状況または私が達成したいことを考えてみましょう:

たとえば、1 秒あたり X 個のインバウンド HTTP リクエストがあります。リクエストごとに、サードパーティへのアウトバウンド https リクエストを作成します (平均 300 ミリ秒で応答します)。この第三者から応答を受け取った場合、私はこの要求が処理されたと見なします。サードパーティが非常に多くのサーバーを持ち、リクエストを並行して管理できると想像してみましょう。すべてのリクエストに対して、mongoDB クエリはほとんどありません (高速です)。エクスプレスフレームワークを使用しています。

私のラップトップ (Windows を搭載した 4 コアと 4 GB RAM、およびパフォーマンスを損なう可能性のある他の多くのプログラムがインストールされている) では、1 秒あたり 150 のリクエストを取得できましたが、処理されたのは 40 だけでした。

私が知らないこと: これは実際に現実であり、理論的にはこれ以上達成できなかったのか、それともこの宇宙のどこかに私のパフォーマンスを向上させる解決策/トリックがあるのでしょうか?

提案をありがとう。

4

1 に答える 1

2

ノードを使用すると、このタイプのシナリオで実行できる非常に簡単な最適化があり、それはワーカー プールを作成することです。v8 エンジンの動作方法や、ノードがイベント ループを使用する方法などにより、単一のノード プロセスは、実際にはプロセッサのコアの約 50% しか使用できません。あなたの説明がファイルサーバーに典型的であるように思われる比較的標準的なイベントループ(大量の同期作業ではない)を想定すると(I / Oが多いが、プロセッサの重い操作はほとんどない)、起動することで大幅なパフォーマンスの向上を得ることができます多くのノード ワーカー。これにより、ノード プロセスの 1 つがイベントをリッスンしていない時間が最小限に抑えられ、CPU の作業量が最大化されます。もちろん、これによって個々のトランザクションが高速化されるわけではありません。

https://github.com/isaacs/cluster-master

Cluster-master は、ワーカーを管理し、ワーカー プールを作成するプロセスを安定してシンプルに保つための便利なツールであり、NPM でインストールできると思います。

編集:

何を非同期で実行できるか、何を同期で実行する必要があるかは、常に簡単に判断できるとは限りません。注意すべき事項の経験則:

  • 名前に同期を含むノード/ライブラリ呼び出し...

  • 他の関数への呼び出しがほとんどない大規模な関数。

  • ビジーな while ループ

いくつかの代替案:

回避できないビジーな while ループがある場合。少なくともイベント ループ時間が新しいイベントを取得できるようにするために、いくつかのクールなロジックを実行できます。これはおそらく有効なコードではありません (ノードを備えた PC ではありません) が、概念のデモを行う必要があります。

var someInt;
function callBack() {
    doWorkWith(someInt);
    someInt++;
    if(someInt < someMaximum) event.trigger(whileLoop);//The entire event loop will be able to run before we get to the next iteration of callback because we're using events!
}

event.register(whileLoop, callBack);

ノードにイベントを登録するためのコードを覚えていませんが、このロジックは、while ループが必要な場合に適しています。これにより、各反復でイベント ループ全体を実行できるため、次のようになります。

while(someInt++ < someMax) {
    doWorkWith(someInt);
}

while ループの実行中は、他のイベントを取得できません。

もう 1 つ注意すべきことは、ライブラリ プログラマ、特に I/O ライブラリの悪い習慣です。コードを調べる機会があった場合や、ライブラリに関する非常に肯定的なレビューがない限り、行ったライブラリ呼び出しについて悪いことを想定し、それらが問題の原因であるかどうかを調査してください。

于 2013-06-13T13:42:12.153 に答える