Frage

Ich rufe 5 externe Server XML-basierte Daten für jede Anforderung für eine bestimmte Webseite auf meinem IIS 6-Server abzurufen. Vorliegende Band ist zwischen 3-5 eingehende Anfragen pro Sekunde, was bedeutet, 15-20 ausgehende Anfragen pro Sekunde.

99% der ausgehenden Anfragen von meinem Server (der Client) an den externen Server (Server) arbeitet OK, aber etwa 100-200 pro Tag mit einem Ende Ausnahme „Der Vorgang hat timed out“.

Dies legt nahe, ich ein Ressourcenproblem auf meinem Server habe - einigen Mangel an Steckdosen, Anschlüsse usw. oder eine Gewindesicherung, aber das Problem mit dieser Theorie ist, dass die Ausfälle ganz zufällig sind - es gibt nicht eine Reihe von Anfragen in einer Reihe ist, dass alle scheitern - und zwei der externen Server-Konto für die Mehrheit der Ausfälle

.

Meine Frage ist, wie kann ich weiter diese Ausnahmen diagnostizieren, um zu bestimmen, ob das Problem an meinem Ende (der Client) oder am anderen Ende (der Server) ist?

Das Volumen der Anfragen verbiete einen Analysator auf dem Draht setzen - es wäre sehr schwierig, diese wenige Ausnahmen zu erfassen. Ich habe Reset CONNECTIONS und THREADS in meinem machine.config und der grundlegende Code wie folgt aussieht:

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

Irgendwelche Vorschläge?

War es hilfreich?

Lösung

für jede eingehende Anforderung an die ASP-Seite

Sie haben gesagt, Sie 5 abgehende Anforderung tun. Ist, dass 5 verschiedene Server oder demselben Server?

Haben Sie für die vorherige Anforderung warten zu vervollständigen, bevor Sie die nächste Ausgabe? Geschieht das Timeout, während es auf eine Verbindung wartet, oder während der Anforderung / Antwort?

Wenn das Timeout während der Request / Response geschieht dann bedeutet es, dass der Zielserver unter Stress. Der einzige Weg, um herauszufinden, ob dies der Fall ist, ist wireshark / netmon auf einem der Maschinen läuft, und sehen Sie die Netzwerkablaufverfolgung, um zu sehen, ob die Anforderung aus der App selbst ist damit auf den Server durch, und wenn es ist, ob der Zielserver innerhalb der gegebenen Zeitüberschreitung reagieren.

Wenn dies ein Thread Verhungern Problem ist, dann eine der Möglichkeiten, sie zu diagnostizieren sind windbg.exe Debugger anhängen Prozess w3wp.exe, wenn Sie immer Timeout starten. Dann laden Sie die sos.dll Debug-Erweiterung. Und führen Sie das! Themen Befehl, gefolgt von! Thread Befehl. Es wird Ihnen zeigen, wie viele Worker-Threads und Completion-Port-Threads verwendet werden / bleiben. Wenn die #completionport Fäden oder Worker-Threads niedrig sind, dann wird das zu dem Timeout beitragen.

Alternativ können Sie ASP.NET und System.net perf Indikatoren überwachen. Prüfen Sie, ob die ASP.NET-Anforderungswarteschlange ist monoton steigend -. Dies könnte darauf hindeuten, dass Ihre ausgehenden Anfragen nicht schnell genug abgeschlossen

Sorry, es gibt keine einfachen Antworten hier. Es gibt eine Menge von Möglichkeiten müssen Sie erkunden. Wenn ich Sie wäre, würde ich durch das Anbringen windbg.exe beginnen zu w3wp wenn starten Sie Timeouts bekommen und tun, was ich oben beschrieben.

Andere Tipps

In der Standardeinstellung HttpWebRequest begrenzt Sie 2 Verbindungen pro HTTP / 1.1-Server. Also, wenn Ihre Anfragen Zeit in Anspruch nehmen, und Sie haben eingehende Anfragen auf dem Server Schlange stehen, werden Sie aus der Verbindung laufen und somit Timeouts bekommen.

Sie sollten die max ausgehenden Verbindungen auf Servicepoint ändern.

ServicePointManager.DefaultConnectionLimit = 20 // or some big value.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top