7

比較的少数のノード (16 から 24 ですが、将来的にはさらに処理する必要があります) が同時に接続しようとすると、ソケット サーバーへの着信クライアント ソケット接続が拒否されるという問題が発生しています。

いくつかの詳細:

  • サーバーが Windows 2008 または 7 で実行されている
  • メインサーバーは ServerSocket を使用して Java で記述されています
  • クライアントも、データ センターのグリッド ノードで実行されている Windows です。

グリッドでテストを実行しようとすると、クライアント ノードはサーバーに接続して 40 ~ 100K のパケットを送信し、接続を切断しようとします。16 ~ 24 ノードを使用すると、クライアント接続がサーバーに接続できないという問題が発生し始めます。この設定では、最大 16 ~ 24 の同時クライアント接続を処理しようとして失敗する可能性がありますが、これはまったく正しくないように思えます。

メイン サーバー ループは通常の SocketServer をリッスンしており、接続を取得すると、接続を処理する新しいスレッドを生成し、すぐに戻ってソケットをリッスンします。また、着信データを単純に読み取って破棄するダミーの python サーバーと、データをダンプする前にログに記録する C++ サーバーもあり、どちらもクライアントが接続できないという同じ問題を経験しており、以前に成功したクライアント接続の数がわずかに異なります。失敗が始まります。これにより、この問題で特定のサーバーに問題はなく、おそらく環境に問題があると考えるようになりました.

私たちが最初に考えたのは、ソケットの TCP バックログを増やすことでした。これは、非常に高いレベルにプッシュしても問題を軽減しませんでした. Java SocketServer のデフォルトは 50 で、処理できるよりもはるかに低い値です。

同じサブネット上のマシン間でテストを実行し、FW がサーバーへの接続をレート制限している場合に備えて、マシン上のすべてのローカル ファイアウォールを無効にしました。失敗。

サーバーを実行している Windows マシンでネットワークの調整を試みました。

  • TimedWaitDelay を減らしますが、効果はありません (そして、私の Python テストでは、そのテストは数ミリ秒しか実行されないため、そうすべきではありません)。
  • MaxUserPort を 65000 前後の大きな値に増やしますが、効果はありません (私の Python テストが 240 メッセージしか送信しないことを考えると、これは奇妙です。したがって、このタイプの制限に近づくことさえあるはずです)。
  • TcpNumConnection を大きな値に増やします (正確な数を思い出せません)。繰り返しますが、一度に 24 を超える接続を持つべきではないため、これが制限になることはありません。
  • メッセージのバックログを動的に増加させる「動的バックログ」機能を開始します。最大接続数を 2000 接続に設定し、最小接続数を 1000 に設定したと思いますが、効果はありません。繰り返しますが、Python は 240 を超える接続を行うべきではないため、動的バックログをアクティブにすることさえすべきではありません。
  • 上記に加えて、TCP ポートの Windows の「自動調整」を無効にします。繰り返しますが、効果はありません。

Windows が受信接続の数を何らかの形で制限しているように感じますが、より多くの接続を許可するために何を変更すればよいかわかりません。接続レートを制限するネットワーク上のエージェントの考えも、真実ではないようです。同時接続数が物理的な GB ネットワークを過負荷にしている可能性は非常に低いです。

私たちは困惑しています。他の誰かがこのような問題を経験し、解決策を見つけましたか?

4

3 に答える 3

1

ほとんどの場合、OS によって制限されています。システム ログに4226エラー メッセージが表示されますか?

Windows では、同時接続試行の数が (私が思うに) 10 接続/秒に制限されています - OS のバージョンによって異なります (サーバーのバージョンの値は最大 50 です)。

それを解消するには、次の 2 つの方法があります。

  • system32/drivers の tcpip.sys を 16 進エディタで直接編集します - 冗談です :)

  • [HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Lanmanserver \Parameters\MaxMpxCt (デフォルト = 10 コマンド) エントリを編集してみてください。

そのパラメータを設定できないバージョンを使用している場合は、この修正プログラムを試すこともできます。

OS が使用する TCB の最大数、動的ポート割り当てのポート範囲など、さまざまなことを試すこともできますが、これらの値は必要に応じて十分高い値です。

于 2013-12-03T10:22:52.437 に答える
1

TCP 接続の TIME_WAIT 状態にある接続の数を確認します。多くの接続が開いたり閉じたりして TIME_WAIT が原因でソケットが枯渇するため、この種の問題が発生しました。それを確認するには、次を実行します。

netstat -a
于 2013-07-04T19:46:07.193 に答える