Pergunta

Eu estou chamando 5 servidores externos para recuperar dados baseados em XML para cada solicitação para uma página especial no meu servidor IIS 6. volume de presente está entre 3-5 solicitações de entrada por segundo, ou seja, 15-20 pedidos de saída por segundo.

99% das solicitações de saída do meu servidor (o cliente) para os servidores externos (o servidor) trabalho OK, mas cerca de 100-200 por dia acabar com um "A operação expirou" exceção.

Isto sugere que tenho um problema de recursos no meu servidor - alguns escassez de tomadas, portas etc ou um bloqueio de segmento, mas o problema com esta teoria é que as falhas são totalmente aleatória - não há um número de pedidos em uma linha que todos falham -. e dois dos servidores externos são responsáveis ??pela maioria das falhas

A minha pergunta é como posso diagnosticar mais essas exceções para determinar se o problema é no meu fim (o cliente) ou do outro lado (os servidores)?

O volume de pedidos opõe-se colocando um analisador no fio - seria muito difícil para capturar estas poucas exceções. I têm conexões de reset e Tópicos no meu machine.config e os olhares de código básicas como:

Dim hRequest As HttpWebRequest
Dim responseTime As String
Dim objWatch As New Stopwatch

Try

  ' calculate time it takes to process transaction
  objWatch.Start()

  hRequest = System.Net.WebRequest.Create(url)
  ' set some defaults
  hRequest.Timeout = 5000
  hRequest.ReadWriteTimeout = 10000
  hRequest.KeepAlive = False ' to prevent open HTTP connection leak
  hRequest.SendChunked = False
  hRequest.AllowAutoRedirect = True
  hRequest.MaximumAutomaticRedirections = 3
  hRequest.Accept = "text/xml"
  hRequest.Proxy = Nothing 'do not waste time searching for a proxy 
  hRequest.ServicePoint.Expect100Continue = False

  Dim feed As New XDocument()
  ' use *Using* to auto close connections
  Using hResponse As HttpWebResponse = DirectCast(hRequest.GetResponse(), HttpWebResponse)
    Using reader As XmlReader = XmlReader.Create(hResponse.GetResponseStream())
      feed = XDocument.Load(reader)
      reader.Close()
    End Using
    hResponse.Close()
  End Using

  objWatch.Stop()
  ' Work here with returned contents in "feed" document
  Return XXX' some results here

Catch ex As Exception

  objWatch.Stop()
  hRequest.Abort()
  Return Nothing

End Try

Todas as sugestões?

Foi útil?

Solução

Você disse que você está fazendo 5 solicitação de saída para cada solicitação de entrada para a página ASP. É que 5 servidores diferentes, ou mesmo servidor?

Você aguardar o pedido anterior para concluir, antes de emitir o próximo? É o tempo limite acontecendo enquanto ele está aguardando uma conexão, ou durante o pedido / resposta?

Se o tempo limite está acontecendo durante o pedido / resposta, em seguida, isso significa que o servidor de destino está sob stress. A única maneira de descobrir se esse é o caso, é para executar wireshark / netmon em uma das máquinas, e olhar para o rastreamento de rede para ver se o pedido do aplicativo está mesmo fazendo isso até o servidor, e se é, se o servidor de destino é responder dentro do tempo limite determinado.

Se esta é uma questão fio fome, em seguida, uma das formas de diagnosticar é para anexar depurador windbg.exe ao processo de w3wp.exe, quando você começa a ficar timeout. Em seguida, carregar a extensão de depuração sos.dll. E execute o comando! Tópicos, seguido por! Threadpool comando. Ele irá mostrar-lhe como muitos segmentos de trabalho e threads de porta de conclusão são utilizados / restante. Se os fios #completionport ou segmentos de trabalho são baixos, em seguida, que irá contribuir para o tempo limite.

Como alternativa, você pode monitorar ASP.NET e System.net perf contadores. Veja se a fila de solicitações ASP.NET está aumentando monotonamente -. Isso pode indicar que os seus pedidos de saída não está completando rápido o suficiente

Desculpe, não há respostas fáceis aqui. Há uma série de pistas que você vai precisar para explorar. Se eu fosse você, eu iria começar anexando windbg.exe para w3wp quando você começar a receber tempos de espera e fazer o que eu descrevi anteriormente.

Outras dicas

Por padrão, HttpWebRequest limita a 2 conexões por servidor HTTP / 1.1. Assim, se seus pedidos levam tempo para ser concluída, e você tem pedidos de entrada na fila no servidor, você vai ficar sem conexão e, assim, obter o tempo limite.

Você deve alterar as conexões de saída max em ServicePointManager.

ServicePointManager.DefaultConnectionLimit = 20 // or some big value.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top