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 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

ASP.NET 4 AppFabric 输出缓存提供程序

缓存是用来保存你数据的地方,从而使你的应用程序访问更快速。缓存可以根据你的需要分配到许多台机器上,而开发人员无需关心数据究竟在哪台机器上。为了获得超快的性能,你...

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

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

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

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

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

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

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

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

18510
来自专栏依乐祝

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

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

23500
来自专栏圣杰的专栏

给ASP.NET Core Web发布包做减法

紧接上篇:ASP.NET Core Web App应用第三方Bootstrap模板。这一节我们来讲讲如何优化ASP.NET Core Web发布包繁重的问题。

9910
来自专栏张善友的专栏

Using the OData Ajax library

2010年3月份的msdn杂志上有篇文章是介绍Asp.Net Ajax 调用WCF Data Service的,也就是Using the OData Ajax ...

20650
来自专栏信安之路

PowerShell 降级攻击的检测与防御

在第一部分中,我提供了 PowerShell 的高级概述及其对网络的潜在风险。 当然,如果我们有追踪机制,那么只能缓解一些 PowerShell 攻击,假设我们...

19200
来自专栏乐沙弥的世界

Vmware server 下为Oracle RAC 添加共享磁盘

    在VMware下的Oracle RAC 环境中,对于共享存储不够或者需要增加新的共享磁盘来配置ocr或votingdisk的多路镜像,我们可以通过vmw...

22810
来自专栏程序你好

ASP.NET Core MVC 概述

15220

扫码关注云+社区

领取腾讯云代金券