【发布时间】:2012-06-07 10:22:14
【问题描述】:
Thomas Marquardt 的 following 文章描述了 IIS 如何处理 ASP.Net 请求、可配置为运行的最大/最小 CLR 工作线程/托管 IO 线程、涉及的各种请求队列及其默认大小。
现在根据文章,在 IIS 6.0 中发生以下情况:
- ASP.NET 从 IIS IO 线程获取请求并将“HSE_STATUS_PENDING”发布到 IIS IO 线程
- 请求被移交给 CLR 工作线程
- 如果请求延迟高且所有线程都被占用(线程数接近 httpRuntime.minFreeThreads),则将请求发布到应用程序级请求队列(此队列是每个 AppDomain)
-
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