2011-12-19 12 views
0

私はネットワーク上のさまざまなコンピュータを追跡する既存のサーバーアプリケーションを持っています。場合によっては、ネットワークに最大6000台のコンピュータを追跡する必要があります。トラッキングには、コンピュータの電源が入っていることを知るだけです。場合によっては、サーバーは処理および処理が必要なメッセージをクライアントに返送します。C#ソケットサーバー - 最大容量と一般的な質問

私はWCFを試しましたが、大量の負荷を非常に上手く処理していないようです(クライアントの1200-2000の範囲に近づくとCPU使用率がかなり高くなります)。また、WCFでは、クライアントにメッセージを取得するための「プッシュ」の代わりに、「プル」メカニズムを使用する必要があります(つまり、クライアントがサーバーにメッセージを要求します)。私は、低レベルのTCPソケット通信に切り替えることを考えていますが、私は何を期待するかは分かりません。これはこの質問についてです。

ので:

1 - どのように多くのクライアント、私はに接続し、私のサーバーへの接続を維持できることを期待できますか? 2 - この接続が、クライアントがまだオンラインであるかどうかをサーバーに知らせ、サーバーから非常に時折のメッセージを送信するために使用されていると仮定すると、CPU/RAM/TCPポート/ etc)をサーバ上で使用していますか?

おかげ

+0

あなたのネットワークはLANですか、あるいはあなたはオーバーレイスタイルのネットワークについて(インターネット上で)話していますか? –

+0

LANの99%の時間です。これは顧客に販売される製品です。 – bugfixr

答えて

0

は似たような状況のように聞こえるものの中に許可される接続の理論上の最大数に関するthis bytes.com questionを見てみましょう。それはあなたのデザインとよく混合した場合、あなたはおそらくローカルLAN環境でTCP上のUDPを使用して恩恵を受けるだろうと述べ

The magic setting you're looking for is "MaxUserPort". You can google this, 
then make the appropriate registry change. 

The value is typically set at 5000, and if you want lots and lots of client 
connections then you need to bump the value up. 

最も関連があると思わ応答があります。私は個人的にC#でこれに関するベンチマークを実行していませんが、C++で10,000個以上のUDPクライアントをサポートしており、問題はほとんどありませんでした(そして巨大なボックス)。

+0

私はその2つの違いの専門家ではありませんが、UDPはTCPより信頼性が低いと思われます。つまり、パケットが失われてもそれは気にしません。 UDP over TCPを使用するとどうなりますか? – bugfixr

+0

@bugfixr - もちろんUDP **はTCPよりも信頼性が低い可能性がありますが、オーバーヘッドがはるかに少なく、あなたのクライアントを追跡することもありません(あなたの努力で遭遇する問題の一部を緩和します) )。小規模なLAN環境では、私はUDPが非常に信頼できると判断しました。それを超えるものであれば、信頼性を確保するためにUDP上でアプリケーションプロトコルを実装する必要があります。 –

2

1 - サーバーに接続して接続できるクライアントはいくつありますか?

5000はまったく問題ではありません。

2 - この接続は、クライアントがまだオンラインになっているかどうかをサーバーに知らせるだけで、サーバーから非常に時折のメッセージを送信するために使用されると仮定すると、 CPU/RAM/tcpポート/ etc)をサーバ上で使用していますか?

「多」を定義します。開いているTCP接続はリソースを消費します。しかし、最大のリソースはBeginReceiveで使用しているbyte[]バッファです。しかし、それが32768バイト大きいと仮定しましょう。それは約163Mbの合計です。メモリは安いですね。

CPU使用量は、アイドル接続はCPUを使用しません。

0

本当に多くの接続を開いておく必要がありますか?

永続的な接続が必要なワークステーションの「追跡」が必要なためではありません。あなたは、あなたが示唆したように、クライアントが一定の間隔で接続してポーリングするようにすることができます。構造的にHTTPに似ているものWebサーバーがサーバーのニーズに合っていても、ポーリング対象のクライアントはすべてと考えられます。できるだけ短く接続を開いたままにしておけば、それほど重要ではありません。このアプローチをリラックスしたポーリングタイムアウトと組み合わせると、1台のサーバーで「追跡」された6000台のワークステーションを簡単にカバーできます。

メッセージングインフラストラクチャを検討することもできます。サーバーはコマンドキューにコマンドを送り、コマンドを受け取ったクライアントは応答キューで応答します。

UDPは後者を実装する方法として考えられますね。しかし、あなたはもっと仕事をしなければならないでしょう...

+0

6000個のオープンtcp接続を持つことがサーバーに負担になることを示唆していますか? WCF(btw、私は現在WCFを使って記述しているので、彼らはポーリングしてオンラインですが、サーバーは2000 +クライアント数でうまく処理しません)。 – bugfixr

+0

問題の時間的な次元について本当に話したことはありません。あなたが述べたように、問題は2000年のクライアントの閾値の周りから始まります。しかし、毎秒2000要求、または2000の永続的(オープン)接続について話していますか?後者は、各クライアントを特定のタイムアウトで接続、ポーリング、切断することで簡単に解決できます。タイムアウトが高いほど、「同時」クライアントの量が多くなります。 –

関連する問題