ASP.NET进程优化

ASP.NET工作者进程能够推动其限制而获得更高的性能。在 Internet 信息服务 (IIS) Web 服务器上配置 ASP.NET 进程模型设置。只能在 Machine.config 文件中设置 <processModel> 节,并且该节影响服务器上运行的所有 ASP.NET 应用程序。 可以参考文档说明:http://doc.51windows.net/iismmc/?url=/iismmc/htm/aaconprocessmodelelement.htm

ASP.NET进程模型配置定义了一些进程级别的属性,像ASP.NET使用的线程数量、超时前阻止线程花费了多长时间、多少请求在继续等待IO工作完成等等。默认情况下,很多方面都具有太多的限制。现在我们使用的硬件都是采用双核多GB的RAM服务器,因此,进程模型配置能够减少ASP.NET进程消耗更多的系统资源并提供为每台服务器提供更好的扩展性。

ASP.NET 2.0 安装将会在machine.config文件中创建如下配置的节点:

<system.web><processModel autoConfig="true" /> 

需要减少这种自动配置并针对不同的特性使用一些特定的值以便自定义ASP.NET工作者进程的工作方式。例如:

<processModel   
  enable="true"    
  timeout="Infinite"    
  idleTimeout="Infinite"    
  shutdownTimeout="00:00:05"    
  requestLimit="Infinite"    
  requestQueueLimit="5000"    
  restartQueueLimit="10"    
  memoryLimit="60"    
  webGarden="false"    
  userName="machine"    
  password="AutoGenerate"    
  logLevel="Errors"    
  clientConnectedCheck="00:00:05"    
  comAuthenticationLevel="Connect"    
  comImpersonationLevel="Impersonate"    
  responseDeadlockInterval="00:03:00"    
  responseRestartDeadlockInterval="00:03:00"    
  autoConfig="false"    
  maxWorkerThreads="100"    
  maxIoThreads="100"    
  minWorkerThreads="40"    
  minIoThreads="30"    
  serverErrorMessageFile=""    
  pingFrequency="Infinite"    
  pingTimeout="Infinite"    
  maxAppDomains="2000"    
  />

除了下面几个不为默认值以外,其余均为系统默认值:

maxWorkerThreads 

每次处理默认为20,在一台双核的计算机上,ASP.NET的处理就需要40了。这意味着ASP.NET在一台并行的双核服务器上可以每次处理40个请求。我将数量增加到100以便为ASP.NET的每次处理提供更多的线程。如果你有一个应用程序,它的CPU处理能力并不是很强但是它却能够每秒更容易地处理多个请求,那么你就可以增加这个值。

尤其是你的Web应用程序使用了大量的Web服务调用或者下载/上传了很多不会对CPU产生压力的数据时。当ASP.NET用完这些工作者线程时,它会停止出来发来的多个请求。此时请求会放置到一个队列中并持续等待直到出现一个空闲的工作者线程。通常到你的站点开始接受超过预期的点击时会发生这样的情况。那样的话,如果你需要节省CPU的使用,可以增加每次处理的工作者线程数来达到目的。

maxIOThreads

每次处理默认为20,在一台双核的计算机上,ASP.NET进行的I/O操作就需要40个线程了。这意味着ASP.NET在一台并行的双核服务器上可以每次处理40个I/O请求。I/O请求能够进行的文件读/写、数据库操作、web服务调用、从Web 应用程序中产生的HTTP请求等等。因此,如果你的服务器有足够的系统资源来处理更多的I/O请求,你可以将该值设置为100。特别是当你的Web应用程序在并行模式下进行下载/上传数据、调用很多外部Web服务时,非常有用。

minWorkerThreads

当空闲的ASP.NET工作者线程数量低于这个数字时,ASP.NET就会开始将这些发来的请求推入队列中。因此,你可以为改值设定一个较低的值以便可以增加当前请求的数量。此外,建议不要将该值设置得过低,因为Web应用程序的代码可能需要做一些后台处理和并行处理,此时会需要更多的空闲工作者线程支持。

minIOThreads

除了它是针对I/O线程以外,其它与minWorkerThreads的方式相同。然而你可以将该值设置得比minWorkerThreads还低。因为就I/O线程而言,这里不会发生并行处理的问题。

memoryLimit

指定内存大小所允许的最大值,作为整个系统内存的百分比,以便ASP.NET在启动一个新的进程并重新分派存在的请求之前这些工作者进程能够进行消费。如果在你的服务器上仅仅只运行了你的网站应用程序,而且没有其它的进程需要RAM,你可以设置一个更高的值,比如80。

然而,如果你同时有一个会发生内存泄漏的应用程序,那么最好是把该值设置为一个较低的值以便在出现大问题之前泄漏的内存能得到及时的回收从而保持你的站点稳定。尤其是当你使用COM组件并发生内存泄漏时。然而,这只是针对该问题的一个临时解决方案;当然需要你去解决泄漏问题。

除了processModel以外,另外还有一个非常重要的节点system.net,你能够指定发出请求作为单独IP的最大数量。

<system.net>
<connectionManagement>
<add address="*" maxconnection="100" />
</connectionManagement>
</system.net>

默认值为2,设置得比较低。这就意味着你不能从你的Web应用程序用一个IP地址同时链接多于2个的链接。站点获得外部内容很多都是由于默认设置而遭到阻塞。这里我将其设置为100。如果你的Web应用程序会对某一个指定的服务器进行大量的调用,你甚至可以考虑设置一个更高的值。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Ken的杂谈

ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门

本篇代码基于上一篇进行调整:https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapte...

1383
来自专栏章鱼的慢慢技术路

Linux操作_常用命令操作练习

2752
来自专栏技术栈大杂烩

Linux: 关于 SIGCHLD 的更多细节

对该机制有稍微了解的话,不难得知一个关键因素:SIGCHLD。正是这个SIGCHLD起到了通知的作用,所以后面的处理也是基于它而实现。

1666
来自专栏walterlv - 吕毅的博客

如何创建一个基于命令行工具的跨平台的 NuGet 工具包

发布于 2018-05-12 01:09 更新于 2018-09...

732
来自专栏WebDeveloper

Thinkphp的cron计划任务

cron1默认在ThinkPHP\Library\Cron\cron1.php如果没有cron目录则新建一个,cron1.php自己所要执行的脚本

1253
来自专栏Jerry的SAP技术分享

谣言粉碎机 - 极短时间内发送两个Odata request,前一个会自动被cancel掉?

有时我们能在Chrome开发者工具的Network tab里观察到SAP UI5应用会发出某些状态为"取消"的OData请求。如下图第五个请求。

19910
来自专栏程序员的SOD蜜

Erlang语言学习入门

近期研究RabbitMQ,发现它是基于Erlang实现的,于是对Erlang这么语言发生了兴趣,官网地址 http://www.erlang.org/ ,去下载...

27310
来自专栏walterlv - 吕毅的博客

项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦)

发布于 2018-04-12 13:03 更新于 2018-08...

1241
来自专栏葡萄城控件技术团队

如何在 ASP.NET MVC 中集成 AngularJS(1)

介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术。例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 REST 的 Web API...

3276
来自专栏依乐祝

使用Visual Studio Code开发.NET Core看这篇就够了

在本文中,我将带着大家一步一步的通过图文的形式来演示如何在Visual Studio Code中进行.NET Core程序的开发,测试以及调试。尽管Visual...

1290

扫码关注云+社区