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?

È stato utile?

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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top