3

MMORPG サーバーとまったく同じように、多くの同時接続を行うサーバーに最適なソケットベースのモデルを知る必要があります。

c10k について読みましたが、たとえばサーバーで一度に 5000 クライアントしか許可されない場合、何を使用すればよいですか? ブロックソケット、スレッド化 (クライアントごとに 1 つのスレッド)? ノンブロッキングソケット、ノンスレッド? わずか数スレッドですべてのクライアントを処理するループ? IOCP?

要するに、長所と短所は何ですか?私はすでにグーグルで検索しましたが、これらすべてのモデルに関する具体的な「対」記事は見つかりませんでした。

または、c10k の問題を処理する簡単な方法はありますか?

プラットフォーム: Windows XP

4

4 に答える 4

4

個人的には、IOCP ベースの設計を使用することをお勧めしますが、クライアント用の高性能サーバーを開発するために何年も使用してきた IOCP ベースのフレームワークを使用しているので、それをお勧めします。

私は最近、Windows で利用可能な他のモデルよりも IOCP を好む理由のいくつかをまとめまし

多くの場合、「複雑さ」は IOCP を回避する理由として挙げられますが、正直なところ、「接続ごとのスレッド」以外のことをしている場合、コードはとにかくかなり複雑になります。サンプル サーバーを含む C++ コードの無料セットを用意しています。これは、すべての IOCP 作業を行います。サーバーのサンプルは、独自のコードの出発点として適しています。ここから入手できます。

また、無料の (非営利目的の) プラグ可能なサーバー プラットフォームもあります。興味があるかもしれません。WASP を使用すると、いくつかの特定のエントリ ポイントを含む dll を作成するだけで、ネットワーク関連の作業はすべて私が行います。ダウンロードについてはこちらを、チュートリアルについてはこちらを参照してください。

最も重要なことである IMHO でどのモデルを決定する場合でも、DAY 0 からパフォーマンスと負荷のテストを開始することです。これにより、ターゲット ハードウェアでサポートできる同時接続数を把握し、不適切な設計上の決定をすばやく見つけることができます。これが落ちる原因です。サーバーの同時実行性を浪費するのは簡単です。詳細については、こちらを参照してください。

Jay が ENet について言及して以来、私は、IOCP ベースの ENet サーバーが標準の Enet クライアント コードでうまく機能することを発見しました。ただし、ENet はピア ツー ピア プロトコルとして設計されているため、サーバーで使用しようとするといくつかの課題があることに注意してください。標準の ENet コードでは、基本的に単一のスレッド化されたネットワーク ポンプがあり、IOCP から得られるスケーラビリティと比較することはできません。ENet プロトコル処理コードを最初から書き直して、非同期 I/O と IOCP で動作するようにしましたが、これは重要な作業量です。私は現在、最新の ENet プロトコルをベースとして使用するこのコードの新しいバージョンを作成しています。うまくいけば、2011 年初頭に利用可能になり、多数の同時接続サーバーの状況で使用される標準の ENet コードとの完全なパフォーマンス比較が可能になります。

于 2010-11-11T10:07:51.050 に答える
1

サーバーと対話する方法の決定は、クライアントがデータを送信する方法、送信されるデータのタイプ、予想される転送速度、およびトラフィックパターンに大きく依存します。

たとえば、人々が仮想講堂に集まって音楽を再生できるゲームを作成している場合、基本的には大量のストリーミングを行っています。

マルチプレイヤーのpacmanを使用している場合は、方向が変わったときに小さなパケットを送信できるため、一定ではありませんが、バースト性があります。

次に、パケットの順序を保証する必要があるかどうか、および送信されるすべてのパケットが配信される重要性を決定できます。その場合、TPCまたはUDPを確認する必要があります。(http://www.skullbox.net/tcpudp.php

5000クライアントをサポートする場合は、メモリの量によっては、その数のスレッドを使用することでパフォーマンスの問題が発生する可能性がありますが、さらに重要なのは、コアの数とCPUの負荷が高いことですが、それは可能性が高いです。パフォーマンスキラー。

select()次に(http://www.lowtek.com/sockets/select.html )を見ると、負荷を処理するスレッドの数が少なくなりますが、ストリーミングしている場合は、専用スレッドの方が理にかなっています。

したがって、シナリオによっては両方が役立つ可能性があるため、どちらが最適かを判断する方法は、作成しているゲームのタイプによって異なります。

于 2010-11-11T00:14:10.763 に答える
0

ReadFile と WriteFile を使用して、IOCP とソケット I/O (単純な I/O) を使用する必要があります。

コードは、I/O 完了の待機、完了のコンテキストの読み込み、処理、および完了を待機できる新しい I/O の生成に集中する必要があります。

あなたのサービス コード (C を使用するコンテキストではそう思います) はマルチスレッド化する必要がありますが、コアの数よりも多くのスレッドを使用することはできません。

I/O 完了ポートのコストはほとんどかかりません。これは、スレッド数が少ない場合にも当てはまります。したがって、ビットを十分に迅速に実行できる場合、NT エンジンが処理できる I/O 完了の数に制限はありません。インターネット接続が最初に飽和状態になる可能性があります。

于 2010-12-07T16:05:11.990 に答える
0

この記事を読みましたか?

同様の調査を行ったところ、eNetライブラリが見つかりました。新しいメソッドの代わりに Select() を使用していると思いますが、それで非常に良い結果が得られたことを示す多くのユーザーがいます。それだけ多くの同時接続がどうしても必要な場合は、変更するのは難しくありません。

于 2010-11-10T23:17:10.517 に答える