ASP.NET性能提升秘诀之管道与进程优化

ASP.NET 2.0中包涵了很多秘密,当你发现它时,可以为你的程序带来更大的性能和扩展性提升。例如,了解了在Membership和Profile provider提供程序中所隐藏的秘密瓶颈后就可以方便地的解决验证问题并使得授权操作的速度加快。

  另外,ASP.NET HTTP管道为了避免针对每次请求所要执行的必要代码而发生阻塞。不仅那样,ASP.NET工作者进程能够推动其限制而获得更高的性能。页面碎片在浏览器端的输出缓存(不是在服务器端)可以显著节约回访者的下载时间。按需求的用户界面下载可以让你的站点给人快速流畅的感觉。

  最后内容传输网络和HTTP缓存头的恰当使用可以让你的网站惊人的快速。在这篇文章中,你将学习到这些技术,它能够使你的ASP.NET应用程序获得更高的性能、更好的扩展性 ,并且可以在任何ASP.NET的网站上实现,尤其是那些应用了ASP.NET 2.0 Membership 和Profile provider的站点。

ASP.NET管道优化
       
  位于请求管道中的很多ASP.NET默认的HttpModules用于拦截客户端所发出的每个请求。例如,SessionStateModule拦截每个请求,并解析对应的会话cookie,然后在HttpContext中加载适当的会话。实时证明,并不是所有的modules都是必要的。

  例如,如果你不使用Membership和Profile provider提供程序,那么你就可以不需要FormsAuthentication module。如果你需要为你的用户使用Windows验证,那么你就可以不需要WindowsAuthentication。位于管道中的这些modules仅仅在每次请求到来时执行一些不必要的代码。
  
  默认的modules都定义在了machine.config文件中(位于$WINDOWS$\Microsoft.NET\Framework\$VERSION$\CONFIG目录下)。

< httpModules >
 
< add name ="OutputCache" type ="System.Web.Caching.OutputCacheModule" />
 
< add name ="Session" type ="System.Web.SessionState.SessionStateModule" />
 
< add name ="WindowsAuthentication"
        type
="System.Web.Security.WindowsAuthenticationModule" />
 
< add name ="FormsAuthentication"
        type
="System.Web.Security.FormsAuthenticationModule" />
 
< add name ="PassportAuthentication"
        type
="System.Web.Security.PassportAuthenticationModule" />
 
< add name ="UrlAuthorization" type ="System.Web.Security.UrlAuthorizationModule" />
 
< add name ="FileAuthorization" type ="System.Web.Security.FileAuthorizationModule" />
 
< add name ="ErrorHandlerModule" type ="System.Web.Mobile.ErrorHandlerModule,
                             System.Web.Mobile, Version=1.0.5000.0,
                             Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
/>
</ httpModules >

  你可以通过在站点的web.config文件中添加<remove>节点到你的网站应用程序中来删除这些默认的modules。例如:

< httpModules >
        
<!-- Remove unnecessary Http Modules for faster pipeline -->
        
< remove name ="Session" />
        
< remove name ="WindowsAuthentication" />
        
< remove name ="PassportAuthentication" />
        
< remove name ="AnonymousIdentification" />
        
< remove name ="UrlAuthorization" />
        
< remove name ="FileAuthorization" />
</ httpModules >

  上面的配置对于使用了数据库并基于Forms验证的网站来说非常适合,它们并不需要任何会话的支持。因此,所有这些modules都可以安全的删除。

ASP.NET 进程配置优化

  ASP.NET进程模型配置定义了一些进程级别的属性,像ASP.NET使用的线程数量、超时前阻止线程花费了多长时间、多少请求在继续等待IO工作完成等等。默认情况下,很多方面都具有太多的限制。当今,硬件已经变得十分便宜了,即使是采用双核多GB的RAM服务器也变得非常平常的选择了。

  因此,进程模型配置能够减少ASP.NET进程消耗更多的系统资源并提供为每台服务器提供更好的扩展性。

  执行一次规则的ASP.NET安装将会在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"
   cpuMask
="0xffffffff"
   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"
   asyncOption
="20"
   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应用程序会对某一个指定的服务器进行大量的调用,你甚至可以考虑设置一个更高的值。

 

欧姆龙FINS(工厂集成网络系统)协议是专为该公司自动化设备间数据交互而设计的网络通信标准。该协议构建于TCP/IP基础之上,允许用户借助常规网络接口执行远程监控、程序编写及信息传输任务。本文档所附的“欧ronFins.zip”压缩包提供了基于CC++语言开发的FINS协议实现代码库,旨在协助开发人员便捷地建立欧姆龙可编程逻辑控制器的通信连接。 FINS协议的消息框架由指令头部、地址字段、操作代码及数据区段构成。指令头部用于声明消息类别长度信息;地址字段明确目标设备所处的网络位置节点标识;操作代码定义了具体的通信行为,例如数据读取、写入或控制器指令执行;数据区段则承载实际交互的信息内容。 在采用C或C++语言实施FINS协议时,需重点关注以下技术环节: 1. **网络参数设置**:建立欧姆龙可编程逻辑控制器的通信前,必须获取控制器的网络地址、子网划分参数及路由网关地址,这些配置信息通常记载于设备技术手册或系统设置界面。 2. **通信链路建立**:通过套接字编程技术创建TCP连接至控制器。该过程涉及初始化套接字实例、绑定本地通信端口,并向控制器网络地址发起连接请求。 3. **协议报文构建**:依据操作代码目标功能构造符合规范的FINS协议数据单元。例如执行输入寄存器读取操作时,需准确配置对应的操作代码存储器地址参数。 4. **数据格式转换**:协议通信过程中需进行二进制数据的编码解码处理,包括将控制器的位状态信息或数值参数转换为字节序列进行传输,并在接收端执行逆向解析。 5. **异常状况处理**:完善应对通信过程中可能出现的各类异常情况,包括连接建立失败、响应超时及错误状态码返回等问题的处理机制。 6. **数据传输管理**:运用数据发送接收函数完成信息交换。需注意FINS协议可能涉及数据包的分割传输重组机制,因单个协议报文可能被拆分为多个TCP数据段进行传送。 7. **响应信息解析**:接收到控制器返回的数据后,需对FINS响应报文进行结构化解析,以确认操作执行状态并提取有效返回数据。 在代码资源包中,通常包含以下组成部分:展示连接建立数据读写操作的示范程序;实现协议报文构建、传输接收及解析功能的源代码文件;说明库函数调用方式接口规范的指导文档;用于验证功能完整性的测试案例。开发人员可通过研究这些材料掌握如何将FINS协议集成至实际项目中,从而实现欧姆龙可编程逻辑控制器的高效可靠通信。在工程实践中,还需综合考虑网络环境稳定性、通信速率优化及故障恢复机制等要素,以确保整个控制系统的持续可靠运行。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值