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