Como podemos solucionar problemas de erros intermitentes “uma conexão existente foi fechada à força” causados ​​por um Cisco CSS

StackOverflow https://stackoverflow.com/questions/3426885

Pergunta

Temos a arquitetura "padrão" de três camadas com nosso nível intermediário hospedado no IIS e acessado via .NET Remoting. Esses erros ocorrem entre nossos servidores da Web e Web Services (camada frontal) que estão removidos para os servidores de aplicativos (camada média). Recebemos esse erro de 3 a 10 vezes ao dia das ~ 130 mil chamadas totais no dia.

A exceção e o rastreamento da pilha sempre se parecem com isso:


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()

Não existe uma chamada remota específica que faça com que isso aconteça, pode ser qualquer um deles que parece descartar qualquer tipo de causa específica do aplicativo. O único denominador comum é o "Tipo de exceção: System.net.sockets.socketexception Mensagem: Uma conexão existente foi fechada à força pelo host remoto "parte do erro.

As camadas frontal e médio são separadas por um firewall e também estamos utilizando um dispositivo VIP. Suspeito fortemente de um problema com nossa configuração de rede/firewall, mas nossos caras da rede estão apenas arranhando a cabeça e não oferecendo sugestões.

Embora uma taxa de falha de 0,003% possa parecer insignificante, temos parceiros que examinam nossas comunicações com muito cuidado e estou apenas esperando que isso se torne um problema que eles percebem. Não quero dizer "não sei" quando chegar a hora.

Alguém tem alguma idéia de como eu poderia fornecer mais informações ou sugestões que eu poderia fazer aos nossos caras da rede para resolver isso?

Foi útil?

Solução

O problema era o Cisco CSS. Determinamos isso apontando os servidores de nível 1 diretamente para os servidores de nível 2 e passando 48 horas sem observar o problema. Depois que determinamos que eram o CSS, corrigimos esse problema ajustando o valor padrão incrivelmente baixo para este parâmetro:

"Tempo limite de inatividade do fluxo padrão, em segundos, para a porta TCP ou UDP. Se um fluxo estiver ocioso para a quantidade de tempo especificado no valor do tempo limite, o CSS rasga o fluxo e recupera os recursos de fluxo".

Definimos isso para 84 (que são 84 incrementos de 16 segundos). Como o Keep-alive padrão para HTTP é de 120 segundos, o valor padrão era muito baixo.

Outras dicas

Para verificar a reciclagem do pool de aplicativos, vá para o seu IIS e abra as propriedades do pool de aplicativos no qual seu serviço remoto está em execução. Você pode configurar a reciclagem de pools de aplicativos usando um intervalo de tempo, número de solicitações ou definir horários específicos.

Você pode remover as regras atuais de reciclagem e definir uma reciclagem para um momento em que nenhuma conexão é esperada, como 3,00 à noite. Então veja se as exceções permanecem.

Pode ser um componente de rede causando isso. A maneira de descartar isso seria colocar as duas máquinas (ou máquinas de teste) na mesma sub -rede, depois executar um teste de carga e verificar se você não recebe o mesmo erro.

As outras coisas que poderiam estar causando isso:

  • Um tempo limite, tente aumentar os valores do tempo limite
  • Tamanho da mensagem muito grande, tente aumentar o tamanho da mensagem permitida, também tamanho da solicitação permitida no IIS
  • Você pode estar atingindo algum valor máximo, como chamadas máximas ou conexões máximas, consulte: http://msdn.microsoft.com/en-us/library/ee377061(v=bts.10).aspx
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top