【参加讨论】对 ASP.NET 框架应用程序最重要的要求之一是可靠性。在服务器进程内运行的应用程序(在 IIS 中为 Inetinfo.exe)的结构没有为生成可继续长时间运行的可靠应用程序提供坚实的基础。有太多的资源在进程级别上共享,而且一个错误便使整个服务器进程崩溃的事情也太容易发生。
为解决此问题,ASP.NET 提供了一个进程外执行模型,保护服务器进程不受用户代码的干扰。它还使您能够对进程的生存期应用直观推断法,以提高 Web 应用程序的可用性。通过使用异步进程间通讯,可以在性能、可缩放性和可靠性之间实现最佳平衡。
进程模型配置
进程模型设置在计算机的根配置文件 Machine.config 中公开。配置节命名为 <processModel>,如下例所示。默认情况下启用进程模型 (enable="true")。
<processModel
enable="true"
timeout="infinite"
idleTimeout="infinite"
shutdownTimeout="0:00:05"
requestLimit="infinite"
requestQueueLimit="5000"
memoryLimit="80"
webGarden="false"
cpuMask="0xffffffff"
userName=""
password=""
logLevel="errors"
clientConnectedCheck="0:00:05"
/>
这些设置中的大多数控制何时启动新的辅助进程为请求服务(正常取代旧的辅助进程)。进程模型支持两种类型的回收:主动和被动。
被动进程回收
当进程行为失常或无法为请求服务时,发生被动进程回收。进程一般会显示可检测到的征兆,如死锁、访问冲突、内存泄漏等,以便触发进程回收。可使用下表中描述的配置设置来控制触发重新启动进程所依据的条件。
| 设置 |
说明 |
| requestQueueLimit |
处理死锁条件。此 DWORD 值被设置为队列中允许的最大请求数,超过这个数则认为辅助进程行为失常。当超出此数值时,会启动新的进程并重新分配请求。默认值为 5000 个请求。 |
| memoryLimit |
处理内存泄漏条件。此 DWORD 值被设置为辅助进程可使用的物理内存的百分比,超过这个数则认为辅助进程行为失常。当超出此百分比时,会启动新的进程并重新分配请求。默认值为 80%。 |
| shutdownTimeout |
指定辅助进程自身正常关闭所用的时间(时:分:秒格式的字符串值)。如果超时到期,ASP.NET ISAPI 将关闭辅助进程。默认值为“00:00:05”。 |
主动进程回收
主动进程回收定期重新启动辅助进程,即使该进程十分正常。在这可能是防止服务由于进程模型无法检测到的条件而被拒绝的有用方法。进程可在超过特定的请求数后或超时期限已到时重新启动。
| 设置 |
说明 |
| timeout |
时:分:秒格式的字符串值,用于配置时间限制,超过此限制后将启动新的辅助进程以取代当前进程。默认值为 infinite,此关键字指示不应重新启动进程。 |
| idleTimeout |
时:分:秒格式的字符串,用于配置不活动的时间量,超过这个量后辅助进程将自动关闭。默认值为 infinite,此关键字指示不应重新启动进程。 |
| requestLimit |
设置为请求数的 DWORD 值,超过这个数后将启动新的辅助进程以取代当前进程。默认值为 infinite,此关键字指示不应重新启动进程。 |
记录进程模型事件
进程模型可在发生进程循环时向 Windows 事件日志写入事件。这由 <processModel> 配置节中的 logLevel 属性控制。
| 设置 |
说明 |
| logLevel |
控制向事件日志中记录进程循环事件。其值可以是:
- All:记录所有进程循环事件。
- None:不记录事件。
- Errors:仅记录意外事件。
|
发生循环事件时,如果为该事件启用了记录,则向应用程序事件日志写入以下事件。
| 关闭原因 |
事件日志类型 |
说明 |
| Unexpected |
错误 |
ASP.NET 辅助进程已意外关闭。 |
| RequestQueueLimit |
错误 |
因为超出了请求队列限制,ASP.NET 辅助进程已重新启动。 |
| RequestLimit |
信息 |
因为超出了请求限制,ASP.NET 辅助进程已重新启动。 |
| Timeout |
信息 |
因为超时间隔已到,ASP.NET 辅助进程已重新启动。 |
| IdleTimeout |
信息 |
因为空闲超时间隔已到,ASP.NET 辅助进程已关闭。 |
| MemoryLimitExceeded |
错误 |
因为超出了进程的内存限制,ASP.NET 辅助进程已重新启动。 |
启用网络园
进程模型帮助启用多处理器计算机上的可缩放性,将工作分发给多个进程(每个 CPU 一个),并且每个进程都将处理器关系设置为其 CPU。这样就消除了处理器间的锁争用,是大型 SMP 系统的理想选择。此技术称为 Web 园艺。启用网络园的配置设置在下表中列出。注意,这些设置仅在服务器重新启动后才生效。为使此更改发生,IIS 必须循环。
| 设置 |
说明 |
| webGarden |
控制 CPU 关系。True 指示进程应同相应的 CPU 有关。默认值为 False。 |
| cpuMask |
控制进程的数目和网络园的工作机制。为每个 CPU 启动一个进程,其中将掩码中的相应位设置为 1。当 UseCPUAffinity 设置为 0 时,cpuMask 设置仅控制辅助进程的数目(设置为 1 的位数)。允许的最大辅助进程数是 CPU 的数目。默认情况下,启用所有的 CPU,并启动同 CPU 数目相同的辅助进程。默认值为 0xffffffff。 |
您应了解 Web 园艺的一些副作用:
- 如果应用程序使用会话状态,则它必须挑选一个进程外提供程序(NT 服务或 SQL)。
- 应用程序状态和应用程序静态基于每个进程,而不是基于每台计算机。
- 缓存基于每个进程,而不是基于每台计算机。
- ASP.NET 提供了一个进程外执行模型,使服务器进程免受用户代码的干扰。它还使您能够对进程的生存期应用直观推断法,以提高 Web 应用程序的整体可用性。
- <processModel>设置在计算机的 Machine.config 文件的根配置文件中公开。默认情况下启用进程模型。
- 进程模型支持两种类型的回收:主动和被动。当进程行为失常或无法为请求服务时,发生被动进程回收。主动进程回收定期重新启动辅助进程,即使该进程可能十分正常。
- 进程模型可在发生进程循环时向 Windows 事件日志写入事件。这由 <processModel> 配置节中的 log-level 属性控制。
- 进程模型帮助启用多处理器计算机上的可缩放性,将工作分发给多个进程(每个 CPU 一个),并且每个进程都将处理器关系设置为其 CPU。此技术称为 Web 园艺。