ASP.NET中性能和扩展性的秘密

开发 后端
这篇文章中,你可以学到一些提高你的asp.net网站性能的技巧。

ASP.NET有许多一旦你发现了就会大幅提高性能和扩展性的秘密。比如:在membership和Profile provider 中就有快速实现验证和授权的秘密。此外:ASP.NET的http管道可以避免每个请求中的不必要代码。还不只是这些,ASP.NET的线程可以充分发挥性能。浏览器的页面片断缓存机制(不是服务器缓存)可以在反复的访问中节约下载时间。在界面加载完成后给你的网站提供快速流畅的体验。最后,CDN和适当的使用http缓存头可以使你的网站访问飞快。这篇文章中,你可以学到一些提高你的ASP.NET网站性能的技巧。
我们要讨论的问题:
◆管线最佳优化
◆ASP.NET过程最佳处理
◆进行之前要对ASP.NET做的事情
◆内容传送网络
◆在浏览器中缓存AJAX请求
◆优化缓存机制
◆优化页面装载速度提高用户体验
◆尽可能的优化ASP.NET 2.0的profile provider.
◆在不布置网站的情况下如何查询membership表
◆DOS攻击
以上技巧可用于任何基于ASP.NET的网站,尤其是使用了membership和profile provider的网站。
1.管线最佳优化
一些ASP.NET默认的HttpModules 管理请求的管线并且每一个请求。例如:SessionStateModule拦截每一个请求,分析session cookie 来加载HttpContext中的合适的session.但是并不是所有的Modules都是必需的,比如:如果你不用membership的话,就不用配置FormsAuthentication模块;如果你不用windows身份验证就不用配置WindowsAuthentication,这些模块只是包含在管线里面,为每一个请求执行一些并不是必须的代码。默认的模块定义在machine.config中($WINDOWS$\Microsoft.NET\Framework\$VERSION$\CONFIG)
如下所示:

 

  1. <httpModules> 
  2.   <add name="OutputCache" type="System.Web.Caching.OutputCacheModule" /> 
  3.   <add name="Session" type="System.Web.SessionState.SessionStateModule" /> 
  4.   <add name="WindowsAuthentication" 
  5.         type="System.Web.Security.WindowsAuthenticationModule" /> 
  6.   <add name="FormsAuthentication" 
  7.         type="System.Web.Security.FormsAuthenticationModule" /> 
  8.   <add name="PassportAuthentication" 
  9.         type="System.Web.Security.PassportAuthenticationModule" /> 
  10.   <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorization
  11. Module" /> 
  12.   <add name="FileAuthorization" type="System.Web.Security.FileAuthorization
  13. Module" /> 
  14.   <add name="ErrorHandlerModule" type="System.Web.Mobile.ErrorHandlerModule,  
  15.                              System.Web.Mobile, Version=1.0.5000.0,  
  16.                              Culture=neutralPublicKeyToken=b03f5f7f11d50a3a/> 
  17. httpModules> 

如果你想去掉这些默认的设置,只需要在你的web.config里加入节点。

 

  1. <httpModules> 
  2.           
  3.          <remove name="Session" /> 
  4.          <remove name="WindowsAuthentication" /> 
  5.          <remove name="PassportAuthentication" /> 
  6.          <remove name="AnonymousIdentification" /> 
  7.          <remove name="UrlAuthorization" /> 
  8.          <remove name="FileAuthorization" /> 
  9. httpModules> 

上面的配置适用于基于数据库的form认证并且不需要任何session支持的网站。所以这些节点可以被删除。
2.ASP.NET进程配置优化
asp.net进程模型进行一些进程级别设置,比如ASP.NET使用多少线程,超时时间,多少请求等待输入输出工作的完成等等。默认情况下有很多限制。现在硬件越来越便宜,G级内存的服务器普遍存在,所以现在进程配置的优化可以得到更多的系统资源和扩展。
一般情况下,ASP.NET的mashine.config的配置是这样的:

 

  1. <system.web> 
  2.     <processModel autoConfig="true" />   
  3. system.web> 

你应该改变这样的配置,用一些值设置不同的属性来定制ASP.NET线程的工作方式。如下所示:

 

  1. <processModel 
  2.    enable="true" 
  3.    timeout="Infinite" 
  4.    idleTimeout="Infinite" 
  5.    shutdownTimeout="00:00:05" 
  6.    requestLimit="Infinite" 
  7.    requestQueueLimit="5000" 
  8.    restartQueueLimit="10" 
  9.    memoryLimit="60" 
  10.    webGarden="false" 
  11.    cpuMask="0xffffffff" 
  12.    userName="machine" 
  13.    password="AutoGenerate" 
  14.    logLevel="Errors" 
  15.    clientConnectedCheck="00:00:05" 
  16.    comAuthenticationLevel="Connect" 
  17.    comImpersonationLevel="Impersonate" 
  18.    responseDeadlockInterval="00:03:00" 
  19.    responseRestartDeadlockInterval="00:03:00" 
  20.    autoConfig="false" 
  21.    maxWorkerThreads="100" 
  22.    maxIoThreads="100" 
  23.    minWorkerThreads="40" 
  24.    minIoThreads="30" 
  25.    serverErrorMessageFile="" 
  26.    pingFrequency="Infinite" 
  27.    pingTimeout="Infinite" 
  28.    asyncOption="20" 
  29.    maxAppDomains="2000" 
  30. /> 

 

除了下面的值外都是一些默认值:
maxWorkerThreads:默认每个进程是20个线程。在双核的服务器上,系统会分配40个线程给ASP.NET,这就意味着ASP.NET在双核服务器上同时可以处理40个并发请求。为了给ASP.NET的每个进程增加线程,我曾经设置过100.如果你的应用的CPU强劲而且有更多的请求需要,你可以设置这个属性。特别是你的网络就用使用了大量的webservice或者上传/下载大量数据这些不会把压力转到CPU上的时候。当ASP.NET用完了所有的线程,它会停止接收更多的响应。请求会排成队列等待直到其它工作中的线程被释放。这种情况经常发生在网站接收到超出预期的点击的时候,这种情况下,如果你有备用的CPU,请增加进程的线程数量。
maxIOThreads:默认是20个。双核服务器中系统会提供40个I/O线程给ASP.NET.I/O请求可以用于网站的文件读写,数据库读取,webservice调用,http请求等等。你可以把它设置的更高一点,特别是在你的网站做并发的上传/下载和 webservice调用的时候。
minWorkerThreads:当ASP.NET自由工作线程低于这个值时,ASP.NET会推送一些请求进入队列。所以你可以设置一个低值来增加当前的请求数量。当然这个值不能设置的太低,因为网站要做一些后台处理和并行处理,这些工作都是需要一些线程来运行的。
minIOThreads:和minWorkerThreads相当,只不过是针对I/O进程进行的设置。它可以设置的比in case of 低,因为I/O并行处理线程没有什么问题。
memoryLimit:指定最大的内存使用大小。它指定的是占所有系统内存的百分比,是指定系统处理进程时可以使用的最大内存数。如果服务器上只有你自己的网站而且没有其它的使用内存的进程,你可以把它设置的高一些,比如:80.如果你的网站存在内存泄露问题,你最好把这个值设置的低一点,这样泄露的内存不久就会释放出来,这样会保持网站的正常运行。特别是你在使用COM组件造成内存泄露的时候。当然这只是个临时方案,最终你还是要解决这个内存泄露的问题。
除了processModel之外,ASP.NET还可以设置单一IP最大的请求数量:

 

 

  1. <system.net> 
  2.   <connectionManagement> 
  3.     <add address="*" maxconnection="100" /> 
  4.   connectionManagement> 
  5. system.net> 

默认是2,这个值太低了。这意味着每一个IP最多只能有两个请求到你的网站,这样会造成请求拥堵。这里设置成了100,当然有必要的话,你可以设置得更高。

 

编辑推荐】

  1. 浅谈ASP.NET中ViewState与ViewData的区别
  2. ASP.NET 3.5图表控件亲密接触
  3. 自己动手实现Asp.net的MVC框架
  4. ASP.NET MVC应用程序的本地化、单元测试和AJAX应用
  5. ASP.NET中防止用户多次登录的方法
责任编辑:佚名 来源: 博客园
相关推荐

2017-01-05 19:29:10

公共云云存储微软

2023-10-11 13:46:26

缓存Web应用程序

2018-04-10 14:38:10

区块链

2009-11-30 17:47:24

2021-12-09 05:36:16

云存储可扩展性数据存储云存储

2021-09-02 09:42:11

测试软件可扩展性开发

2012-12-24 09:23:27

ASP.NETC#IIS

2010-06-30 17:15:39

向外扩展SQL Ser

2011-03-01 11:31:38

SOA甲骨文

2011-09-20 09:34:09

Windows Ser微软虚拟化

2010-07-21 11:21:05

SQL Server

2009-07-24 16:15:00

扩展ASP.NET G

2010-07-01 11:38:13

向外扩展 SQL Se

2009-07-27 12:22:03

ASP.NET和ASPASP.NET入门教程

2022-09-05 15:17:34

区块链比特币可扩展性

2009-09-03 17:18:40

C#扩展性对象模型

2015-05-13 17:15:01

Elasticsear分布式搜索插件

2009-07-29 16:08:07

ASP和ASP.NET

2011-10-14 10:37:54

ASP.NET

2009-09-03 17:33:08

C#常规扩展性模型
点赞
收藏

51CTO技术栈公众号