如何分配IIS7线程?

我将log4net添加到我的应用程序中,现在可以在浏览我的网站时看到用户活动的线程ID。 是否有任何特定的算法来解决IIS7中线程分配的问题,或者它只是一个随机数分配(我怀疑它不是完全随机的,因为我的低流量站点显示线程大多在10-30范围内)? 可用线程数的最大值是多少? 而且我注意到我的调度程序出现了一个奇怪的线程ID – 这有什么原因吗? 调度程序是Quartz.net,id显示为“Scheduler_Worker-10”,而不仅仅是一个数字。

这解释了您需要知道的一切。

摘录:

当ASP.NET以集成模式托管在IIS 7.0上时,线程的使用有点不同。 首先,应用程序级队列不再存在。 他们的表现总是非常糟糕,没有希望解决这个问题,所以我们摆脱了它们。 但也许最大的区别在于,在IIS 6.0或ISAPI模式下,ASP.NET限制了并发执行请求的线程数,但在IIS 7.0集成模式下,ASP.NET限制了并发执行请求的数量。 差异仅在请求是异步的时才起作用(请求具有异步处理程序或管道中的模块异步完成)。 显然,如果请求是同步的,那么并发执行请求的数量与并发执行请求的线程数相同,但如果请求是异步的,则这两个数字可能完全不同,因为您可能拥有比线程更多的请求。

所以基本上,如果请求是同步的,则每个请求的线程数相同。 请参阅此处了解各种参数 。

我已经解释过这是我的博客ASP.NET性能实例化业务层的博客文章

标题与您的问题不一致,但我解释了IIS处理请求的方式,我相信您会得到答案。

引文来自文章

当IIS对您的应用程序发出请求时,会将其移交给工作进程。 工作进程依次创建Global类的类和实例(类型为HttpApplication)。 从那时起,就会发生ASP.NET应用程序的典型流程(ASP.NET管道)。 但是,您需要了解和理解的是,工作进程(实际上将其视为IIS)会使HttpApplication(Global类的一个实例)的实例保持活动状态,以便记录其他请求。 实际上,默认情况下,如果需要,它将创建并缓存最多10个Global类实例(Lazy instantiation),具体取决于加载网站接收其他因素的请求数。 在上面的图1中,ASP.NET应用程序的实例显示为红色框。 这些工作进程最多可以缓存10个。 这些是工作进程创建和缓存的线程,每个线程都有自己的Global类实例。 请注意,每个线程都在同一个App Domain中。 因此,您在应用程序中可能拥有的任何静态类都将在这些线程或应用程序实例中共享。

我建议你阅读那篇文章,我很乐意回答你的任何问题。 请注意,我故意保持文章简单,因为我不会谈论内核中发生的事情或详细介绍参与的各种组件。 保持简单有助于人们更好地理解这些概念(我觉得)。

我会在这里回答你的其他一些问题:

  1. 是否有任何特定的算法来解决IIS7的线程分配问题?

不,对于所有意图而言,它是随机的。 这在我指出的文章中有所解释。 简短的回答是,如果缓存线程可用,那么IIs将使用它。 如果没有,它将创建一个新线程,创建和实例HttpApplication(全局)并为其分配所有上下文。 因此,在不忙的站点中,您可能会看到相同的线程处理请求。 但是没有保证。 如果有多个免费线程,IIS将随机选择一个线程来为该请求提供服务。 您应该注意,即使在不太繁忙的站点中,如果您的请求需要很长时间,IIS也会被迫创建新线程来为其他传入请求提供服务。

  1. 可用线程数的最大值是多少?

是(如本文所述)通常每个工作进程10个线程。 这可以调整,但我已经在一些非常繁忙的网站上工作,我从来没有这样做过。 关键是让您的应用程序尽快响应。 请注意,应用程序可以分配多个工作进程(在应用程序池中配置),因此在繁忙的站点中,您实际上需要为应用程序使用多个工作进程,但这意味着您拥有所需的硬件(CPU核心和内存)。

  1. 调度程序是Quartz.net,id显示为“Scheduler_Worker-10”,而不仅仅是一个数字

线程可以有名称而不是ID。 如果线程已经分配了名称,那么您将看到而不是id。 当然,对于IIS创建的线程,您没有这样的控件。 请注意,我没有使用过(也不了解Quartz),所以我不知道这一点,但我猜是这样的。