調査ができる限り、誰かが私たちの手助けをしてくれることを願っています。TCPソケットサーバがCLOSE_WAITを構築することがあります。動作しなくなるまで時間がたつにつれて
私たちは、ASP.NET Webアプリケーションからの接続を受け付け、メッセージを送信し、何らかの処理を行い(通常はDB以外のシステムに対しても)、応答を送信するC#で書かれた単純な非同期ソケットサーバーを持っています。クライアントに返します。クライアントは接続を閉じることを担当しています。
システムに長期間(通常は数日間)負荷がかかる場合、CLOSE_WAITソケットはサーバーのボックス(netstat -a)にプロセスが作成されない程度に蓄積されていましたそれ以上の接続は受け入れます。その時点でプロセスをバウンスさせなければならず、プロセスが再び実行されます。
私たちはASP.NETアプリケーションのいくつかの負荷テストを実行して問題を再現しようとしました(コードからのいくつかの問題を推測できなかったため)。私たちは、これを管理し、ソケットサーバのログでのSocketExceptionとしての地位を明示する問題のWireSharkのpacket traceになってしまったと思う:
System.Net.Sockets.SocketException:既存の接続が強制的に切断されましたSystem.Net.Sockets.Socket.BeginSend(バイト[]バッファのInt32オフセット、のInt32のサイズ、socketFlags socketFlags、AsyncCallbackコールバック、オブジェクトの状態)で、リモートホストは
Iから問題を再現しようとしました(ASP.NETアプリケーションと同じコードを使用して)ソケットサーバーに直接通話する単一のスレッドプロセスとしてのパケットトレースは不可能です。
私たちが間違っている可能性があることを、誰かが試してみてください。
ソケットは使用(..)ブロックの一部として閉じられますが、現時点ではシャットダウンと.Closeを明示的に実行していません。通常のテストでは問題はありません。サーバーは、私たちが見つけることができるすべてのコードパスで明示的に両方を行います(非同期なので複雑です)。 –
@Kieran - サーバープロセスをバウンスするとCLOSE_WAITがクリアされるという事実は、あなたがどこかで閉じていないことを示していると私は思う。 –