3

私は他の誰かがこれに遭遇したかどうかを確認しようとして掘り下げてきましたが、私はそうではないと思っていました.それが私が見つけたものです.

私が今直面している問題は、私が構築しているアプリケーションのアーキテクチャに関連しています。node.js のゲーム サーバー。現在、サーバーは、すべての子プロセスを制御する単一の「マネージャー」プロセスで起動します。ゲームの各「ゾーン」または「エリア」はcluster.fork()、個別のプロセスを使用してスピンアップされるため、各「ゾーン」はサーバー上に独自のスレッドを持ち、サーバーがこれらの「ゾーン」の多くを一度に実行する能力を最適化できます。 .

私が今直面しているジレンマはこれです。各「ゾーン」は単一のスレッドで実行されており、そのスレッドは「ゾーン」の同期を維持するために複雑な 3D 演算を 1 秒あたり X 回実行する予定であるため、Socket.io を開きたくありません (通信ゲームクライアントとの通信に使用されるライブラリ) を同じスレッドで使用します。私がハングアップしているのはcluster.on('message')、マスター プロセスでハンドラーを使用し、Socket.io からマスター プロセスにメッセージをパイプする際のパフォーマンスにあると思いますprocess.send({...})

私は、他の誰かがこれについて経験を持っているか、クラスターモジュール全体がどのように機能するか、そして本質的にこれを基本的なレベルで知っているかどうかを確認しようとしています:

呼び出す方が速いですか:

var io = require('socket.io').listen( 1337 );
io.sockets.on('connection',...); //map all the functionality here in the "zone" thread

または、次のようにします。

var cluster = require('cluster');
var io = [];
//arbitrary number for the thread count, not important for theory testing
for( var i = 0; i < 4; ++i) {
    var process = cluster.fork({...});
    process.on('message',myRelayFunction);
    io.push( process );
}

もちろんcluster.fork()、socket.io 接続を開き、さまざまなクライアントからのメッセージを「ゾーン」プロセスに中継するだけのスクリプトに呼び出しがパイプされていると仮定します。

これでパフォーマンステストを実行してみましたが、テストする出力を得るために接続でマシンを飽和させるのが難しいため、これが高速かどうかを判断するのは非常に困難です。

これがスケーラブルであることを確認して、より重い負荷の下で、アプリケーションがサーバー上の複数の CPU コアを最大限に活用できるようにしたいと考えています。もちろん、socket.ioリスナーを複数のスレッドにマルチスレッド化する必要があると言っていますが、私の懸念は、それらはすべて技術的に単一のスレッド化されたプロセスにパイプバックしているため、マルチのパフォーマンス向上の可能性を犠牲にしないことです-それらをスレッド化しますか? ここのテスト/ベンチマーク部門では、私はちょっと空虚になってきています.これがどのようにうまく機能するかの背後にある理論が、ここで何が最善の基本的なアプローチであるかを言うのに十分ではありません.誰かがこれについて持っている入力;)

4

1 に答える 1

4

私はさらにいくつかのテストを行うことができました.socket.ioリスナーを別のスレッドに置くことは、単一の「ゾーン」(マネージャー)プロセスにデータをパイプイン/アウトする必要がある場合でも、パフォーマンスにとって非常に有益であるようです. このようにして、サーバーは別の CPU を使用して、ゾーン処理とは別に IO 処理を処理できます。

したがって、ここでの答えは、はい、すべてのスレッドが何かのために単一のスレッドと通信している場合でも、リスナー/ソケットを個別のスレッドにマルチスレッド化することは依然として有益です。もちろん、それは私が経験していた他の問題につながります.node.jsの複数の子プロセス間の通信を最適化する方法でした.それはこのプロセスの次の論理的なステップ/ハードルであるため、誰かがそうしないと、後でこの問題を解決することができなくなります。

node.js クラスターの子プロセス間通信オプション

于 2013-01-21T18:31:32.860 に答える