如何诊断“操作超时” HttpException
-
19-09-2019 - |
题
我打电话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.