ASP.NET IIS - 请求何时排队



Thomas Marquardt 的以下文章介绍了 IIS 如何处理 ASP.Net 请求、可配置为运行的最大/最小 CLR 工作线程/托管 IO 线程、所涉及的各种请求队列及其默认大小。

现在,根据本文,IIS 6.0 中会出现以下情况:

    ASP.NET 从 IIS IO 线程
  1. 获取请求,并将"HSE_STATUS_PENDING"发布到 IIS IO 线程
  2. 请求被移交给 CLR 工作线程
  3. 如果请求具有高延迟并且所有线程都被占用(线程计数接近 httpRuntime.minFreeThreads),则请求将发布到应用程序级别请求队列(此队列是每个 AppDomain 的)
  4. 此外,ASP.NET 检查并发执行的请求数。文章指出,"如果并发执行的请求数太高",它将传入请求排队到 ASP.NET 全局请求队列(这是每个工作进程)(请检查更新 2)

我想知道什么是"阈值",此时 ASP.NET 认为当前执行它的请求数过高,然后开始将请求排队到全局 ASP.NET 请求队列?

我认为此阈值将取决于最大工作线程数的配置,但可能有一些公式,ASP.NET 将根据该公式确定并发执行的请求数过高并开始将请求排队到 ASP.NET 全局请求队列。这个公式可能是什么?或者此设置是否可配置?


更新
我再次通读了这篇文章,在评论部分我发现了这个:

1) 在 IIS 6 和 IIS 7 经典模式下,每个应用程序 (AppDomain) 有一个队列,用于维护辅助角色的可用性 线程。如果请求数增加,则此队列中的请求数增加 的可用工作线程数低于指定的限制 httpRuntime minFreeThreads. 当限制由 httpRuntime appRequestQueueLimit 超出,请求是 被拒绝并显示 503 状态代码,客户端收到 带有消息"服务器太忙"的 HttpException。 还有一个 ASP.NET 性能计数器"应用程序队列中的请求", 指示队列中的请求数。 是,CLR 线程 pool 是由 .NET ThreadPool 类公开的那个。

2)requestQueueLimit的名称很差。 它实际上限制了 ASP.NET 可以处理的最大请求数 同时。 这包括排队的请求和 正在执行的请求。 如果"请求当前"性能 计数器超过请求队列限制,新的传入请求将被 拒绝,并显示 503 状态代码。

因此,本质上requestQueueLimit限制了排队的请求数(我假设它将在应用程序队列中排队的请求数加上全局 ASP.Net 请求队列加上当前正在执行的请求数相加)。尽管这并不能回答原始问题,但它确实提供了有关我们何时可能由于大量并发请求/高延迟请求而收到 503 服务器繁忙错误的信息。(检查更新 2)


更新 2我在理解上有一个错误。我混淆了IIS 6和IIS 7的描述。
实质上,当 ASP.NET 以集成模式承载在 IIS 7.5 和 7.0 上时,应用程序级队列不再存在,ASP.NET 维护全局请求队列。
因此,如果认为执行的请求数很高,IIS 7/7.5 将开始将请求排队到全局请求队列。这个问题更适用于 IIS 7/7.5 而不是 6。

IIS 6.0 而言,没有全局 ASP.NET 请求队列,但以下情况是正确的:
1. ASP.NET 从 IIS IO 线程获取请求并将"HSE_STATUS_PENDING"发布到 IIS IO 线程
2. 请求被移交给 CLR 工作线程
3. 如果请求具有高延迟并且所有线程都被占用(线程计数接近 httpRuntime.minFreeThreads),则请求将发布到应用程序级请求队列(此队列是每个应用程序域)
4. 此外,ASP.NET 在接受新请求之前检查排队和当前正在执行的请求数。如果此数字大于 processModel.requestQueueLimit 指定的值,则传入的请求将被拒绝,并显示 503 服务器繁忙错误。

本文可能有助于更好地理解设置。

minFreeThreads:如果可用线程数在 线程池低于此设置的值。此设置 有效地限制可并发运行的请求数 maxWorkerThreads minFreeThreads.将 minFreeThreads 设置为 88 * # of 中央处理器。这会将并发请求数限制为 12(假设 maxWorkerThreads 是 100)。

编辑:

在这篇SO文章中,Thomas提供了集成管道中请求处理的更多详细信息和示例。请务必阅读答案上的评论以获取其他解释。

本机回调(在 webengine.dll 中)在 CLR worker 上获取请求 线程,我们将 maxConcurrentRequestsPerCPU * CPUCount 与总数进行比较 活动请求。如果我们超出限制,则会插入请求 全局队列(本机代码)。否则,它将被执行。如果是 已排队,当其中一个活动请求完成时,它将取消排队。

最新更新