IIS7集成管线:maxConcurrentRequestsPerCPU和requestsQueueLimit设置之间的交互作用

12

首先,这里有一份关于IIS7 HTTP请求生命周期以及各种影响性能的设置的优秀概述:

ASP.NET Thread Usage on IIS 7.0 and 6.0

具体来说,在dotNet 4中,默认值maxConcurrentRequestsPerCPUrequestsQueueLimit都设置为5000。例如:(在aspnet.config中):

<system.web>
   <applicationPool 
      maxConcurrentRequestsPerCPU="5000" 
      maxConcurrentThreadsPerCPU="0" 
      requestQueueLimit="5000" /> (** see note below)
</system.web>

在我看来,在多CPU/核服务器上,请求队列限制(requestQueueLimit)将始终在'perCPU'限制之前被调用。因此,如果实际上您想要每个CPU的最大请求数为5000,则我期望需要将requestQueueLimit增加到5000 * CPUCount或完全禁用它。

我的理解正确吗?如果是这样,我可以禁用requestQueueLimit吗?(将其设置为零?)。关于此设置的文档似乎没有解决这个问题(所以也许我错过了什么或者误读了?)

**以上文章中的旁注:requestQueueLimit命名不当。它实际上限制了ASP.NET能够并发服务的最大请求数。这包括排队的请求和正在执行的请求。如果“当前请求”性能计数器超过requestQueueLimit,则新的进入请求将被拒绝,并返回503状态码。


我已经请教了Thomas(您所指的帖子的作者)对此发表评论。 - David Ebbo
2个回答

13

***我理解的正确吗?

是的,如果您想同时执行超过5000个请求,则需要增加requestQueueLimit。 requestQueueLimit限制了系统中请求总数。由于其历史遗留问题,它实际上是系统中请求的总数,而不是某个队列中的请求数。它的目的是防止服务器因缺乏物理内存、虚拟内存等而倒塌。当达到限制时,传入的请求将收到快速的503“服务器过于繁忙”的响应。顺便说一下,“ASP.NET\Requests Current”性能计数器公开了系统中当前请求的数量。

***我可以禁用requestQueueLimit吗?(将其设置为零?)

您可以通过将其设置为一个大值(例如50000)来有效地禁用它。您必须在aspnet.config文件中设置该值,我怀疑您的服务器可以处理50000个并发请求,但如果可以,请将其加倍。将其设置为零将无法禁用它...奇怪的是,这意味着最多只能同时执行一个请求。

顺便说一下,在v4中似乎存在一个bug。对于集成模式,仅在aspnet.config文件中按MSDN所述配置requestQueueLimit时,它才能成功读取该值。出于某种原因,在我之前的一些实验中,v4未从machine.config中读取它。


谢谢您。也许您可以为我澄清一个最后的问题。如果正在处理的总请求数超过requestQueueLimit,则客户端会收到“503服务器太忙”的响应 - 好的。如果在requestQueueLimit之前超过maxConcurrentRequestsPerCPU,我是否也会收到503?也就是说,在请求处理生命周期的大致相同点上,它们都限制了请求数量吗?根据我所读的内容,这是IIS和ASP.NET演变的遗留问题。 - redcalx
1
如果在请求队列限制之前超过了maxConcurrentRequestsPerCPU,您将不会收到503错误。如果在请求队列限制之前超过了maxConcurrentRequestsPerCPU,则该请求将被添加到队列中。它将在执行请求之一完成后立即出队。 - Thomas
抱歉,仍然不是100%清楚...我从您的博客中得到的印象是,如果maxConcurrentRequestsPerCPU * CPUCount大于maxWorkerThreads * CPUCount,则CLR ThreadPool队列将排队请求。因此,我假设ThreadPool Q /是/您在博客中提到的全局Q。看起来您是在说除了ThreadPool Q之外还有另一个队列(IIS6遗留问题)? - redcalx
1
在集成模式下,全局队列是本地结构。从开始...HTTP接收请求并发布到IIS CP。IIS在CP线程上拾取请求并调用ASP.NET。如果未超过requestQueueLimit,则ASP调用QUWI发布到CLR TP。本机回调(在webengine.dll中)在CLR工作线程上拾取请求,我们将maxConcurrentRequestsPerCPU * CPUCount与总活动请求进行比较。如果超过限制,则将请求插入全局队列(本机代码)。否则,它将被执行。如果已排队,则将在其中一个活动请求完成时出队。 - Thomas
1
谢谢Thomas,这非常有用。我们也在想minFreeThreads设置是否仍适用于集成管道 - 是否应该设置类似的设置或方法,或者我们不必担心线程耗尽?我猜测,在这个阶段,maxConcurrentRequestsPerCPU应该被设置/降低/以确保为每个请求处理充足的线程。然而,默认值是maxConcurrentRequestsPerCPU=5000,而maxWorkerThreads要低得多(我认为是100或250)。 - redcalx
1
minFreeThreads设置适用于经典模式。 集成模式的类比是maxConcurrentThreadsPerCPU,默认情况下在集成模式下禁用(即值为0)。 如果您想继续讨论,请转到我的博客。 默认设置适用于大多数人,但并非所有人。 这取决于你在做什么。 理想情况下,我们会自动进行调整,但我们还没有达到那个水平。 - Thomas

2

您可能希望查看此应用程序的源代码。IIS调谐器是一款开源应用程序,可优化IIS设置以获得更好的性能。另一方面,此页面可能对您的问题有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接