【发布时间】:2011-11-13 23:30:40
【问题描述】:
我只是想在这里澄清一些概念。如果有人愿意分享他们在这方面的专业知识,我们将不胜感激。
以下是我对 IIS 如何与线程相关的工作的理解,如果我错了,请纠正我。
HTTP.sys
据我了解,对于 IIS 6.0(我将暂时离开 IIS 7.0),Web 浏览器发出请求,被 HTTP.sys 内核驱动程序接收,HTTP.sys 将其交给 IIS 6.0 的线程池(I/O 线程?)等释放自身。
IIS 6.0 线程/线程池
IIS 6.0 的线程返回将其交给 ASP.NET,ASP.NET 将临时 HSE_STATUS_PENDING 返回给 IIS 6.0,这样可以释放 IIS 6.0 线程,然后将其转发给 CLR 线程。
CLR 线程/线程池
当 ASP.NET 在 CLR 线程池中获取空闲线程时,它会执行请求。如果没有可用的 CLR 线程,它会在应用程序级队列中排队(性能很差)
所以基于之前的理解,我的问题如下。
-
在同步模式下,这是否意味着每 1 个 CLR 线程有 1 个请求?
*) 如果是这样,在 1 个 CPU 上可以处理多少个 CONCURRENT 请求?还是我应该反过来问?每 1 个 CPU 如何允许 CLR 线程?比如说,允许 50 个 CLR 线程,这是否意味着它在任何给定时间都被限制为 50 个请求?使困惑。
如果我将“processModle”配置中的“requestQueueLimit”设置为 5000,这究竟意味着什么?您可以在应用程序队列中排队 5000 个请求吗?那真的不是很糟糕吗?既然应用程序队列的性能很差,为什么还要设置这么高呢?
如果您正在编程异步页面,那么在上述过程中它究竟从哪里开始受益?
我研究发现,默认情况下,IIS 6.0 的线程池大小为 256。5000 个并发请求进来,由 256 个 IIS 6.0 线程处理,然后 256 个线程中的每一个都将其交给 CLR 线程我猜默认情况下甚至更低。这本身不是异步的吗?有点困惑。另外,同步模式下瓶颈在何时何地开始出现?并在异步模式下? (不确定我是否有任何意义,我只是感到困惑)。
当 IIS 线程池(全部 256 个)忙时会发生什么?
当所有 CLR 线程都忙时会发生什么? (我假设所有请求都在应用程序级队列中排队)
当应用程序队列超过 requestQueueLimit 时会发生什么?
非常感谢您的阅读,非常感谢您在这方面的专业知识。
【问题讨论】:
标签: asp.net performance iis threadpool