【问题标题】:How many threads does a .NET web application natively use?.NET Web 应用程序本机使用多少个线程?
【发布时间】:2014-04-04 23:26:56
【问题描述】:

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

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

我敢打赌,我在这里错过了一些简单的事情,所以加油——但我仍然想知道答案。谢谢。

【问题讨论】:

  • 这取决于 ASP.NET 应用程序的类型。我们需要有关已部署应用程序的更多详细信息。
  • 假设一个 ASP.NET MVC 应用程序具有几个 WebAPI 端点,每个端点都指向业务逻辑层中的一个方法。 BLL 可能会引用一个实体类并运行您的典型查询和 cruds。这有帮助吗?谢谢!
  • @MatthewPatrickCashatt 托管在什么容器中? IIS?如果是这样,IIS 是一个功能齐全的 Web 服务器,将使用所有可用的内核。
  • 是的,IIS。我认为您的问题反映了我没有得到的部分:如果 IIS 足够智能以使用所有内核,那么我为什么需要明确使用 Parallel.ForEach 之类的东西?谢谢!
  • @MatthewPatrickCashatt,IIS 将确保您的每个请求都将有效地分布在线程/内核之间。但是,单个请求在单个线程上运行。例如,如果为了满足一个请求,您需要在五个不同的服务器上调用五个单独的外部 REST API,那么按顺序执行此操作将是愚蠢的。使用线程将允许您并行化这五个任务,从而使总时间最小化。事实上,通常在请求线程上完成所有工作(通过await 等)就足够了。但有时您需要优化。

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


【解决方案1】:

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

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

所以您是从单个用户的角度来看待这个问题的。并且该单个用户可能会在该 Web 请求期间仅运行单个活动线程(忽略异步、io 完成端口等)。即,您可以将单个 Web 请求视为一般意义上的单个线程(但是有很多东西可以从其他线程中分离出来,这不是您真正可以指望的东西)。

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

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

【讨论】:

  • 感谢您的详细解释,这对于了解 IIS 的“幕后”情况非常有帮助。
【解决方案2】:

随着您使用 .NET 版本,线程的主题可能会变得非常混乱。

但为了过度简化,这取决于您对 ASP.NET 的 processModel 配置。 (machine.config) autoConfig=true/false

至少,在 .NET 4.0 中,最小/最大 WorkerThreads 和最小/最大 IOCompletionThreads 决定了正在运行的线程数量。

例如如果 minWorkerThreads = 1(默认值),则总 minThreads = 1 * no:of cores.. 与 ma​​xWorkerThreads 相同。

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

【讨论】:

  • 谢谢,这很有意义!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多