# 关于进程回收

## 概述

IIS 允许一些应用程序以进程外 (OOP) 方式运行，这时，这些应用程序要由与 IIS 分离的 DLLHost.exe 进程托管。进程回收调整 COM+ 所建立的基础结构，以执行这些 OOP 应用程序的进程回收。特别是，IIS 依赖于 COM+ 中的 RecycleProcess() 方法，将它作为向 COM+ 发出指示、要求回收 DLLHost.exe 进程所托管的应用程序的一种手段。有关何时可能需要回收某个应用程序的详细信息，请参阅应用程序问题。

## 应用程序问题

由于代码编写的不完善，随着时间的推移，应用程序的性能会越来越低，有时会陷于某一循环中，导致不必要的 CPU 负载。这些应用程序还可能导致内存泄漏，这时应用程序不再将不需要的内存释放回操作系统。这些应用程序可能会导致服务器停止运行，因此需要重新启动服务器。进程回收就是为解决这些问题而创建的。

## 如何进行进程回收

进程回收的工作方式是，在发生所配置的回收事件时，回收应用程序或应用程序池。回收 OOP 应用程序的原理很简单：IIS 调入 COM+ RecycleProcess() 方法，以请求回收由 DLLhost.exe 托管的应用程序进程。触发回收事件后，将发生下列事件：

- 创建新的进程，以为对被回收应用程序的新的应用程序请求提供服务。
- 给予被回收的进程一些时间，以便完成对旧的应用程序请求的处理。时间间隔是用 ShutdownTimeLimit 配置数据库关键字配置的。
- 如果达到 ShutdownTimeLimit，而旧的进程还没停止，那么 IIS 将终止旧进程。

有关 COM+ RecycleProcess 的详细信息，请在 COM+（组件服务）Platform SDK 中搜索关键字“RecycleProcess”。

## 共用的和独立的应用程序

可以将应用程序配置为下列三种方式之一运行。。IIS 5.0 引入了一个术语“隔离级别”来描述这些选项。这三种隔离级别为“低”、“中”和“高”。应用程序的配置是使用 Internet 信息服务管理单元在“主目录”属性页上完成的。

- 低 (IIS) 应用程序可以在 IIS 主进程 inetinfo.exe 中运行，也称为进程内运行。不应在 IIS 进程内运行应用程序，除非已对这些应用程序进行了彻底测试。如果在此进程内运行的应用程序发生故障，会同时导致 IIS 和以进程内方式运行的所有其他应用程序都发生故障。以进程内方式运行的应用程序是不能回收的。
- 中（共用） 共用应用程序是以 OOP 方式运行的，并且由公用的 DLLHost.exe 进程托管。“进程回收”是在配置数据库的 W3SVC 级别为所有共用应用程序配置的，所有共用程序都回收在一起。
- 高（独立） 独立的应用程序以 OOP 方式运行，每个应用程序各由一个 DLLHost.exe 进程托管。独立应用程序的回收是各自分别进行的。可以在独立应用程序所在的任何配置数据库级别配置进程回收。

级别与继承对可以配置“进程回收”的配置数据库级别进行了说明。有关配置进程回收的信息，请参阅配置进程回收事件。有关以进程内或进程外方式运行应用程序的详细信息，请参阅关于应用程序。

## 回收事件

要触发回收事件，可以配置三种事件，这三种事件可以同时处于活动状态。它们如下所述：

### 进程回收事件摘要

下面列出了可以配置用来触发进程回收事件的配置数据库关键字名称。

- 创建时间
  在运行了预先确定的一段时间之后，才对应用程序进行回收。此属性使用 PeriodicRestartTime 配置数据库关键字配置。
- 请求数
  在收到预先确定的某个数量的请求后，才对应用程序进行回收。此属性使用 PeriodicRestartRequests 配置数据库关键字配置。
- 预定时间
  在预先确定的一天中的某个时间对应用程序进行回收。此属性使用 PeriodicRestartSchedule 配置数据库关键字配置。

### 了解触发的事件

当使用一个以上的事件触发回收时，所达到的第一个事件阈值会使 IIS 回收应用程序的 DLLhost.exe 进程。PeriodicRestartTime 和 PeriodicRestartRequests 事件使用内部计时器从零数到在配置数据库关键字中设置的值。当计数器达到配置数据库关键字中设置的值时将对进程进行回收，并且内部计数器重置为零。另外，PeriodicRestartTime 和 PeriodicRestartRequests 内部计数器还互相影响，如下所述。

- 当 PeriodicRestartTime 事件触发时： 回收进程，PeriodicRestartTime 和 PeriodicRestartRequests 内部计时器重置为零。
- 当 PeriodicRestartRequests 事件触发时： 回收进程，PeriodicRestartTime 和 PeriodicRestartRequests 内部计时器重置为零。
- 当 PeriodicRestartSchedule 事件触发时： 回收进程，PeriodicRestartTime 和 PeriodicRestartRequests 内部计时器重置为零。PeriodicRestartSchedule 事件以时钟时间为准，不会被重置，也不受其他两个事件的影响。

要点 内部计时器只从配置数据库中读取数据，而不重置配置数据库的值。不要将内部计时器与默认配置数据库关键字参数混淆。

注意 PeriodicRestartTime 和 PeriodicRestartRequests 的默认配置数据库关键字参数为零，因而会禁用这些功能。默认情况下，根本没有配置 PeriodicRestartSchedule 事件。级别与继承主题详细描述了与“进程回收”事件有关的配置数据库关键字。

有关配置“进程回收”事件的信息，请参阅配置回收事件。有关配置级别和继承的信息，请参阅级别与继承。

## 相关资源

下列资源提供了相关信息：

- 关于应用程序 有关应用程序的概念性信息，它们的起始点，以及应用程序可在其中运行的各种不同进程。
- 独立应用程序 有关如何配置应用程序，使其在各种不同进程中运行的逐步说明。

© 1997-2001 Microsoft Corporation. 保留所有权利。