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