如何诊断“操作已超时”HttpException

时间:2010-03-10 17:25:53

标签: vb.net httpwebrequest asp.net-3.5 httpexception

我正在调用5个外部服务器来检索IIS 6服务器上特定网页的每个请求的基于XML的数据。当前卷在每秒3-5个传入请求之间,这意味着每秒15-20个传出请求。

从我的服务器(客户端)到外部服务器(服务器)的99%的传出请求都可以正常工作,但每天大约100-200,最终会出现“操作超时”异常。

这表明我的服务器上存在资源问题 - 套接字,端口等缺少或线程锁定但是这个理论的问题是故障完全是随机的 - 连续的请求没有多少都失败了 - 两个外部服务器占了大部分失败。

我的问题是如何进一步诊断这些异常,以确定问题是在我的端(客户端)还是在另一端(服务器)?

请求量排除了将分析仪置于线路上 - 捕获这些少数异常非常困难。我在machine.config中重置了CONNECTIONS和THREADS,基本代码如下:

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 个答案:

答案 0 :(得分:2)

默认情况下,HttpWebRequest将每个HTTP / 1.1服务器限制为2个连接。因此,如果您的请求需要一段时间才能完成,并且您有在服务器上排队的传入请求,那么您将失去连接,从而导致超时。

您应该更改ServicePointManager上的最大传出连接。

ServicePointManager.DefaultConnectionLimit = 20 // or some big value.

答案 1 :(得分:0)

你说你正在为ASP页面的每个传入请求做5个传出请求。是5个不同的服务器,还是同一个服务器?

在发出下一个请求之前,您是否等待上一个请求完成?是否在等待连接或请求/响应期间发生超时?

如果在请求/响应期间发生超时,则表示目标服务器处于压力之下。找出是否是这种情况的唯一方法是在其中一台机器上运行wireshark / netmon,并查看网络跟踪以查看来自应用程序的请求是否甚至通过服务器,如果它是,目标服务器是否在给定的超时内响应。

如果这是一个线程饥饿问题,那么诊断它的一种方法是在开始超时时将windbg.exe调试器附加到w3wp.exe进程。然后加载sos.dll调试扩展。然后运行!threads命令,然后运行!threadpool命令。它将显示使用/剩余的工作线程数和完成端口线程数。如果#completionport线程或工作线程很低,那么这将导致超时。

或者,您可以监视ASP.NET和System.net perf计数器。查看ASP.NET请求队列是否单调增加 - 这可能表示您的传出请求未能足够快地完成。

抱歉,这里没有简单的答案。这是您需要探索的很多途径。如果我是你,我会首先将windbg.exe附加到w3wp,当你开始获得超时并执行我之前描述的操作时。