【发布时间】:2014-04-06 20:39:37
【问题描述】:
有什么方法可以检测到尝试的出站连接何时排队?
我们的 ASP.NET 应用程序向其他 Web 服务发出大量出站请求。最近我们遇到了主要的性能问题,对特定端点的调用需要几秒钟才能完成或超时。该服务的所有者没有看到任何性能问题。当我们分析网络流量时,我们看到确实,HTTP 请求正在及时完成。那时我们才发现我们的长等待时间和超时是由于连接排队造成的。
我们解决此问题的第一种方法是简单地增加允许到该端点的出站连接数,因此:
<system.net>
<connectionManagement>
<add address="http://some.endpoint.com" maxconnection="96" />
</connectionManagement>
</system.net>
这确实使我们对端点的调用大大中断了。但是,我们注意到这导致我们的整体入站请求需要更长的时间才能完成。就在那时我们遇到了Microsoft KB 821268。按照那里的“经验法则”指南,我们提出了这些额外的更改:
<processModel maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50"/>
<httpRuntime minFreeThreads="704" minLocalRequestFreeThreads="608"/>
这似乎修复了一切。我们对some.endpoint.com 的调用仍然很快,而且我们的响应时间也缩短了。
然而,几天后,我们注意到我们的网站性能不佳,并且我们看到一些 SQL Server 超时。我们的 DBA 没有发现服务器性能有任何问题,所以这看起来像是再次发生了类似的事情;我们想知道与some.endpoint.com 的连接增加是否导致其他 出站调用排队,可能是由于线程不足。
最糟糕的是,我们还没有找到一种很好的技术来明确地知道出站连接排队是否正在发生。我们所能做的就是观察我们发出请求和在应用程序中收到响应之间的时间。很难知道超时和长响应时间是否是由于排队造成的。
是否有任何有效的工具来衡量和调整出站请求限制?任何其他性能调整技巧肯定也会受到赞赏。
【问题讨论】:
-
你检查过相应的性能计数器吗:msdn.microsoft.com/en-us/library/70xadeyt.aspx
-
谢谢。
HttpWebRequest Average Queue Time在某些方面看起来很有希望。我希望包含的不仅仅是HttpWebRequest对象。 -
是否可以批量处理您的出站请求,而不是一个接一个地调用它们? http连接中最慢的部分通常是建立连接,这就是为什么我们有webgrease.codeplex.com之类的东西来捆绑css、js资源并发出1个请求来获取大资源,而不是多次请求小资源。
-
这篇文章 blogs.msdn.microsoft.com/ncl/2009/08/07/… 描述了 HttpWebRequests 的性能计数器。
标签: asp.net performance tcp iis-7.5 threadpool