Come diagnosticare “l'operazione è scaduta” HttpException
-
19-09-2019 - |
Domanda
che io chiamo 5 server esterni per recuperare i dati basati su XML per ogni richiesta per una particolare pagina web sul mio server IIS 6. Volume presente è tra 3-5 richieste in ingresso al secondo, il che significa 15-20 richieste in uscita al secondo.
99% delle richieste in uscita dal mio server (client) ai server esterni (il server) funziona male, ma circa 100-200 al giorno finisce con un'eccezione "L'operazione è scaduta".
Questo suggerisce Ho un problema di risorse sul mio server - alcuni carenza di prese, porte ecc o un blocco filo, ma il problema di questa teoria è che i fallimenti sono del tutto casuale - non ci sono un numero di richieste di fila che tutti falliscono - e due dei server esterni rappresentano la maggior parte dei fallimenti
.La mia domanda è come posso diagnosticare ulteriormente queste eccezioni per determinare se il problema è il mio fine (il client) o sull'altra estremità (i server)?
Il volume di richieste impossibilità di mettere un analizzatore sul filo - sarebbe molto difficile da catturare queste poche eccezioni. Ho Connessioni ripristinate e fili nella mia machine.config e il codice di base si presenta così:
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
Qualche suggerimento?
Soluzione
Hai detto che si sta facendo 5 richiesta in uscita per ogni richiesta in arrivo alla pagina ASP. È che 5 diversi server, o lo stesso server?
DO di attendere la precedente richiesta di completare, prima di emettere il prossimo? È il timeout accadendo mentre è in attesa di una connessione, o durante la richiesta / risposta?
Se il timeout sta accadendo durante la richiesta / risposta, allora vuol dire che il server di destinazione è sotto stress. L'unico modo per scoprire se questo è il caso, è quello di eseguire Wireshark / Netmon su una delle macchine, e guardare la traccia di rete per vedere se la richiesta l'applicazione è anche fare attraverso il server, e se è, se il server di destinazione è la risposta all'interno del data timeout.
Se questo è un problema filo fame, poi uno dei modi per diagnosticare è allegare debugger windbg.exe a w3wp.exe processo, quando si avvia sempre timeout. Poi caricare l'estensione sos.dll debug. Ed eseguire il comando! Discussioni, seguito dal comando di ThreadPool!. Essa vi mostrerà come vengono utilizzati molti thread di lavoro e le discussioni di porta di completamento / rimanente. Se i fili #completionport o thread di lavoro sono bassi, quindi che contribuiranno al timeout.
In alternativa, è possibile monitorare e ASP.NET System.net perf contatori. Vedere se la coda di richieste ASP.NET è in aumento monotono -. Questo potrebbe indicare che le vostre richieste in uscita non stanno completando abbastanza veloce
Siamo spiacenti, non ci sono risposte facili qui. C'è un sacco di strade che dovrete esplorare. Se fossi in te, vorrei iniziare, allegando windbg.exe a w3wp quando si avvia sempre timeout e fare ciò che ho descritto in precedenza.
Altri suggerimenti
Per impostazione predefinita, HttpWebRequest si limita a 2 connessioni per HTTP / Server 1.1. Quindi, se le vostre richieste prendere tempo per completare, e si dispone di richieste in entrata in coda sul server, si esaurirà di collegamento e quindi ottenere timeout.
Si dovrebbe modificare le connessioni in uscita max su ServicePointManager.
ServicePointManager.DefaultConnectionLimit = 20 // or some big value.