3

C# で約 10,000 クライアントを処理できる高性能サーバーを作成したいと考えています。ここで、C# を使用して TcpServer の作成を開始し、クライアント接続ごとに新しいスレッドを開きます。また、1 つのスレッドを使用して接続を受け入れます。これまでのところ、うまくいきます。

サーバーは、AMF 受信オブジェクトをデシリアライズし、いくつかのロジック (プレーヤーの位置を保存するなど) を実行し、オブジェクトを送り返す (オブジェクトのシリアライズ) 必要があります。シリアライズ/デシリアライズ部分のatmは気になりません。

私の主な懸念は、10,000 クライアントで多くのスレッドを使用することであり、OS が数百のスレッドのようにしか保持できないことをどこかで読んだことがあります。

まともな非同期スレッドサーバーの作成に関するソース/記事はありますか? 他の可能性はありますか、それとも 10k スレッドで問題なく動作しますか? 私はグーグルを見てきましたが、デザインパターンやそれを明確に説明する方法について多くの情報を見つけることができませんでした

4

4 に答える 4

4

さまざまな問題に直面することになります。

  1. いくつかの理由により、10,000 スレッドをスピンアップすることはできません。カーネルスケジューラを破棄します。32 ビットを実行している場合、デフォルトのスタック アドレス空間 1MB は、10k スレッドが約 10GB のアドレス空間を予約することを意味します。それは失敗します。

  2. 単純な選択システムも使用できません。本質的に、select はソケット数の O(N) です。10kソケットでは、それは悪いです。

  3. IO Completion Ports を使用できます。これは、彼らが設計されたシナリオです。私の知る限り、安定したマネージド IO Completion ポート ライブラリはありません。P/Invoke または Managed C++ を使用して独自に作成する必要があります。楽しむ。

于 2010-03-30T21:30:50.860 に答える
3

効率的なマルチスレッド サーバーを作成する方法は、I/O 完了ポートを使用することです (@Marcelo が言及しているように、リクエストごとにスレッドを使用するのは非常に非効率的です)。

.NET ソケット クラスの非同期バージョンを使用する場合は、これを無料で入手できます。ドキュメントへのポインタがあるこの質問を参照してください。

于 2010-03-30T21:32:17.980 に答える
1

リクエストごとにスレッドは絶対に必要ありません。クライアントの数が少ない場合でも、スレッドの作成と破棄のオーバーヘッドによってサーバーが機能しなくなり、10,000スレッドに到達する方法はありません。OSスケジューラーはそれよりずっと前に恐ろしい死を遂げるでしょう。

C#での非同期サーバープログラミングに関するオンラインの記事は多数あります(例:ここ)。ちょっとググってください。

于 2010-03-30T21:25:26.837 に答える
1

IO 完了ポートの使用を検討したい。基本的に、スレッドプールと IO 操作のキューがあります。

I/O 完了ポートは、マルチプロセッサ システムで複数の非同期 I/O 要求を処理するための効率的なスレッド モデルを提供します。プロセスが I/O 完了ポートを作成すると、システムは、これらの要求を処理することのみを目的とする要求に関連するキュー オブジェクトを作成します。多くの同時非同期 I/O 要求を処理するプロセスは、I/O 要求の受信時にスレッドを作成するよりも、事前に割り当てられたスレッド プールと組み合わせて I/O 完了ポートを使用することにより、より迅速かつ効率的に処理できます。

于 2010-03-30T21:31:33.060 に答える