Как мы можем устранить неустойчивые ошибки «Существующее соединение было принудительно закрыто», вызванные Cisco CSS - PullRequest
9 голосов
/ 06 августа 2010

У нас есть «стандартная» трехуровневая архитектура с нашим средним уровнем, размещенным в IIS и доступным через .net remoting.Эти ошибки возникают между нашими веб-серверами и серверами веб-служб (первый уровень), которые подключаются к серверам приложений (средний уровень).Мы получим эту ошибку 3-10 раз в день из общего числа вызовов ~ 130K за день.

Исключение и трассировка стека всегда выглядят примерно так:


Exception Type: System.Net.WebException
Message: The underlying connection was closed: An unexpected error occurred on a receive.

Server stack trace: 
   at System.Runtime.Remoting.Channels.Http.HttpClientTransportSink.ProcessResponseException(WebException webException, HttpWebResponse& response)
   at System.Runtime.Remoting.Channels.Http.HttpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream)
   at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at XXXXX.BusinessFacade.Interface.XXXXInterface.SubmitXXXX(
   at XXX.XXXXWebServicesLibrary.XXXXService.CreateXXXXXX.RunXXXXMethod()
   at XXX.XXXXWebServicesLibrary.XXXXService.XXXXXXMethod`2.RunMethod()
   at XXX.XXXXWebServicesLibrary.XXXXXWebMethod`2.Run()HandleReturnMessage()
Inner Exception: 

Exception Type: System.IO.IOException
Message: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead)Read()
Inner Exception: 

Exception Type: System.Net.Sockets.SocketException
Message: An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)Receive()

Нет конкретного удаленного вызова, который бы вызывал это, это может быть любой из них, который, по-видимому, исключает какую-либо конкретную причину приложения.Единственным общим знаменателем является часть сообщения об ошибке «Тип исключения: System.Net.Sockets.SocketException: Существующее соединение было принудительно закрыто удаленным хостом» .

Фронт ипромежуточные уровни разделены межсетевым экраном, и мы также используем устройство VIP.Я сильно подозреваю, что проблема с конфигурацией нашей сети / брандмауэра, но наши сетевые парни просто ломают голову и не предлагают никаких предложений.

Хотя частота отказов 0,003% может показаться незначительной, у нас есть партнеры, которые очень внимательно изучают наши коммуникацииосторожно, и я просто жду, пока это станет проблемой, которую они заметят.Я не хочу говорить «я не знаю», когда наступит это время.

Есть ли у кого-нибудь какие-либо идеи о том, как я мог бы предоставить больше информации или какие-либо предложения, которые я мог бы сделать нашим сетевым парням, чтобырешить эту проблему?

Ответы [ 3 ]

7 голосов
/ 16 апреля 2011

Проблема была в Cisco CSS.Мы определили это, направив серверы уровня 1 непосредственно на серверы уровня 2 и проработав 48 часов, не наблюдая за проблемой.После того, как мы определили, что это был CSS, мы исправили эту проблему, настроив безумно низкое значение по умолчанию для этого параметра:

"Тайм-ауты неактивности потока по умолчанию в секундах для порта TCP или UDP. Если поток простаиваетв течение времени, указанного в значении тайм-аута, CSS разрывает поток и возвращает ресурсы потока. "

Мы установили это значение в 84 (что составляет 84 16-секундных приращения).Так как значение по умолчанию для HTTP составляет 120 секунд, значение по умолчанию было слишком низким.

2 голосов
/ 23 февраля 2011

Это может быть сетевой компонент, вызывающий это.Чтобы исключить это, поместите обе машины (или тестовые машины) в одну подсеть, затем запустите нагрузочный тест и убедитесь, что вы не получите ту же ошибку.

Другие вещи, которые могутпричиной может быть:

  • Тайм-аут, попробуйте увеличить значения тайм-аута
  • Слишком большой размер сообщения, попробуйте увеличить разрешенный размер сообщения, а также размер запроса, разрешенный в IIS
  • Возможно, вы достигли некоторого максимального значения, такого как максимальное количество вызовов или максимальное количество подключений, см. http://msdn.microsoft.com/en-us/library/ee377061(v=bts.10).aspx
2 голосов
/ 21 февраля 2011

Чтобы проверить утилизацию пула приложений, перейдите в IIS и откройте Свойства пула приложений, в котором работает служба удаленного взаимодействия. Вы можете настроить повторное использование пулов приложений, используя временной интервал, количество запросов или определенное время.

Вы можете удалить текущие правила утилизации и установить время переработки, когда не ожидается никаких подключений, например 3,00 ночью. Затем посмотрите, не возникнут ли исключения.

...