为什么IIS线程与常规CLR线程相比是如此宝贵?

为什么IIS线程与常规CLR线程相比是如此宝贵?

我正在阅读 ASP.NET MVC中的AsyncControllers 。

看来,它们存在的唯一原因就是可以保存IIS线程,而将长时间运行的工作委派给常规CLR线程,这似乎更便宜。

这里有几个问题:

  • 为什么这些IIS线程如此昂贵以证明整个架构是为了支持异步控制器而建立的?
  • 我如何知道/配置在我的IIS应用程序池中运行多少IIS线程?
采纳答案:

ASP.NET通过使用.NET线程池中的线程来处理请求。 线程池维护已经产生线程初始化成本的线程池。 因此,这些线程很容易重用。 .NET线程池也是自调整的。 它监视CPU和其他资源利用率,并根据需要添加新线程或修剪线程池大小。 您通常应避免手动创建线程来执行工作。 而是使用线程池中的线程。 同时,确保您的应用程序不会执行冗长的阻塞操作,这可能会导致线程池缺少和HTTP请求被拒绝。

磁盘I / O,Web服务调用都被阻止。 通过使用异步调用进行了最佳优化。 当您进行异步调用时,asp.net会释放您的线程,并且在调用回调函数时,该请求将被分配给另一个线程。

要配置您可以设置的线程数:

<system.web>
    <applicationPool maxConcurrentRequestsPerCPU="50" maxConcurrentThreadsPerCPU="0" requestQueueLimit="5000"/>
</system.web>

请参阅: IIS 7.5,IIS 7.0和IIS 6.0上的ASP.NET线程使用

这些是Microsoft最佳做法建议的设置:

  • 将maxconnection设置为12 *#个CPU 。 此设置控制您可以从客户端启动的传出HTTP连接的最大数量。 在这种情况下,ASP.NET是客户端。 将maxconnection设置为12 *#个CPU。
  • 将maxIoThreads设置为100 。 此设置控制.NET线程池中最大I / O线程数。 该数字自动乘以可用CPU的数量。 将maxloThreads设置为100。
  • 将maxWorkerThreads设置为100 。 此设置控制线程池中的最大工作线程数。 然后,该数字将自动乘以可用CPU的数量。 将maxWorkerThreads设置为100。
  • 将minFreeThreads设置为88 *#个CPU 。 如果线程池中可用线程的数量低于此设置的值,则此进程会使用此进程对所有传入的请求进行排队。 此设置有效地限制可以同时运行到maxWorkerThreads minFreeThreads的请求数。 将minFreeThreads设置为88 *#个CPU。 这将并发请求数限制为12(假设maxWorkerThreads为100)。
  • 将minLocalRequestFreeThreads设置为76 *#个CPU 。 如果线程池中可用线程的数量低于此数字,则此进程将使用此设置对来自localhost(其中Web应用程序向本地Web服务发送请求)的请求进行排队。 此设置与minFreeThreads类似,但它仅适用于本地计算机的本地主机请求。 将minLocalRequestFreeThreads设置为76 *#个CPU。

注意 :本节中提供的建议不是规则。 他们是一个起点。

您将必须对应用程序进行基准测试,以找到最适合您应用程序的应用程序

参考更多解答:为什么IIS线程与常规CLR线程相比是如此宝贵?,转载请保留为什么IIS线程与常规CLR线程相比是如此宝贵?

更多:.net