更新:2007 年 11 月
本主题讨论可用于提高 Web 应用程序性能的设计、配置、编译和内存选项。
异步编程模型
ASP.NET 支持异步编程技术,该技术允许将长时间运行的任务(如数据库查询)转移到独立于主应用程序线程运行的线程。可以使用以下技术:
BackgroundWorker组件 System.ComponentModel 命名空间中的 BackgroundWorker 类使您可以将耗时任务的代码添加到 DoWork 事件处理程序,并调用 RunWorkerAsync 方法来引发 DoWork 事件。在辅助方法以异步方式运行的同时,发出调用的线程继续运行。当该方法完成时,BackgroundWorker 组件通过引发 RunWorkerCompleted 事件向发出调用的线程发出警报。有关更多信息,请参见 BackgroundWorker 组件。
基于事件的异步编程 基于事件的异步模式可以采用多种形式,具体取决于某个特定类支持的操作的复杂程度。最简单的类可能只有一个方法名称Async 方法和一个对应的方法名称Completed 事件。更复杂的类可能有若干个方法名称Async 方法(每种方法都有一个对应的方法名称Completed 事件),以及这些方法的同步版本。这些类分别支持各种异步方法的取消、进度报告和增量结果。
异步方法可能还支持多个挂起的调用(多个并发调用),允许您的代码在此方法完成其他挂起的操作之前调用此方法任意多次。若要正确处理此种情况,必须让您的应用程序能够跟踪各个操作的完成。
有关此模式及其实现的完整描述,请参见基于事件的异步模式概述。
使用 IAsyncResult 异步编程 使用 IAsyncResult 设计模式的异步操作作为两种名为 Begin操作名称和 End操作名称的、分别用于开始和结束异步操作名称的方法来实现。Begin操作名称立即返回对调用线程的控制。End操作名称方法结束异步操作名称。对 End操作名称的调用的计时很重要,因为如果操作名称还未完成,它将阻止调用线程。有关更多详细信息,请参见异步编程概述。
Clients callbacks 在客户端回调中,客户端脚本函数向 ASP.NET 网页发送请求而没有回发开销。
有关使用这其中一些技术的示例,请参见基于事件的异步模式技术示例。
编译和配置选项
编译和配置应用程序的方式影响应用程序的性能。下列准则提供了使整个 Web 应用程序有效工作的建议:
如果有一个大型 Web 应用程序,则对其进行预编译。
在 Internet 信息服务 5.0 上运行 ASP.NET Web 应用程序时回收进程。
如有必要,调整应用程序每个辅助进程的线程数量。对于大量依赖外部资源的应用程序,可考虑在多处理器计算机上启用“网络园艺 (Web gardening)”。
禁用调试模式。
使用以下技术调整 Web 服务器计算机和特定应用程序的配置文件,以适应自己的需要:
仅对需要身份验证的应用程序启用身份验证。
配置应用程序以使用适当的请求和响应编码设置。
考虑禁用应用程序的 AutoEventWireup。
从请求处理管线移除未使用的模块。
有关更多详细信息,请参见性能概述。
缓存配置选项
若要提高应用程序性能,可在以下级别配置缓存:
应用程序 在应用程序的 Web.config 文件中,可以使用 OutputCacheSection 元素控制整个应用程序的缓存。使用 OutputCacheSettingsSection 元素可以设置缓存配置文件,然后可以将这些配置文件应用于各个页面。
计算机 您可以在 Machine.config 文件中配置与在 Web.config 文件中可以配置的相同选项。
页 通过应用在配置文件中定义的缓存配置文件,可以配置单个页中的缓存。也可以在 @ OutputCache 指令中配置各个缓存属性 (Property),或者通过设置页的类定义中的属性 (Attribute) 进行配置。
控件 通过设置用户控件文件中的 @ OutputCache 指令,或设置该控件的类定义中的 PartialCachingAttribute 属性,您可以配置用户控件缓存。
有关更多信息,请参见 ASP.NET 中的缓存配置。
IIS 6.0 的内存回收
如果应用程序包含导致问题的代码(例如带有已知内存泄露的 COM 互操作 应用程序),并且无法容易地重新编写代码,则通过定期回收为该应用程序提供服务的辅助进程来限制问题的范围可能很有用。辅助进程回收替换应用程序在内存中的一个实例。IIS 6.0 可以通过重新启动分配到应用程序池的辅助进程来自动回收辅助进程。这样有助于保持应用程序平稳运行。
在回收期间保留状态
如果有一个应用程序池,其中的应用程序依赖状态数据,则您必须决定是否要回收分配到该应用程序池的辅助进程。在回收辅助进程时,进程中保留的应用程序状态数据会丢失。在这样情况下,可以选择不使用回收。
通过在辅助进程之外保留状态数据(例如在数据库中),可以既回收进程又解决状态问题。但是,在进程外保留状态数据以允许回收可能会以下列方式影响服务器性能:
由于在应用程序和数据存储区之间移动数据所需的管理开销而降低性能。
回收刷新任何进程内数据缓存,因此需要重新生成缓存。
ASP.NET 提供了使用会话状态服务或 SQL 数据库保存会话状态的选项。有关更多信息,请参见会话状态模式。
有关更多信息,请参见 Recycling Worker Processes(回收辅助进程)(IIS 6.0)。
本机映像服务
本机映像服务是一种生成和维护本机映像的 Windows 服务,这些本机映像是包含已编译的处理器特定的机器码的文件。本机映像服务允许将本机映像的安装和更新推迟到计算机空闲时进行。本机映像生成器 (Ngen.exe) 是一种提高托管应用程序性能的工具。Ngen.exe 创建本机映像并将它们安装到本地计算机上的本机映像缓存中。运行时可从缓存中使用本机映像,而不是使用实时 (JIT) 编译器编译原始程序集。
有关更多信息,请参见 MSDN Magazine 网站上的文章 NGen Revs Up Your Performance with Powerful New Features(NGen 通过强大的新功能提高性能)。
全局程序集缓存和工作集
进程的工作集是物理 RAM 内存中当前对进程可用的内存页的集合。这些内存页是常驻内存,可供应用程序使用,而不会触发页面错误。可以使用 PeakWorkingSet 和 WorkingSet 属性监视工作集的大小。将程序集放在全局程序集缓存中可减小应用程序的工作集。建议将此选项主要用于中间层和共享程序集。