2012-03-16 21 views
0

友達!!!スレッド接続によりシステムが遅くなりますか?

私はGPSデバイス追跡ソフトウェアに取り組んでいます。我々はJava TCPリスナを介して私たちのサーバと通信する約3000のデバイスを持っています。デバイスとの接続が確立されると、デバイスとの接続が切断されることはありません。接続を再度作成するには時間がかかるためです。

TCPリスナーを実行すると、CPU使用率が99%向上し、システムが不安定になります。 A. TCPリスナーをJavaに書き込んで、3000個のデバイスに対して3000を超えるスレッド接続を処理できるようにします。 B. CPU使用率を最小限に抑えるためです。

ありがとうございます。

答えて

1

Aが間違った方法であり、Bに関係しています。無限にスケーラブルなホストファームでサーバーを実行しない限り、着信要求を処理するスレッドは作成しないでください。どのような接続方法を念頭に置いているのかは言及していませんが、一般的に正しい方法は、一定の(小さな)一定量のスレッドを使用するサーバーを設計することですそれらを、CPU時間をまったく消費しないI/O-bound asynchronous operationsによって提供してください。

+0

親愛なるポール、返信ありがとうございます。しかし、私たちのTCPサーバーと通信している3000 GPSデバイスがあり、一度に1つのスレッドを作成してすべての着信要求を処理することはできません。私はどのようにすべての要求を処理するサーバーを設計することができ、高性能でなければなりませんkn0wしてください。 – geekIndiana

+0

Huch、このコメントビューで説明するのは難しい...一般的なルールは次のとおりです。システムがI/Oを実行している間にCPU時間を費やさず、要求データを処理するためにCPU時間を費やすだけです。私は.NETのishの答えを避けようとしましたが、私はできません:そこには、I/Oにバインドされた各リソースに、BeginX/EndXのメソッドがあります。例えば ​​'Socket'は、I/Oサブシステム要求が処理されるまで待っている間にCPU時間を消費しない' BeginReceive/EndReceive'と 'BeginSend/EndSend'プロトコルを提供します。 @ D.Shawleyさんの答えがあなたの正しい道を指していないのですか? –

+0

親愛なるポール、私はMINAが役立つかどうかはわかりません。私たちのデバイスはパケットを別のフォーマットで送信し、MINAはエンドキャラクタフォーマットがデータを処理することを期待しています。だから私は確信していない、私は私の聴取者がすべての着信要求を読むことができる必要があります期待しています。ありがとう – geekIndiana

0

The C10K Problemを読んでください。いくつかのJava固有のメモについては、herehereを参照してください。

JavaのノンブロッキングIOレイヤーを使用して、大きな接続負荷を処理したいとします。 JDK 1.4.2のドキュメントは良い出発点です。

+1

親愛なるShawley、私たちはNIOライブラリであるため、この目的のためにapache MINAプロジェクトを使用できますか? – geekIndiana

+0

@ user405575はい、MINAはこの種の問題を処理するように設計されています。 – erickson