Como diagnosticar “a operação expirou” HttpException
-
19-09-2019 - |
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?
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.