ASP.NET性能提升秘诀之管道与进程优化
ASP NET 中包涵了很多秘密 当你发现它时 可以为你的程序带来更大的性能和扩展性提升 例如 了解了在Membership和Profile provider提供程序中所隐藏的秘密瓶颈后就可以方便地的解决验证问题并使得授权操作的速度加快
另外 ASP NET HTTP管道为了避免针对每次请求所要执行的必要代码而发生阻塞 不仅那样 ASP NET工作者进程能够推动其限制而获得更高的性能 页面碎片在浏览器端的输出缓存(不是在服务器端)可以显著节约回访者的下载时间 按需求的用户界面下载可以让你的站点给人快速流畅的感觉
最后内容传输网络和HTTP缓存头的恰当使用可以让你的网站惊人的快速 在这篇文章中 你将学习到这些技术 它能够使你的ASP NET应用程序获得更高的性能 更好的扩展性 并且可以在任何ASP NET的网站上实现 尤其是那些应用了ASP NET Membership 和Profile provider的站点
ASP NET管道优化
位于请求管道中的很多ASP NET默认的HttpModules用于拦截客户端所发出的每个请求 例如 SessionStateModule拦截每个请求 并解析对应的会话cookie 然后在HttpContext中加载适当的会话 实时证明 并不是所有的modules都是必要的
例如 如果你不使用Membership和Profile provider提供程序 那么你就可以不需要FormsAuthentication module 如果你需要为你的用户使用Windows验证 那么你就可以不需要WindowsAuthentication 位于管道中的这些modules仅仅在每次请求到来时执行一些不必要的代码
默认的modules都定义在了nfig文件中(位于$WINDOWS$\Microsoft NET\Framework\$VERSION$\CONFIG目录下)
<Modules>
<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=
Culture=neutral PublicKeyToken=b f f f d a a />
</Modules>
你可以通过在站点的nfig文件中添加<remove>节点到你的网站应用程序中来删除这些默认的modules 例如
<Modules><! 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 /></Modules>
上面的配置对于使用了数据库并基于Forms验证的网站来说非常适合 它们并不需要任何会话的支持 因此 所有这些modules都可以安全的删除
ASP NET 进程配置优化
ASP NET进程模型配置定义了一些进程级别的属性 像ASP NET使用的线程数量 超时前阻止线程花费了多长时间 多少请求在继续等待IO工作完成等等 默认情况下 很多方面都具有太多的限制 当今 硬件已经变得十分便宜了 即使是采用双核多GB的RAM服务器也变得非常平常的选择了
因此 进程模型配置能够减少ASP NET进程消耗更多的系统资源并提供为每台服务器提供更好的扩展性
执行一次规则的ASP NET安装将会在nfig文件中创建如下配置的节点
<system web><processModel autoConfig= true />
你需要减少这种自动配置并针对不同的特性使用一些特定的值以便自定义ASP NET工作者进程的工作方式 例如
<processModel
enable= true
timeout= Infinite
idleTimeout= Infinite
shutdownTimeout= : :
requestLimit= Infinite
requestQueueLimit=
restartQueueLimit=
memoryLimit=
webGarden= false
cpuMask= xffffffff
userName= machine
password= AutoGenerate
logLevel= Errors
clientConnectedCheck= : :
AuthenticationLevel= Connect
ImpersonationLevel= Impersonate
responseDeadlockInterval= : :
responseRestartDeadlockInterval= : :
autoConfig= false
maxWorkerThreads=
maxIoThreads=
minWorkerThreads=
minIoThreads=
serverErrorMessageFile=
pingFrequency= Infinite
pingTimeout= Infinite
asyncOption=
maxAppDomains=
/>
除了下面几个不为默认值以外 其余均为系统默认值
maxWorkerThreads
每次处理默认为 在一台双核的计算机上 ASP NET的处理就需要 了 这意味着ASP NET在一台并行的双核服务器上可以每次处理 个请求 我将数量增加到 以便为ASP NET的每次处理提供更多的线程 如果你有一个应用程序 它的CPU处理能力并不是很强但是它却能够每秒更容易地处理多个请求 那么你就可以增加这个值
尤其是你的Web应用程序使用了大量的Web服务调用或者下载/上传了很多不会对CPU产生压力的数据时 当ASP NET用完这些工作者线程时 它会停止出来发来的多个请求 此时请求会放置到一个队列中并持续等待直到出现一个空闲的工作者线程 通常到你的站点开始接受超过预期的点击时会发生这样的情况 那样的话 如果你需要节省CPU的使用 可以增加每次处理的工作者线程数来达到目的
maxIOThreads
每次处理默认为 在一台双核的计算机上 ASP NET进行的I/O操作就需要 个线程了 这意味着ASP NET在一台并行的双核服务器上可以每次处理 个I/O请求 I/O请求能够进行的文件读/写 数据库操作 web服务调用 从Web 应用程序中产生的HTTP请求等等 因此 如果你的服务器有足够的系统资源来处理更多的I/O请求 你可以将该值设置为 特别是当你的Web应用程序在并行模式下进行下载/上传数据 调用很多外部Web服务时 非常有用
minWorkerThreads
当空闲的ASP NET工作者线程数量低于这个数字时 ASP NET就会开始将这些发来的请求推入队列中 因此 你可以为改值设定一个较低的值以便可以增加当前请求的数量 此外 建议不要将该值设置得过低 因为Web应用程序的代码可能需要做一些后台处理和并行处理 此时会需要更多的空闲工作者线程支持
minIOThreads
除了它是针对I/O线程以外 其它与minWorkerThreads的方式相同 然而你可以将该值设置得比minWorkerThreads还低 因为就I/O线程而言 这里不会发生并行处理的问题
memoryLimit
指定内存大小所允许的最大值 作为整个系统内存的百分比 以便ASP NET在启动一个新的进程并重新分派存在的请求之前这些工作者进程能够进行消费 如果在你的服务器上仅仅只运行了你的网站应用程序 而且没有其它的进程需要RAM 你可以设置一个更高的值 比如
然而 如果你同时有一个会发生内存泄漏的应用程序 那么最好是把该值设置为一个较低的值以便在出现大问题之前泄漏的内存能得到及时的回收从而保持你的站点稳定 尤其是当你使用组件并发生内存泄漏时 然而 这只是针对该问题的一个临时解决方案 当然需要你去解决泄漏问题
除了processModel以外 另外还有一个非常重要的节点 你能够指定发出请求作为单独IP的最大数量
<><connectionManagement><add address= * maxconnection= /></connectionManagement></>
lishixinzhi/Article/program/net/201311/13267
2024-11-14 广告