Question

Je fais appel 5 serveurs externes pour récupérer des données XML pour chaque demande d'une page web particulière sur mon serveur IIS 6. présent volume est compris entre 3-5 requêtes entrantes par seconde, ce qui signifie 15-20 requêtes sortantes par seconde.

99% des demandes sortantes de mon serveur (le client) vers les serveurs externes (le serveur) fonctionne bien, mais environ 100-200 par jour finissent avec « L'opération a expiré » exception.

Cela suggère que j'ai un problème de ressources sur mon serveur - une pénurie de sockets, ports, etc ou un verrou de fil, mais le problème avec cette théorie est que les échecs sont tout à fait au hasard - il n'y a pas un certain nombre de demandes en ligne qui tous échouent - et deux des serveurs externes représentent la majorité des échecs

.

Ma question est de savoir comment puis-je diagnostiquer davantage ces exceptions pour déterminer si le problème est sur ma fin (le client) ou à l'autre bout (les serveurs)?

Le volume des demandes d'un analyseur évite de devoir mettre sur le fil - il serait très difficile de saisir ces quelques exceptions. Je CONNECTIONS et FILETS reset dans mon machine.config et le code de base ressemble à:

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

Toutes les suggestions?

Était-ce utile?

La solution

Vous avez dit que vous faites 5 demande sortante pour chaque requête entrante à la page ASP. Est-ce que 5 serveurs différents, ou le même serveur?

vous n'attendez la demande précédente de remplir, avant d'émettre le prochain? Est-ce le délai d'attente passe alors qu'il est en attente d'une connexion, ou lors de la demande / réponse?

Si le délai d'attente se produit lors de la demande / réponse, cela signifie que le serveur cible est sous contrainte. La seule façon de savoir si tel est le cas, est d'exécuter Wireshark / netmon sur l'une des machines, et regardez la trace réseau pour voir si la demande de l'application est même ce qui en fait vers le serveur, et si elle est de savoir si le serveur cible est de répondre dans le délai donné.

Si cela est un problème de la famine de fil, puis l'une des façons de poser un diagnostic est d'attacher débogueur windbg.exe au processus W3wp.exe, lorsque vous commencez à obtenir délai. Chargez ensuite l'extension de débogage sos.dll. Et exécutez la commande! Threads, suivi par commande threadpool!. Il vous montrera combien de fils de travailleurs et les fils du port d'achèvement sont utilisés / restants. Si les fils de #completionport ou threads de travail sont faibles, alors qui contribuera au délai d'attente.

Vous pouvez surveiller les compteurs ASP.NET et System.net perf. Voir si la file d'attente de demande ASP.NET augmente de façon monotone -. Cela pourrait indiquer que vos demandes sortantes ne remplissent pas assez vite

Désolé, il n'y a pas de réponses faciles ici. Il y a beaucoup de pistes, vous aurez besoin d'explorer. Si je vous, je voudrais commencer par windbg.exe attacher à W3WP lorsque vous commencez à obtenir des délais d'attente et faire ce que je l'ai décrit plus haut.

Autres conseils

Par défaut, HttpWebRequest vous limite à 2 connexions par HTTP / 1.1 serveur. Donc, si vos demandes prendre du temps, et vous avez des demandes entrantes qui font la queue sur le serveur, vous serez à court de connexion et ainsi obtenir les délais d'attente.

Vous devez modifier les connexions sortantes max sur ServicePointManager.

ServicePointManager.DefaultConnectionLimit = 20 // or some big value.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top