Надеюсь, кто-то может помочь нам, поскольку мы достигаем, насколько далеко может пойти расследование!
У нас есть простой асинхронный сервер сокетов, написанный на C #, который принимает соединения от веб-приложения ASP.NET, отправляет сообщение, выполняет некоторую обработку (обычно в отношении БД, но и в других системах), а затем отправляет ответ обратно. клиенту. Клиент отвечает за закрытие соединения.
У нас были проблемы, когда в течение длительного периода времени (обычно дней) система находилась под большой нагрузкой, сокеты CLOSE_WAIT накапливались на сервере (netstat -a) до такой степени, что процесс не принял любые дальнейшие связи. В этот момент мы должны отослать процесс, и он снова запускается.
Мы попытались запустить несколько нагрузочных тестов нашего приложения ASP.NET, чтобы попытаться воспроизвести проблему (поскольку вывести некоторую проблему из кода было невозможно). Мы думаем, что справились с этим и в результате получили пакетную трассировку WireShark проблемы, которая проявляется как исключение SocketException в журналах сервера сокетов:
System.Net.Sockets.SocketException: существующее соединение было принудительно закрыто удаленным хостом
в System.Net.Sockets.Socket.BeginSend (буфер Byte [], смещение Int32, размер Int32, SocketFlags socketFlags, обратный вызов AsyncCallback, состояние объекта)
Я пытался воспроизвести проблему из трассировки пакетов как однопоточный процесс, напрямую общающийся с сокетным сервером (используя тот же код, что и приложение ASP.NET), и не могу.
Кто-нибудь получил какие-либо предложения о следующих вещах, чтобы попробовать, проверить или очевидные вещи, которые мы можем делать неправильно?