我将log4net添加到我的应用程序中,现在可以看到用户活动的线程Ids在我的网站中导航。对于如何在IIS7中执行线程分配,有什么具体的算法吗?还是仅仅是一个随机数分配(我怀疑它不是完全随机的,因为我的低流量站点显示线程的范围大多在10-30之间)?可用线程数有上限吗?我注意到我的调度程序出现了一个奇怪的线程id --有什么原因吗?调度程序是Quartz.net,id显示为" scheduler _Worker-10",而不仅仅是一个数字。
发布于 2011-02-05 22:48:52
这解释了你需要知道的一切。
节选:
当ASP.NET以集成模式托管在IIS7.0上时,线程的使用略有不同。首先,应用程序级队列不再存在了.他们的表现总是很糟糕,没有希望去解决这个问题,所以我们摆脱了他们。但是,最大的区别可能是在IIS6.0或ISAPI模式中,ASP.NET限制并发执行请求的线程数,但在IIS7.0集成模式下,ASP.NET限制并发执行请求的数量。只有当请求是异步的(请求要么有异步处理程序,要么管道中的模块异步完成),差异才重要。显然,如果请求是同步的,那么并发执行请求的数量与并发执行请求的线程数相同,但是如果请求是异步的,那么这两个数字可能会有很大的不同,因为您可能比线程有更多的请求。
因此,基本上,如果请求是同步的,每个请求的线程数是相同的。参见这里的各种参数。
发布于 2011-02-06 04:20:27
我已经解释过这是我博客ASP.NET性能-实例化业务层上的一篇博文
标题与您的问题不一致,但我解释IIS处理请求的方式,我相信您将得到答案。
这篇文章的引文
当IIS为您的应用程序输入请求时,它会将其移交给工作进程。工作进程依次创建和执行您的全局类(它的类型为HttpApplication)。从这一点开始,就会发生ASP.NET应用程序的典型流( ASP.NET管道)。但是,您需要知道和理解的是,工作进程(实际上将其视为IIS )使您的HttpApplication实例(您的全局类的一个实例)保持存活,以便输入其他请求。事实上,在默认情况下,它将创建和缓存多达10个您的Global类实例,如果需要的话(Lazy实例化)取决于加载的请求数量,您的网站接收其他因素。在上面的Figure1中,ASP.NET应用程序的实例显示为红色框。可能有多达10个这样的缓存由工作进程。这些确实是工作进程创建和缓存的线程,每个线程都有自己的Global类实例。请注意,这些线程中的每一个都位于同一个App中。因此,您可能在应用程序中拥有的任何静态类都在这些线程或应用程序实例之间共享。
我建议你读那篇文章,我很乐意回答你的任何问题。请注意,我一直有意保持这篇文章的简单性,因为我没有谈论内核中发生的事情,也没有详细介绍参与的各种组件。保持简单可以帮助人们更好地理解这些概念(我觉得)。
我将在这里回答你的其他一些问题:
不,出于某种目的,这是随机的。这是在我指出的文章中解释的。简单的回答是,如果缓存的线程可用,那么IIs将使用它。否则,它将创建一个新线程、创建和执行HttpApplication (全局)并将所有上下文分配给它。因此,在不繁忙的站点中,您可能会看到相同的线程处理请求。但没有任何保证。如果有多个空闲线程,IIS将随机选择一个线程来服务该请求。您应该注意,即使在一个不太繁忙的站点上,如果您的请求需要很长时间,IIS将被迫创建新线程来处理其他传入请求。
是的(如本文所述),每个工作进程通常有10个线程。这是可以调整的,但我在一些非常繁忙的网站上工作,我从来没有这样做过。关键是使您的应用程序尽可能快地响应。请注意,应用程序可以为其分配多个工作进程(在应用程序池中配置),因此在繁忙的站点上,您实际上需要为应用程序分配多个工作进程,但这意味着您拥有所需的硬件(CPU核心和内存)。
线程可以有名称而不是Ids。如果线程被分配了一个名称,那么您将看到它而不是id。当然,对于线程,IIS会创建这样的控件。请注意,我没有使用(也不知道石英),所以我不知道,但我想是这样的。
https://stackoverflow.com/questions/4910159
复制相似问题