什麼是應用程序池呢?這是微軟的一個全新概念:應用程序池是將一個或多個應用程序鏈接到一個或多個工作進程集合的配置。因為應用程序池中的應用程序與其他應用程序被工作進程邊界分隔,所以某個應用程序池中的應用程序不會受到其他應用程序池中應用程序所產生的問題的影響。
Windows 2003同時支持兩種工作模式,默認為ISS 6.0工作進程隔離模式。工作進程隔離模式防止一個應用程序或站點停止了而影響另一個應用程序或站點,大大增強了IIS的可靠性。那麼如何設置兩種工作模式呢?
啟動IIS管理器,右擊網站,選擇“屬性”,打開屬性對話框(圖1)。
在IIS 6.0工作進程隔離模式下,所有的應用程序代碼都在隔離環境中運行,它們是如何進行隔離的呢?Windows 2003新增了應用程序池,工作進程隔離模式允許客戶創建多個應用程序池,每個應用程序池都可以有不同的配置。因為這些應用程序池直接從內核(而非WWW 服務)接收它們的請求,所以性能和可靠性得到了增強。要隔離運行在同一台計算機上但屬於不同網站的Web應用程序,需要為每個網站創建單獨的應用程序池。
創建應用程序池
在IIS管理器中,打開本地計算機,右鍵單擊“應用程序池”,選擇新建“應用程序池” (必須在工作進程隔離模式下才能建立應用程序池) 。“應用程序池名稱”框中,輸入新的應用程序池名稱。如果在“應用程序池 ID”框中出現的 ID (如:AppPool #1)不是您想要的,可進行重命名。如果您單擊了“將現有應用程序池作為模板”,請在“應用程序池名稱”框中右鍵單擊想要用來作為模板的應用程序池。最後 單擊[確定]。
指派應用程序池
在 IIS 管理器中,右鍵單擊您要為其指派應用程序池的應用程序,然後單擊“屬性”。 單擊“主目錄”選項卡,確認您正在指派的目錄或虛擬目錄的“應用程序名”是否已被填寫。如果“應用程序名”框尚未被填寫,請單擊“創建”,然後輸入名稱。
在“應用程序池”列表框中,選擇您想要為其指派的應用程序池的名稱。最後單擊[確定]。
一起來看看有關應用程序池的一些問題。應用程序池的“屬性”對話 框有四頁——回收,性能,運行狀況,標識,如圖六所示。在這些選項頁中,最引人注目的恐怕就是“回收”頁,使用該選項頁可以管理工作進程的回收。在工作進 程隔離模式中,IIS可以配置成定期重新啟動應用程序池中的工作進程,從而更好地管理那些有錯誤的工作進程。這確保了池中的應用程序運行正常,並且可以恢 復丟失的系統資源。為了回收工作進程,失敗工作進程接收請求的能力將被限制,直到它處理完存儲在請求隊列中的所有剩余請求。為了排出當前請求,可以給予進 程配置限制。同一命名空間組的替換工作進程在舊的工作進程停止前啟動,從而防止服務中斷。舊的進程完成其未決的請求,然後正常關閉,或者如果在達到了配置 的時間限制、請求數、設置的時間計劃,或當達到指定的內存用量限制後仍沒有關閉,則明確地終止進程。默認情況下,應用程序池每隔1740分鐘(29小時)回收一次。
W3SVC根據“運行狀況”頁的選項來判斷應用程序池運行是否正常,包括:每隔指定的時間Ping工作進程,時間按秒計,默認值30秒啟動時間 限制 (工作進程必須在指定的時間內開始)關閉時間限制(工作進程必須在指定的時間內關閉)是否啟動快速失敗保護(如果在指定的時間段內一定數目的工作進程發生 失敗,則禁用應用程序池)。另外,ISAPI應用程序(包括ASP.NET和asp.dll)可以聲明自己不再適合提供服務,要求回收。
默認情況下,當IIS 6.0回收一個池時,它會使用一種稱為overlapped recycle的回收技術。在這種回收模式下,失敗的工作進程仍會保持運行狀態,同時創建一個新的工作進程。IIS 6.0把新傳入的請求傳遞給新的工作進程,但不拆除老的工作進程,直至老的工作進程處理完它隊列中的請求,或者遇到超時錯誤。在此期間,TCP/IP連接 不會丟失,因為有http.sys保持著連接的有效性。當失敗的工作進程超時出錯時,下一個請求傳遞給工作進程的請求是新的請求,因此原來保存在進程中的 會話信息就會丟失。所有這類回收操作都自動進行,無需管理員干預,而且在大多數情況下,不會造成明顯的服務中斷現象。如有必要,可以將配置數據屬性 LogEventOnRecycle的值設置為1,指示W3SVC執行回收操作時生成一條事件日志記錄。
對於那些不能以多個實例運行的應用程序,overlapped recycle回收技術可能引起問題。如果遇到這類問題,可以將配置數據屬性DissallowOverlappingRotation的值設置成 True(1),關閉某個應用程序池回收操作時的進程“重疊”現象。另外,對於失敗的工作進程,有時我們可能不想將它拆除,仍舊保留該進程,以便檢測和尋 找發生問題的根源,這時可以將配置數據屬性OrphanActionExe設置成執行文件的名字,使得工作進程成為“孤兒”時執行文件仍保持運行狀態。
另一個與應用程序池有關的特性是,IIS 6.0允許將應用程序池配置成一個Web園(Web Garden)。要理解Web園的概念,可以設想這樣一種情形:假設有一個IIS 5.0服務器和三個Web網站,每一個Web網站運行著相同的應用程序,如果IIS 5.0能夠自動按照圓形循環的模式將請求依次發送給這些功能上等價、實際上分離的Web網站,將負載分離到三個不同的進程,就可以構成一個小型的Web農 場(Web Farm)——這就是Web園。
在IIS 6.0的Web園中,我們不必創建額外的Web網站,只要指定用於某個應用程序池的工作進程的數量就可以了。具體的配置步驟是:打開應用程序池的“屬性” 對話框,轉到“性能”頁,在“Web園”下面的“最大工作進程數”輸入框中輸入進程數量,如圖八。當服務器的負載較小,不需要額外的工作進程時,IIS 6.0在一定的時間後(默認20分鐘,可配置)自動縮減實際的工作進程數量如果負載變大,需要額外的工作進程,IIS 6.0再次增加工作進程數量。這一切操作都自動進行,不需要管理員干預。
兩個新的配置數據屬性——SMPAffinitze和SMPAffinitzeCPUMask——允許配置為工作進程指派的特定處理器:將SMPAffinitized屬性設置成true表示應該把分配給應用程序池的特定工作進程指派給特定的CPU,SMPProcessorAffinityMask屬性用來配置十六進制的處理器掩碼,該十六進制處理器掩碼指出應用程序池中的工作進程應該綁定到哪個CPU。
指定標識應用程序池設置
這些回收應用程序池設置是在應用程序池的屬性對話框的“標識”選項卡中指定的。
設置標識應用程序池設置
應用程序池“屬性”對話框的“標識”選項卡
“用戶名”和“密碼”分別是等效於 username 和 password ASP.NET 進程模型設置的應用程序池設置。這兩種設置結合使用來使輔助進程使用指定的 Windows 標識運行。默認情況下,輔助進程使用“網絡服務”(Network Service) 帳戶。但是,如果選擇了“可配置”單選按鈕並且“用戶名”和“密碼”文本框包含有效值,則輔助進程將使用指定的 Windows 標識。此外,必須將 Windows 標識添加到 IIS_WPG 用戶組。
將 Windows 標識添加到 IIS_WPG 用戶組
這些回收應用程序池設置是在應用程序池的屬性對話框的“健全”選項卡中指定的。
設置健全應用程序池設置
應用程序池“屬性”對話框的“健全”選項卡
“啟用 ping”是等效於 pingFrequency ASP.NET 進程模型設置的應用程序池設置。它指定 ASP.NET ISAPI 檢查輔助進程是否存在的時間間隔。如果沒有輔助進程,則重新啟動輔助進程。默認情況下“啟用 ping”是啟用的而且設置為 30 秒。通過更改數值調節框中的值,可以指定一個不同的時間間隔。若要禁用 ping 操作,請清除“啟用 ping”復選框。
“關閉時間限制”是等效於 shutDownTimeout ASP.NET 進程模型設置的應用程序池設置。它指定提供給輔助進程的用來正常關閉的時間長度。如果輔助進程在指定的時間長度內沒有關閉,則 ASP.NET ISAPI 將結束該輔助進程。默認情況下“關閉時間限制”設置為 90 秒。通過更改數值調節框中的值,可以指定一個不同的時間限制。
通過性能應用程序池設置,可以控制輔助進程的操作。以下幾節描述如何指定性能應用程序池設置。
性能應用程序池設置是在應用程序池的屬性對話框的“性能”選項卡中指定的。
設置性能應用程序池設置
應用程序池“屬性”對話框的“性能”選項卡
“網絡園”是等效於 webGarden 和 cpuMask ASP.NET 進程模型設置的應用程序池設置。若要啟用“網絡園”,請將“輔助進程的最大數目”設置為高於 1 的值。該值還為應用程序池確定最大進程數。
因為網絡園支持使用多個進程,所以,每一進程在應用程序狀態、進程內會話狀態、緩存和靜態數據方面都有其自己的副本。網絡園不應用於所有應用程序,尤其在這些應用程序需要維護狀態的情況下。在決定網絡園模式是否適用前,一定要檢查應用程序的性能。
在使用網絡園時,理解會話狀態和循環工作的方式是十分重要的。考慮其他應用程序池設置影響應用程序的方式也是十分重要的。
在使用會話狀態時,請注意,輔助進程隔離模式不支持將請求傳送回引起請求返回的進程。當一個應用程序運行在處於 ASP 會話狀態或應用程序狀態的網絡園中時,該應用程序需要將其請求發送回發起的進程。在使用 IIS 6.0 應用程序池時,要確保應用程序讓一個連接總保持為打開狀態,以便其請求被發送回適當的進程。如果此連接沒有保持為打開狀態,則請求將被發送到為網絡園提供 服務的下一可用的輔助進程。
循環是一種用於應用程序的負載平衡方法。在每個請求到達時,它會自動被發送到下一可用進程。例如,如果網絡園具有 4 個進程,則請求被發送到進程 0、1、2 和 3,並依照這一順序發送。然後為其他請求重復該循環。
某些應用程序池設置具有特定於網絡園的行為。下表總結了這些行為。
注意 如果進程崩潰,則向替代進程提供PeriodicRestartTime 的運行時值。這使得崩潰的進程可以在指定的PeriodicRestartTime 內與其他進程一起回收。PeriodicRestartRequests 此參數的含義在網絡園中發生了變化。在網絡園中,此參數指定在達到某一請求數目後回收所有進程。進程在指定的請求數目內按平均時間間隔輪流回收。例如,如果網絡園具有四個進程並且PeriodicRestartRequests 設置為 40,000 個請求,則第在 10,000 個請求後回收一個進程,在 20,000 個請求後回收第二個進程,依此類推。在回收了第一組進程後,將向下一組進程指派 40,000 這一 PeriodicRestartRequests 值。 PeriodicRestartSchedule 網絡園中沒有行為更改。如果管理員決定使用基於時間表的回收,則同時回收所有網絡園進程。 PingInterval 網絡園中沒有行為更改。 PingResponseTime 網絡園中沒有行為更改。 PingingEnabled 網絡園中沒有行為更改。 RapidFailProtection 網絡園中沒有行為更改。例如,在一段時間間隔內計算整個網絡園的失敗總數然後進行比較。這提供了額外的恢復能力。 RapidFailProtectionInterval 網絡園中沒有行為更改。例如,在一段時間間隔內計算整個網絡園的失敗總數然後進行比較。這提供了額外的恢復能力。 RapidFailProtectionMaxCrashes 網絡園中沒有行為更改。例如,在一段時間間隔內計算整個網絡園的失敗總數然後進行比較。這提供了額外的恢復能力。 SMPAffinitized 網絡園中沒有行為更改。 SMPProcessorAffinityMask 在 IIS 5.0 隔離模式中,您只能具有與 CPU 的數目一樣多的輔助進程。在輔助進程隔離模式中,多個 CPU 可用於單個輔助進程。 ShutdownTimeLimit 網絡園中沒有行為更改。 StartupTimeLimit 網絡園中沒有行為更改。
“空閒超時”是等效於 idleTimeout ASP.NET 進程模型設置的應用程序池設置。它指定輔助進程或應用程序池在開始處於不活動狀態後,過多長時間將其關閉。默認情況“空閒超時”是啟用的而且設置為 20 分鐘。通過更改數值調節框中的值,可以指定一個不同的時間限制。若要禁用“空閒超時”,請清除該復選框。
“請求隊列限制”是等效於 restartQueueLimit ASP.NET 進程模型設置的應用程序池設置。它指定在異常終止後等待輔助進程啟動時在 ASP.NET ISAPI 中排隊的請求的最大數目。默認情況下“請求隊列限制”是啟用的而且設置為 1000 個請求。通過更改數值調節框中的值,可以對排隊的請求的數目指定不同的限制。若要禁用“請求隊列限制”,請清除該復選框。
通過回收應用程序池設置,可以控制如何恢復系統資源。以下幾節介紹如何指定回收應用程序池設置。
回收應用程序池設置是在應用程序池的屬性對話框的“回收”選項卡中指定的。
設置回收應用程序池設置
應用程序池“屬性”對話框的“回收”選項卡
“內存回收”是等效於 memoryLimit ASP.NET 進程模型設置的應用程序池設置。它指定輔助進程可以使用的最大內存量。如果輔助進程超出了這一數量,將創建新的進程來替換它,並且當前所有請求都被重新分配給該新進程。在 memoryLimit ASP.NET 進程模型設置與“內存回收”應用程序池設置之間有兩個重要的區別:
“回收輔助進程”是等效於 requestLimit ASP.NET 進程模型設置的應用程序池設置。它指定導致輔助進程或應用程序池被回收的請求的數目。默認情況下“回收輔助進程”是禁用的。若要啟用“回收輔助進程”,請選取該復選框並在數值調節框中指定請求數。
“回收多個輔助進程”是等效於 timeout ASP.NET 進程模型設置的應用程序池設置。它指定回收輔助進程或應用程序池的時間間隔。默認情況下“回收多個輔助進程”是啟用的而且設置為 120 分鐘。通過更改數值調節框中的值,可以指定一個不同的時間間隔。若要禁用“回收多個輔助進程”,請清除該復選框。