2012-05-11 11 views
0

私はPHPでソケットサーバを構築しようとしましたが、PHPでマルチスレッド機能が不足しているため、サーバに接続がロードされていると300接続)、サーバーは非常に遅くなります。javaソケットサーバkeep aliveの実装

私はJavaに切り替えて、マルチスレッドのソケットサーバーを構築し、10秒で100接続で過負荷にしようとしました。それは勇敢にかかったと言わなければなりません。プロセス中に実際の速度が遅くなりましたが、サーバーは大丈夫だったように見えました。

私は同時に多くの接続を実行する必要があるサーバーを構築しているので、効率的にしようとしていて、ゴースト接続を開いたままにしないでください。

私は「Keep Alive」メソッドを実装しています。私の質問は以下の通りです: 私は600のオープンな接続が私のサーバで開かれていて、明らかにすべてのスレッド間でクライアントからのキープアライブメッセージを取得することさえできます。キープアライブメッセージが送信されたかどうかを確認する適切な時間は何でしょうか。 私は約2分のどこかに考えました。そのため、サーバーは忙しいと思っています。一方、私のクライアントはデータを頻繁に送信したくありません。 提案はありますか?

+0

ソケットごとにスレッドごとにブロッキングソケットを使用していますか?私は、あなたのために仕事をしている単一スレッドから離れて、アプリケーションのパフォーマンスを大幅に向上させる必要があるので、あなたのケースではjava.nioに切り替えることをお勧めします。 – Buchi

+0

あなたは私のサーバー側を意味しますか?もう少し詳しい情報を教えてもらえますか?今の私の主な機能のソケットを受け入れるとそれを処理する新しいスレッドを開始 –

+0

私はSocketChannelオブジェクトとServerSocketChannelオブジェクトについて読んだことがあります。 新しいスレッドが新しいタスク(読み込み、書き込みなど)がある場所でのみ開かれているので、より良いパフォーマンスが得られます。基本的にほとんどのスレッドは、それぞれのコードよりも同時に実行されますperfromへのタスクがあるかどうかにかかわらず、接続にスレッドがあります。これは正しいですか? –

答えて

0

600個の接続を開きます。 2分、120秒ごとにキープアライブが送信されると仮定すると、キープアライブを送信するために約5つのスレッドが1秒あたりに準備できることを意味します。すべての接続がアップしていると仮定すると、5つのスレッドは、ピアからのエコーを処理する直後にもう一度準備ができます。つまり、キープアライブをサポートするためには約10スレッド/秒の実行が必要です。

これはあまり重要ではありません。

クライアントがビジー状態の場合、これらのクライアントにキープアライブは送信されないため、クライアントがビジー状態になるとキープアライブのロードが低下します。

あなたはOKであるように聞こえます。

+0

私は、モバイルアプリケーションのためにクライアントからキープアライブを送信することを考えていました。そして、クライアントがサーバーから切断され、その逆行するチャンスが増えました。 何も新しいスレッドがない場合は、最後のキープアライブ以降どのくらいの時間が経過しているかをチェックし、クライアントを切断してスレッドを終了すると(そして新しいクライアントのメモリと帯域幅をクリーンアップする) –