【问题标题】:ASP.NET IIS - when are requests queued?ASP.NET IIS - 请求何时排队?
【发布时间】:2012-06-07 10:22:14
【问题描述】:

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

现在根据文章,在 IIS 6.0 中发生以下情况:

  1. ASP.NET 从 IIS IO 线程获取请求并将“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 全局请求队列。这个公式可能是什么?或者这个设置是可配置的?


更新
我再次通读了这篇文章,在 cmets 部分我发现了这一点:

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

2) requestQueueLimit 命名不当。它实际上限制了 ASP.NET 可以处理的最大请求数 同时。这包括排队的请求和 正在执行的请求。如果“请求当前”性能 计数器超过 requestQueueLimit,新的传入请求将被 以 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 Worker 线程
3.如果请求延迟高且所有线程都被占用(线程数接近httpRuntime.minFreeThreads),则将请求发布到应用程序级请求队列(此队列是每个AppDomain)
4. 此外,ASP.NET 在接受新请求之前检查排队和当前正在执行的请求数。如果此数字大于 processModel.requestQueueLimit 指定的值,则传入的请求将被拒绝,并出现 503 服务器繁忙错误。

【问题讨论】:

  • 我添加到问题中的更新使问题与 IIS 7/7.5 的相关性可能降低。并且更新确实提供了有关 IIS 6.0 的答案
  • 您链接到的文章说阈值由 MaxConcurrentRequestsPerCPU 确定。你有理由不相信这是事实吗?

标签: asp.net multithreading iis iis-6


【解决方案1】:

This article 可能有助于更好地理解设置。

minFreeThreads:如果可用线程数,工作进程使用此设置将所有传入请求排队 线程池低于此设置的值。这个设置 有效地限制了可以同时运行的请求数 maxWorkerThreads minFreeThreads。将 minFreeThreads 设置为 88 * # of CPU。这将并发请求的数量限制为 12(假设 maxWorkerThreads 为 100)。

编辑:

在这个SO post 中,Thomas 提供了集成管道中请求处理的更多细节和示例。请务必阅读答案中的 cmets 以获得更多解释。

本机回调(在 webengine.dll 中)获取 CLR 工作人员的请求 线程,我们将 ma​​xConcurrentRequestsPerCPU * CPUCount 与总数进行比较 主动请求。如果我们超过了限制,请求被插入 全局队列(本机代码)。否则,它将被执行。如果它是 排队,当其中一个活动请求完成时,它将出列。

【讨论】:

  • 是的,在 IIS 6.0 中可以。我还提到了一个问题:如果请求具有高延迟并且所有线程都被占用(线程数接近httpRuntime.minFreeThreads),那么请求被发布到应用程序级请求队列(这个队列是每个AppDomain)跨度>
猜你喜欢
  • 1970-01-01
  • 2012-05-14
  • 2012-12-14
  • 2014-02-12
  • 1970-01-01
  • 2011-06-16
  • 2014-10-18
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多