この内容は cnblog で何度も議論されており、私は過去 2 日間でいくつかの情報を読み、いくつかの簡単なパフォーマンス指標を見て、みんなで議論しました。
ソケット + スレッド/スレッドプール
おおよそのパフォーマンス: 1500 未満の接続。
実装: ソケットを受け入れ、スレッドに管理を任せます。これは比較的愚かですが、同期メソッドであるため、制御が非常に便利です。より高度な方法は、スレッド プールを管理のためにスレッド プールに引き渡し、システムによって自動的にホストされ、オーバーヘッド スレッドの時間を節約することです。一般的な小規模プロジェクトの場合はこれで十分であり、開発は簡単です。ただし、複数のソケットがスレッド プール内のスレッドを長時間占有し、他にも多数の接続がある場合、使用するスレッドが不足していることを示すプロンプトが表示されやすいことに注意してください。はは、Socket の作業を減らし、より高速な CPU に変更するのにかかる時間を短縮するのは良い方法です。さらに、より優れたサードパーティ製スレッド プール コンポーネント (SmartThreadPool など) がある場合は、それらを使用することも選択できます。
ソケット+セレクト
おおよそのパフォーマンス: 接続が 1500 を超えるとパフォーマンスが低下します。
実装: Select は非常に一般的に使用されるモデルです。ブロッキング関数で 1 つ以上のソケットをポーリングし、処理対象のソケットを IList に入れます。選択ポーリングが完了したら、この IList 内のソケットを自分で処理します。具体的な使用方法については、MSDN を参照してください。 Select の効率は高いとは言えません。キュー内に処理対象の Sockets が多数ある場合、最後の数個の Socket を処理することは、前の Socket をすべて走査することと同じになり、非常に不経済です。
ソケット+非同期
おおよそのパフォーマンス: 約 7500 クライアント接続
実装: BeginXXXX、EndXXXX、これは誰もがよく知っています。最終的な分析として、非同期ソケットは依然としてスレッド プール テクノロジを使用しており、スレッド プールを使用して非同期 IO を処理します。これは、.NET のスレッド プールにはどのような実装方法が使用されているのかという別の疑問を引き起こします。以前、.NET のスレッド プールは完了ポートを使用して実装されていると言っているのを見たことがありますが、それが正しいかどうかはわかりません。私が見つけた情報から(友人がこれを教えてくれることを願っています)。非同期ソケットは同期プログラムの処理フローよりもはるかに複雑で、非同期コールバック関数の制御は同期メソッドほど直感的ではありません。ただし、注意すべき点は、コールバック関数は軽く使用し、転送されたデータの処理を他のスレッドに任せて処理しすぎないようにすることです。
IOCP (完了ポート)
おおよそのパフォーマンス: 約 20,000 ~ 50,000 のクライアント接続
実装: .NET にいくつかの疑似 IOCP が存在します。これらの疑似 IOCP を使用して実装されたオープンな SOCKET の例は見たことがありません。私が話している 20,000 ~ 50,000 のクライアント接続は、C++ での開発の状況を指します。この場合、使用する必要がある基本テクノロジには、メモリ プール、クエリ アルゴリズムなどが含まれます。
疑似 IOCP が達成できる最大接続数を確認するための情報はありません。知っている人がいれば、議論してください。また、上記のデータの多くは、私自身が試したわけではない情報から抜粋したものです。高性能なサーバープログラムには、どの機種を使うかだけでなく、メモリ処理やアルゴリズムなど、細かい部分まで気を配る技術が必要になると思います。ソフトウェアコストの点でのみ、ハードウェアへの投資が確実に発生します。