我正在调用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
有什么建议吗?
答案 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,当你开始获得超时并执行我之前描述的操作时。