Pregunta

Estoy llamando a 5 servidores externos para recuperar datos basados en XML para cada petición de una página web en particular en mi IIS 6 servidor.El presente volumen es entre 3-5 solicitudes entrantes por segundo, lo que significa 15-20 saliente de solicitudes por segundo.

El 99% de las solicitudes salientes de mi servidor (el cliente) a los servidores externos (el servidor) funcionan bien, pero entre 100 y 200 por día termina con un "La operación ha agotado el tiempo" de excepción.

Esto sugiere tengo un problema de recursos en mi servidor - algunos escasez de enchufes, puertos etc o un hilo de bloqueo, pero el problema con esta teoría es que los fracasos son completamente al azar - no hay un número de solicitudes en una fila que no todos - y dos de los servidores externos de la cuenta para la mayoría de los fracasos.

Mi pregunta es ¿cómo puedo obtener diagnóstico de estas excepciones para determinar si el problema está en que mi final (el cliente) o en el otro extremo (los servidores)?

El volumen de solicitudes que se opone a poner un analizador en el cable - sería muy difícil para la captura de estas pocas excepciones.He restablecer las CONEXIONES y ROSCAS en mi máquina.config y el código básico parece:

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

Alguna sugerencia?

¿Fue útil?

Solución

Usted ha dicho que usted está haciendo 5 petición de salida para cada solicitud entrante a la página ASP. Es que 5 servidores diferentes, o el mismo servidor?

qué esperas para la solicitud anterior para completar, antes de emitir el siguiente? Está pasando el tiempo de espera mientras se está a la espera de una conexión, o durante la petición / respuesta?

Si el tiempo de espera está sucediendo durante la petición / respuesta, entonces significa que el servidor de destino está bajo estrés. La única manera de saber si este es el caso, es ejecutar Wireshark / netmon en una de las máquinas, y mirar a la traza de red para ver si la solicitud de la aplicación está aún por lo que es a través del servidor, y si es, si el servidor de destino es responder dentro del tiempo de espera determinado.

Si esto es un problema de hambre hilo, a continuación, una de las formas de diagnosticar es adjuntar depurador windbg.exe a W3WP.exe proceso, cuando comienza a recibir tiempo de espera. Luego cargar la extensión sos.dll depuración. Y ejecutar el comando hilos!, Seguido por el comando de subprocesos!. Se le mostrará cómo se utilizan los diversos subprocesos de trabajo y los hilos de puerto de finalización / restante. Si los hilos #completionport o subprocesos de trabajo son bajos, entonces, que contribuirá a la espera.

Como alternativa, puede supervisar los contadores de ASP.NET y System.net Potencia. A ver si la cola de solicitudes de ASP.NET está aumentando de forma monótona -. Esto podría indicar que sus solicitudes de salida no están completando lo suficientemente rápido

Lo sentimos, no hay respuestas fáciles aquí. Hay una gran cantidad de vías que se necesitan para explorar. Si yo fuera usted, me gustaría empezar de la fijación de windbg.exe a w3wp cuando comienza a recibir los tiempos de espera y hacer lo que he descrito anteriormente.

Otros consejos

Por defecto, HttpWebRequest se limita a 2 conexiones por servidor HTTP / 1.1. Por lo tanto, si sus peticiones de tener tiempo para completar, y usted tiene peticiones de entrada haciendo cola en el servidor, que se quedará sin conexión y así conseguir tiempos de espera.

Debe cambiar las conexiones de salida máximo en ServicePointManager.

ServicePointManager.DefaultConnectionLimit = 20 // or some big value.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top