我打电话5个外部服务器来检索基于XML的数据用于为特定网页的每个请求我的IIS 6的服务器上。本体积是每秒传入请求3-5之间,这意味着每秒15-20传出请求。

从我的服务器(客户端)到外部服务器(服务器)的传出请求的99%的工作确定,但每天约100-200结束了一个“操作超时”异常。

这表明我有我的服务器上的资源问题 - 插座的一些不足,港口等或线程锁,但这一理论的问题是,故障是完全随机的 - 有没有连续请求的数目是全部失败 - 和两个外部服务器的占大多数失败的

我的问题是如何进一步诊断这些例外情况,以确定问题是否是我的结束(客户端),或在另一端(服务器)?

请求的体积将不让把一个分析器在电线上 - 这将是非常困难的捕捉这些少数例外。我在我的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

任何建议?

有帮助吗?

解决方案

你说,你这样做是为了每个进来的请求的ASP页面5发请求。那是5台不同的服务器,或在同一台服务器?

你等待前面的请求发出的下一个之前完成,?在超时发生时它正在等待连接,或请求/响应期间?

如果将超时请求/响应过程中发生,那么它意味着该目标服务器是在压力下。找出如果是这样的话,唯一的办法就是在一台机器上运行的wireshark /网络监视器,并期待在网络跟踪,看是否从应用程序的请求,甚至使其通过对服务器,如果它是,目标服务器是否是给定的超时时间内响应。

如果这是一个线程不足的问题,则诊断是附加WINDBG.EXE调试器W3wp.exe进程的方式之一,当你开始超时。然后加载sos.dll调试扩展。并运行!线程命令,接着!线程池命令。它会告诉你有多少工作线程和完成端口线程使用/剩余。如果#completionport螺纹或工作线程是低,则这将有助于超时。

可替换地,可以监视ASP.NET和System.net PERF计数器。若见ASP.NET请求队列是单调递增的 - 这可能表明您的传出请求都没有完成足够快

对不起,这里没有简单的答案。有很多你需要探索的途径。如果我是你,我会通过附加WINDBG.EXE当你开始得到超时,做我前面所述W3WP开始。

其他提示

默认情况下,限制的HttpWebRequest您/每HTTP 2个连接1.1服务器。所以,如果您的请求需要一段时间才能完成,你必须传入的请求在服务器上排队,你会用完的连接,从而获得超时。

您应该改变ServicePointManager最大传出连接。

ServicePointManager.DefaultConnectionLimit = 20 // or some big value.
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top