Asp.net IIS7集成管道:maxConcurrentRequestsPerCPU和requestsQueueLimit设置之间的交互

Asp.net IIS7集成管道:maxConcurrentRequestsPerCPU和requestsQueueLimit设置之间的交互,asp.net,iis,iis-7,asp.net-2.0,integrated-pipeline-mode,Asp.net,Iis,Iis 7,Asp.net 2.0,Integrated Pipeline Mode,首先,这里对IIS7 HTTP请求生命周期和影响性能的各种设置进行了概述: 非常具体地说,在dotNet 4中,maxConcurrentRequestsPerCPU和requestsQueueLimit的默认值设置为5000。例如,相当于:(在aspnet.config中): (**见下文注) 在我看来,在多CPU/核心服务器上,这里的requestQueueLimit总是在“perCPU”限制之前被调用。因此,如果每个CPU最多需要5000个请求,那么我希望requestQueueLi

首先,这里对IIS7 HTTP请求生命周期和影响性能的各种设置进行了概述:

非常具体地说,在dotNet 4中,maxConcurrentRequestsPerCPUrequestsQueueLimit的默认值设置为5000。例如,相当于:(在aspnet.config中):


(**见下文注)
在我看来,在多CPU/核心服务器上,这里的requestQueueLimit总是在“perCPU”限制之前被调用。因此,如果每个CPU最多需要5000个请求,那么我希望requestQueueLimit需要增加到5000*CPUCount,或者干脆全部禁用

我的解释正确吗?如果是,我可以禁用requestQueueLimit吗?(将其设置为零?)。关于此设置的文档似乎没有解决此问题(因此可能我遗漏了什么或误读了什么?)


**上面文章的旁注:requestQueueLimit的名称不好。它实际上限制了ASP.NET可以同时服务的最大请求数。这包括排队的请求和正在执行的请求。如果“Requests Current”(请求当前)性能计数器超过requestQueueLimit(请求队列限制),则新传入的请求将被拒绝,状态代码为503)

您可能需要检查应用程序的源代码。IIS tuner是一个开源应用程序,它优化IIS设置以获得更好的性能。另一方面,这一页可能对你们的问题有用。

***我的解释正确吗

是的,如果要同时执行5000多个请求,则需要增加requestQueueLimit。requestQueueLimit限制系统中的请求总数。由于其遗留问题,它实际上是系统中的请求总数,而不是某个队列中的请求数。它的目标是防止服务器因缺少物理内存、虚拟内存等而崩溃。当达到限制时,传入的请求将收到快速的503“服务器太忙”响应。顺便说一下,“ASP.NET\requests current”性能计数器会显示系统中当前的请求数

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

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


顺便说一下,看起来v4中有一个bug。对于集成模式,只有在aspnet.config文件中将requestQueueLimit的值配置为时,才会成功读取该值。出于某种原因,在我不久前进行试验时,v4没有从machine.config读取它。

我已经请Thomas(您所指文章的作者)对此发表评论。谢谢。也许你能为我澄清最后一点。如果进行中的请求总数超过requestQueueLimit,则客户端会收到“503服务器太忙”-OK。如果maxConcurrentRequestsPerCPU超过/before/requestQueueLimit,我是否也会得到503?也就是说,它们是否都在请求处理生命周期的同一点上或多或少地控制请求的数量?从我所读到的内容来看,这是IIS和ASP.NET如何发展的遗留问题。如果在requestQueueLimit之前超过maxConcurrentRequestsPerCPU,则不会得到503。如果在requestQueueLimit之前超过maxConcurrentRequestsPerCPU,则请求将添加到队列中。一旦其中一个执行请求完成,它将立即退出队列。在集成模式下,全局队列是本机结构。从一开始…HTTP接收请求并发布到IIS CP。IIS在CP线程上接收请求并调用ASP.NET。如果未超过requestQueueLimit,ASP将调用QUWI发布到CLR TP。本机回调(在webengine.dll中)在CLR工作线程上拾取请求,我们将maxConcurrentRequestsPerCPU*CPUCount与活动请求总数进行比较。若我们已经超过了限制,那个么请求将插入全局队列(本机代码)。否则,它将被执行。如果它已排队,则当一个活动请求完成时,它将退出队列。感谢Thomas,这非常有用。我们还对minFreeThreads设置感到惊讶,我认为它不再适用于集成管道-是否有类似的设置,我们应该设置或使用其他方法,或者我们不必担心线程耗尽?我猜在这个阶段,maxConcurrentRequestsPerCPU应该设置为/低于/maxWorkerThreads,以确保有足够的线程来处理每个请求。但是,默认值是maxConcurrentRequestsPerCPU=5000,maxWorkerThreads要低得多(我认为是100或250)。minFreeThreads设置适用于经典模式。集成模式类似于maxConcurrentThreadsPerCPU,在集成模式下默认禁用(即值为0)。如果您想继续,请将此讨论转到我的博客。默认设置适用于大多数人,但不是所有人。这取决于你在做什么。理想情况下,我们会自动调整,但我们还没有做到。
<system.web>
   <applicationPool 
      maxConcurrentRequestsPerCPU="5000" 
      maxConcurrentThreadsPerCPU="0" 
      requestQueueLimit="5000" /> (** see note below)
</system.web>