.NET网络应用程序默认使用多少个线程?

3
这个问题困扰了我一段时间。假设我没有使用任何显式形式的任务并行(例如Parallel.ForEach),当我将Web应用程序部署到Windows服务器时,有多少线程被默认使用?
换句话说,如果Web服务器有一个八核处理器,如果我没有明确告诉它使用更多核心,那么应用程序只使用其中一个核心吗?
我敢打赌我错过了一些简单的东西,所以请指出来——但我仍然想知道答案。谢谢。

这取决于ASP.NET应用程序的类型。我们需要更多关于已部署应用程序的详细信息。 - Scott Chamberlain
假设一个ASP.NET MVC应用程序有几个WebAPI端点,每个端点都指向业务逻辑层中的一个方法。BLL可能引用实体类并运行您典型的查询和CRUD操作。这有帮助吗?谢谢! - Matt Cashatt
@MatthewPatrickCashatt 托管在哪个容器中?IIS吗?如果是的话,IIS是一个功能齐全的Web服务器,将使用所有可用的核心。 - Kirk Woll
是的,IIS。我认为你的问题反映了我没有理解的部分:如果IIS足够聪明地使用所有核心,那么为什么我需要显式地使用像Parallel.ForEach这样的东西呢?谢谢! - Matt Cashatt
@MatthewPatrickCashatt,IIS将确保您的每个请求在线程/核心之间高效分配。但是,单个请求在单个线程上运行。例如,为了满足请求,您需要在五个不同的服务器上调用五个单独的外部REST API,顺序执行这些操作是愚蠢的。使用线程可以使您并行化这五个任务,从而最小化总耗时。实际上,通常通过“await”等方式在请求线程上完成所有工作已经足够。但有时您需要进行优化。 - Kirk Woll
谢谢@KirkWoll,非常有教益。 - Matt Cashatt
2个回答

7
首先,您需要考虑一个Web服务器的本质,即它必须是一个多线程系统,因为它必须能够同时响应多个请求(虽然单线程环境也有处理多个请求的方法,但效率不高,并且IIS不支持这种方法)。如果两个用户同时访问站点,则大多数情况下会有两个独立的线程为每个请求提供服务。
一旦涉及可扩展性问题和异步支持,那么一个线程实际上可以为多个请求提供服务(或者说可以将请求放入队列中,IIS工作线程可以被重用以处理其他请求)。
因此,您从单个用户的角度来看待这个问题。在该Web请求期间,该单个用户可能仅运行单个活动线程(忽略异步、io完成端口等等)。也就是说,您可以将单个Web请求视为通常意义上的单个线程(但有很多事情可能会派生出其他线程,这并不是您真正可以依赖的东西)。
当您使用类似于Parallel.ForEach这样的东西时,它的目的是使您单个用户的请求现在可以在多个线程中执行,以提高效率。
IIS网站有一个关联的工作进程。该工作进程可以配置和调整以控制它使用的线程数。但请记住,您的网站是在IIS的控制下运行,而不是作为其自己的应用程序运行。

谢谢您提供这么详细的解释,对于理解IIS“引擎盖下”的运作非常有帮助。 - Matt Cashatt

2

随着.NET版本的不断更新,线程的话题变得非常令人困惑。

但是简单来说,这取决于ASP.NET的processModel配置(machine.config)autoConfig=true/false等。

至少在.NET 4.0中,min/max WorkerThreads和min/max IOCompletionThreads确定了正在运行的线程数量。

例如,如果minWorkerThreads = 1(默认值),则总minThreads = 1 * no:of cores。maxWorkerThreads也是一样。

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


谢谢,这很有道理! - Matt Cashatt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接