Как диагностировать "истекло время ожидания операции" HttpException - PullRequest
3 голосов
/ 10 марта 2010

Я звоню 5 внешним серверам для получения данных на основе XML для каждого запроса определенной веб-страницы на моем сервере IIS 6. Текущий объем составляет 3-5 входящих запросов в секунду, что означает 15-20 исходящих запросов в секунду.

99% исходящих запросов от моего сервера (клиента) к внешним серверам (серверу) работают нормально, но около 100-200 в день заканчиваются исключением "Тайм-аут операции".

Это говорит о том, что у меня есть проблема с ресурсами на моем сервере - некоторая нехватка сокетов, портов и т. Д. Или блокировка потока, но проблема этой теории заключается в том, что сбои являются совершенно случайными - в строке не существует ряда запросов все сбой - и два внешних сервера составляют большинство отказов.

У меня вопрос, как я могу дополнительно диагностировать эти исключения, чтобы определить, является ли проблема на моем конце (клиент) или на другом конце (серверы)?

Объем запросов не позволяет подключить анализатор к сети - было бы очень трудно уловить эти несколько исключений. Я сбросил CONNECTIONS и THREADS в моем machine.config, и основной код выглядит так:

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

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 15 марта 2010

По умолчанию HttpWebRequest ограничивает вас двумя подключениями на сервер HTTP / 1.1. Таким образом, если для выполнения ваших запросов требуется время, а у вас есть очередь входящих запросов на сервере, у вас закончится соединение и, таким образом, вы получите тайм-ауты.

Вы должны изменить максимальное количество исходящих соединений в ServicePointManager.

ServicePointManager.DefaultConnectionLimit = 20 // or some big value.
0 голосов
/ 30 марта 2010

Вы сказали, что делаете 5 исходящих запросов для каждого входящего запроса на страницу ASP. Это 5 разных серверов или один и тот же сервер?

Вы ждете завершения предыдущего запроса, прежде чем отправить следующий? Происходит ли таймаут во время ожидания соединения или во время запроса / ответа?

Если тайм-аут происходит во время запроса / ответа, это означает, что целевой сервер находится под нагрузкой. Единственный способ выяснить, так ли это, состоит в том, чтобы запустить wireshark / netmon на одной из машин и посмотреть трассировку сети, чтобы узнать, поступает ли запрос из приложения на сервер и есть, отвечает ли целевой сервер в течение заданного времени ожидания.

Если это проблема с истощением потока, то один из способов диагностики - подключить отладчик windbg.exe к процессу w3wp.exe, когда вы начинаете получать тайм-аут. Затем загрузите расширение отладки sos.dll. И запустите команду! Threads, а затем команду! Threadpool. Он покажет вам, сколько рабочих потоков и потоков портов завершения используется / осталось. Если количество потоков #completionport или рабочих потоков низкое, это приведет к увеличению времени ожидания.

Кроме того, вы можете контролировать счетчики перфектов ASP.NET и System.net. Посмотрите, увеличивается ли очередь запросов ASP.NET монотонно - это может означать, что ваши исходящие запросы не выполняются достаточно быстро.

Извините, здесь нет простых ответов. Есть много путей, которые вы должны будете исследовать. На вашем месте я бы начал с прикрепления windbg.exe к w3wp, когда вы начнете получать тайм-ауты и будете делать то, что я описал ранее.

...