概述
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 事件。級別與繼承主題詳細描述了與“進程回收”事件有關的配置資料庫關鍵字。