asp.net – 为什么IIS线程这么珍贵与常规CLR线程相比?

我是 reading about AsyncControllers在ASP.NET MVC。

看来,它们存在的唯一原因是,可以保存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>

参考:ASP.NET Thread Usage on IIS 7.5,IIS 7.0,and IIS 6.0

这些设置为Microsoft best practices recommend

>将maxconnection设置为12 *#of cpus。此设置控制您可以从客户端启动的传出HTTP连接的最大数量在这种情况下,ASP.NET是客户端。将maxconnection设置为12 *#of cpus。
>将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

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

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

相关文章

这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...
最近用到了CalendarExtender,结果不知道为什么发生了错位,...
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence cha...