下面讲述ASP.NET性能优化在配置内容方面的两个方法:状态管理和Web应用程序的考虑。
ASP.NET性能优化之状态管理
a) 当不使用会话状态时禁用它
并不是所有的应用程序或页都需要具体用户的会话状态;您应该在不需要时禁用会话状态。若要禁用页的会话状态,请将 @ Page 指令中的 EnableSessionState 属性设置为 false。
如果页需要访问会话变量,但不会创建或修改它们,则将 @ Page 指令中的 EnableSessionState 属性设置为 ReadOnly。
若要禁用应用程序的会话状态,请在应用程序的 Web.config 文件的 SessionState 节中将 Mode 属性设置为 Off。
b) 针对应用程序需要,选择适当的会话状态提供程序
ASP.NET 为存储应用程序的会话数据提供了多种方法:进程内会话状态、作为 Windows 服务的进程外会话状态和 SQL Server 数据库中的进程外会话状态。(您还可以创建自定义会话状态提供程序,以在所选数据存储区中存储会话数据。)每种方法都有自己的优点,但进程内会话状态是迄今为止速度最快的解决方案。如果只在会话状态中存储少量易失数据,则建议您使用进程内提供程序。进程外会话状态选项用于跨多个处理器或多个计算机缩放应用程序,或者用于您希望在服务器或进程重新启动时保留会话数据的情况。
ASP.NET性能优化之Web 应用程序
a) 考虑预编译
在对资源(如 ASP.NET 网页)的***请求中,Web 应用程序是批编译的。如果应用程序中的页都没有编译,批编译功能会成批编译目录中的所有页,以增加磁盘和内存的使用率。可以使用 ASP.NET 编译工具 (Aspnet_compiler.exe) 预编译 Web 应用程序。对于就地编译,该编译工具调用 ASP.NET 运行库来编译站点,其方式与用户向网站请求页时的方式相同。可以预编译 Web 应用程序,以便保留 UI 标记;也可以预编译页,以便不能更改源代码。
b) 去除客户端双连接限制
HTTP 规范表明,一个 HTTP 客户端与任一服务器最多可以同时建立两个 TCP 连接。这可以防止单个浏览器在浏览某个页面(例如,具有120个嵌入的缩略图)时,由于连接请求过多而使服务器负载过重。
- < system.net>
- < connectionManager>
- < add address="*" maxconnection = "40" />
- …
(会加快客户端对页面访问速度,但是同时会增加服务器负载,配置需要权衡)
c) 在 Internet 信息服务 5.0 上,在进程外运行 Web 应用程序
默认情况下,IIS 5.0 上的 ASP.NET 将使用进程外辅助进程为请求提供服务。此功能已被优化以提高吞吐量。由于在进程外的辅助进程中运行 ASP.NET 有其功能和优点,建议在生产站点上使用它。
d) 定期回收进程
为了同时保证稳定性和性能,应该定期回收进程。经过较长的时间,有内存泄漏和 Bug 的资源可以影响 Web 服务器的吞吐量,而回收进程可以清理内存避免这类问题。但是,应当平衡定期回收的需求和过频的回收,因为停止辅助进程、重新加载页面并重新获取资源和数据的开销可能会超过回收的好处。
在使用 IIS 6.0 的 Windows Server 2003 上运行的 ASP.NET Web 应用程序不需要调整进程模型设置,因为 ASP.NET 将使用 IIS 6.0 进程模型设置。
e) 必要时调整应用程序每个辅助进程的线程数.
ASP.NET 的请求结构试图在执行请求的线程数和可用资源之间达到一种平衡。该结构将根据可用于请求的 CPU 功率,来决定允许同时执行的请求数。这项技术称作线程门控。但是在某些条件下,线程门控算法不是很有效。通过使用与“ASP.NET Applications”性能对象关联的“Pipeline Instance Count”(管线实例计数)性能计数器,可以在 Windows 性能监视器中监视线程门控。
当 ASP.NET 网页调用外部资源时(例如执行数据库访问或 XML Web services 请求时),页面请求通常停止并释放 CPU 以处理其他线程,直到外部资源响应为止。如果另一个请求正在等待处理,并且线程池中有一个线程释放,则开始处理这个正在等待的请求。这可能导致 ASP.NET 辅助进程或应用程序池中存在大量同时执行的请求和许多正在等待的线程,而它们会影响 Web 服务器的吞吐量,从而对性能产生不利的影响。
为缓解这种情况,可以通过更改 Machine.config 文件的 processModel 节中的 MaxWorkerThreads 和 MaxIOThreads 属性,手动设置对进程中的线程数的限制。
辅助线程是用来处理 ASP.NET 请求的,而 IO 线程则是用于为来自文件、数据库或 XML Web services 的数据提供服务的。
分配给进程模型属性的值是进程中每个 CPU 每类线程的***数目。对于双处理器计算机,***数是设置值的两倍。对于四处理器计算机,***值是设置值的四倍。对于有一个或两个处理器的计算机,默认值就可以,但对于有两个以上处理器的计算机的性能,进程中有 100 或 200 个线程则弊大于利。因为额外的上下文交换导致操作系统将 CPU 周期花在维护线程而不是处理请求上,所以进程中有太多线程往往会降低服务器的速度。线程适当的数目***通过应用程序的性能测试来确定。
f) 禁用调试模式
在部署生产应用程序或进行任何性能测量之前,始终禁用调试模式。如果启用了调试模式,应用程序的性能可能受到影响。
- < system.web>
- < compilation debug="false">
- …
g) 优化 Web 服务器计算机和特定应用程序的配置文件以符合您的需要
默认情况下,ASP.NET 配置被设置成启用最广泛的功能集并尽量适应最常见的情况。可更改某些默认配置设置以提高应用程序的性能,具体取决于您使用的功能。
1)仅对需要的应用程序启用身份验证
默认情况下,ASP.NET 应用程序的身份验证模式为 Windows 或集成的 NTLM。大多数情况下,***仅对需要身份验证的应用程序在 Machine.config 文件中禁用身份验证,并在 Web.config 文件中启用身份验证。
2)根据适当的请求和响应编码设置来配置应用程序
ASP.NET 默认编码格式为 UTF-8。如果您的应用程序仅使用 ASCII 字符,请配置您的 ASCII 应用程序以获得稍许的性能提高。
3)考虑对应用程序禁用 AutoEventWireup
在 Machine.config 文件中将 AutoEventWireup 属性设置为 false,意味着页面不会将页事件绑定到基于名称匹配的方法(例如 Page_Load)。如果禁用 AutoEventWireup,页面将通过将事件连接留给您而不是自动执行它,获得稍许的性能提升。
如果想要处理页事件,可以使用两种策略之一。***种策略是重写基类中的方法。例如,可以为页加载事件重写 Page 对象的 OnLoad 方法,而不是使用 Page_Load 方法。(务必调用基方法以确保引发所有事件。)第二种策略是使用 Visual Basic 中的 Handles 关键字或 C# 中的委托连接来绑定到事件。
4)从请求处理管线中移除不用的模块
默认情况下,服务器计算机的 Machine.config 文件中 HttpModules 节点的所有功能均保留为活动状态。根据应用程序所使用的功能,您可以从请求管线中移除不用的模块以获得稍许的性能提升。检查每个模块及其功能,并按您的需要自定义它。例如,如果您在应用程序中不使用会话状态和输出缓存,则可以从 HttpModules 列表中移除它们,以便请求在不执行其他有意义的处理时,不必调用这些模块。
本文来自shllove的专栏:《ASP.NET性能优化整理》。
【编辑推荐】