-2

私はサーバー クライアント (クライアントは私が作成し、同僚は別の言語でサーバーを作成しました) アプリケーションを作成しました。900 以上のクライアント (すべての個々の TCP クライアント) をサーバーに接続しようとすると、次の例外が発生します。

No connection could be made because the target computer actively refused it.

ソケット エラー: 10061

WSAECONNREFUSED

接続拒否。ターゲット コンピュータがアクティブに拒否したため、接続できませんでした。これは通常、外部ホストで非アクティブなサービス、つまりサーバー アプリケーションが実行されていないサービスに接続しようとしたことが原因です。

最終的に、十分に長く待つと、それらはすべて TCP ソケットの上に接続されます (独自の再接続/キープアライブを作成したため)。したがって、失敗した場合は、成功するまで単純に再試行します。

サーバーが「過負荷」になっていて、すべてのリクエストを一度に処理できないため、このエラーが発生しますか (個別のスレッドでそれぞれ 900 のクライアントを作成しているため、ほぼすべてが同時に接続しようとしています)。

これに対抗する方法はありますか?TCP Socket オプションを微調整して、より多くのクライアントを一度に処理できるようにすることはできますか? サーバーとクライアントを同じマシンで実行していることにも注意してください。異なるマシンで実行すると、エラーメッセージの数が減るようです。これが、サーバーがそれらすべてをそれほど高速に処理できないため、これがある種の容量の問題であると私が考える理由です。

4

1 に答える 1

1

サーバーが「過負荷」になっていて、すべてのリクエストを一度に処理できないため、このエラーが発生しますか (個別のスレッドでそれぞれ 900 のクライアントを作成しているため、ほぼすべてが同時に接続しようとしています)。

はい、それは正気ではありません (900 個の個別のスレッドを作成する場合、使用してスレッド プールを作成しConcurrentQueue、キューを制限する必要があります)!

を使用してバックログの数を増やすことができSocket.Listen(backlog);ます。ここで、バックログは保留中の接続キューの最大長です。バックログ パラメータは、オペレーティング システムに応じて異なる値に制限されます。より高い値を指定できますが、バックログはオペレーティング システムに基づいて制限されます。

これに対抗する方法はありますか?TCP Socket オプションを微調整して、より多くのクライアントを一度に処理できるようにすることはできますか?

この場合ではありません (ここではすでに 900 リクエストです)。しかし、一般的には -はいSocket.Listen(backlog)、バックログが少ない他のケースでは、より多くのバックログを提供します。また、(.NET ランタイム環境によって既に管理されている) 接続プールと、スレッドを順番に処理するための ConcurrentQueue を使用します。ただし、OS によって制限されている数を超えるバックログを提供することはできないことに注意してください。単純なマシンには 900 は多すぎます。

サーバーとクライアントを同じマシンで実行していることにも注意してください。異なるマシンで実行すると、エラーメッセージの数が減るようです。

負荷が 2 つの異なるマシンに分散されているためです。しかし、それでも自分がしていることを試してはいけません。スレッドを(順番に)管理するConcurrentQueueを作成します。

于 2016-08-29T15:34:30.070 に答える