.NET Web应用程序本机使用了多少个线程?

时间:2014-04-04 23:26:57

标签: c# asp.net .net multithreading iis

这一直困扰着我。假设我没有使用任何明确形式的任务并行性(例如Paralell.ForEach),当我将Web应用程序部署到Windows Server时,本机使用了多少个线程?

换句话说,如果Web服务器有一个八核处理器,那么如果我没有明确告诉它使用更多内核,应用程序是否只使用其中一个内核?

我敢打赌,我在这里错过了一些简单的东西,所以火上浇油 - 但我仍然想知道答案。感谢。

2 个答案:

答案 0 :(得分:5)

首先,您必须考虑Web服务器本质上是一个多线程系统,因为它必须能够同时响应多个请求(有一些方法可以在单个线程中执行此操作环境,但效率不高,IIS不支持它。如果两个用户同时访问该站点,则在大多数情况下,两个单独的线程正在为每个请求提供服务。

一旦您遇到可伸缩性问题和异步支持,那么一个线程实际上可以为多个请求提供服务(或者更确切地说,一个请求可以放在队列中,并且可以重用IIS工作线程来处理其他请求)。

因此,您从单个用户的角度来看待这一点。并且该单个用户可能在该Web请求期间仅运行单个活动线程(忽略异步,完成端口等等)。也就是说,你可以认为单个web请求在一般意义上等于单个线程(但是有很多东西可以脱离其他线程,这不是你真正可以信赖的东西)。

当您使用Parallel.ForEach之类的东西时,您的单个用户请求现在可以在多个线程中执行以提高效率。

IIS网站具有与之关联的工作进程。可以配置和调整该工作进程以控制它使用的线程数。但请记住,您的网站是在IIS的控制下运行的,而不是它自己的应用程序。

答案 1 :(得分:2)

当您沿着.NET版本移动时,线程的主题会变得非常混乱。

但是要过度简化,这取决于ASP.NET的processModel配置。 (machine.config) autoConfig = true / false 等。

至少在.NET 4.0中,最小/最大WorkerThreads和最小/最大IOCompletionThreads确定正在播放的线程数量。

e.g。如果minWorkerThreads = 1(默认值),那么总 minThreads = 1 * no:of cores .. 与 maxWorkerThreads 相同。

基于负载,工作进程可以使用未公开的算法来增加服务请求所需的线程.. minWorkerThreads到maxWorkerThreads。 (当然基于ThreadPool线程的可用性等。)