我将log4net添加到我的应用程序中,现在可以在浏览我的网站时看到用户活动的线程ID。是否有任何特定的算法来解决IIS7中线程分配的问题,或者它只是一个随机数分配(我怀疑它不是完全随机的,因为我的低流量站点显示的线程大多在10-30范围内)?可用线程数的最大值是多少?我注意到我的调度程序出现了一个奇怪的线程ID - 这有什么原因吗?调度程序是Quartz.net,id显示为“Scheduler_Worker-10”,而不只是一个数字。
答案 0 :(得分:8)
This解释了您需要知道的一切。
摘录:
当ASP.NET托管在IIS 7.0上时 集成模式,线程的使用是 有点不同。首先, 应用程序级别的队列已不复存在。 他们的表现总是如此 不好,没有希望解决这个问题, 所以我们摆脱了他们。但也许吧 最大的区别在于IIS 6.0或ISAPI模式,ASP.NET同时限制线程数 执行请求,但在IIS 7.0中 集成模式,ASP.NET限制了 并发执行次数 要求。差异只是重要的 当请求是异步的时 (请求要么有 异步处理程序或中的模块 管道完成 异步)。显然如果 reqeusts是同步的,然后是 并发执行次数 请求与数量相同 线程并发执行 请求,但如果请求是 异步然后这两个数字 你可以尽可能地完全不同 比线程有更多的要求。
基本上,如果请求是同步的,则每个请求的线程数相同。请参阅此处查看各种parameters。
答案 1 :(得分:4)
我已经解释过这是我博客上的博文 ASP.NET Performance-Instantiating Business Layers
标题与您的问题不符,但我解释了IIS处理请求的方式,我相信您会得到答案。
文章的引用
当IIS填写您的请求时 应用它把它交给了 工人流程。工人进程 转动你的创造和实例 全局类(属于类型 HttpApplication的)。从那时起 ASP.NET的典型流程 应用程序发生(ASP.NET 管道)。但是,你需要什么 知道并明白是工人 进程(真的把它想象成IIS) 保留你的实例 HttpApplication(你的一个实例) 全球类)活着,为了田野 其他要求。实际上它是默认的 它会创建并缓存多达10个 您的Global类的实例,如果 必需(懒惰实例化) 取决于负载的数量 请求您的网站收到其他 因素。在图1上面 ASP.NET应用程序的实例 显示为红色框。那里 最多可以缓存10个 工人的过程。这些都是真的 工作进程具有的线程 创建和缓存,每个线程都有 它自己的Global类的实例。 请注意,这些线程中的每一个都在 相同的App域。所以任何静态 您可能拥有的课程 每个应用程序共享 这些线程或应用程序 实例
我建议你阅读那篇文章,我很乐意回答你的任何问题。请注意,我故意保留文章简单,因为我不会谈论内核中发生的事情或详细介绍参与的各种组件。保持简单有助于人们更好地理解这些概念(我觉得)。
我会在这里回答你的其他一些问题:
不,对于所有意图而言,它是随机的。这在我指出的文章中有解释。简短的回答是,如果缓存线程可用,那么IIs将使用它。如果没有,它将创建一个新的线程,创建和实例HttpApplication(全局)并为其分配所有上下文。因此,在不忙的站点中,您可能会看到相同的线程处理请求。但是没有保证。如果有多个自由线程,IIS将随机选择一个线程来为该请求提供服务。您应该注意,即使在不那么繁忙的站点中,如果您的请求需要很长时间,IIS也会被迫创建新线程来为其他传入请求提供服务。
是(如本文所述)每个工作进程通常有10个线程。这可以调整,但我已经在一些非常繁忙的网站上工作,我从来没有这样做过。关键是让您的应用程序尽快响应。请注意,应用程序可以分配多个工作进程(在应用程序池中配置),因此在繁忙的站点中,您实际上需要为应用程序使用多个工作进程,但这意味着您拥有所需的硬件(CPU核心和内存)。
线程可以有名称而不是ID。如果已为线程分配了名称,那么您将看到而不是ID。当然,对于IIS创建的线程,您没有这样的控件。请注意,我没有使用过(也不了解Quartz),所以我不知道这一点,但我猜是这样的。