IIS 6.0 應用了新的進程模型。內(nèi)核模式的HTTP偵聽程序(Http.sys)接收并發(fā)送HTTP請求(甚至可以使用它的響應緩存來滿足請求)。工作進程注冊 URL子空間,Http.sys將請求發(fā)送到相應的進程(如果使用應用程序池,則發(fā)送到進程集合)。
圖 4 展示了IIS 5.0和IIS 6.0進程模型之間的差異。IIS 5.0使用WinSock在端口80接受連接。請求由 inetinfo 進程負責接收,然后或者在進程內(nèi)執(zhí)行請求,或者將它交給dllhost 進程在進程外進行處理(為了達到隔離的目的)。響應則由 inetinfo 進程發(fā)送回去。

圖 4 IIS 5.0 和 IIS 6.0 的進程模型
IIS 6.0 進程依賴于內(nèi)核模式的Web驅(qū)動程序Http.sys。在新的模型中,Http.sys負責管理連接和處理請求。請求可能通過Http.sys緩存得到滿足,也可能被交給一個工作進程以便得到進一步處理(見圖5)。可以配置多個工作進程,從而以較低開銷實現(xiàn)了隔離。
Http.sys包括了一個響應緩存。當請求與響應緩存中的某個條目相匹配的時候,Http.sys直接從內(nèi)核模式中發(fā)送緩存響應。圖5展示了請求通過Http.sys得到處理的情況(請求也可能向上交給某個工作進程進行處理)。

圖 5 IIS 6.0中的請求處理
由于Web服務器既包括內(nèi)核模式的組件,也包括用戶模式的組件,必須對二者同時進行調(diào)整才能獲得最佳性能。因此,針對特定負載的IIS 6.0調(diào)整工作需要對如下內(nèi)容進行配置:
· Http.sys(內(nèi)核模式驅(qū)動程序)以及相關的內(nèi)核模式緩存。
· 工作進程和用戶模式IIS,包括應用程序池配置。
此外,我們還將在后文中討論會對性能造成影響的其他參數(shù)。
內(nèi)核模式的調(diào)整
與性能有關的Http.sys設置可以劃分為兩類:緩存管理以及連接和請求管理。所有的注冊表設置都保存在以下條目中:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Http\Parameters
如果HTTP服務正在運行,必須首先停止服務,然后重新啟動計算機,以便讓設置生效。
緩存管理設置
Http.sys具有的優(yōu)點之一便是內(nèi)核模式緩存。如果響應位于內(nèi)核緩存中,那么可能可以完全通過內(nèi)核模式來滿足某個HTTP請求,這顯然可以極大降低CPU處理請求的開銷。但是,IIS 6.0的內(nèi)核模式緩存是一種基于物理內(nèi)存的緩存,每個條目都需要占用一定的內(nèi)存空間。
緩存中的條目只有在被使用的時候才能提供益處。但是,條目在任何時候都會占用物理內(nèi)存,不論它是否被使用。所以,需要對緩存某個項目帶來的益處(能夠直接從緩存中滿足請求)以及它在整個生命期中的開銷(需要占用物理內(nèi)存)進行評估,并且考慮可用資源(CPU、物理內(nèi)存)和工作負載的情況。 Http.sys 試圖僅在緩存中保存有用(經(jīng)常被訪問)的項目,但是,如果針對特定工作負載來調(diào)整Http.sys緩存,Web服務器的性能還可以獲得一定程度的提高。
以下是一些有用的Http.sys內(nèi)核模式緩存設置:
· UriEnableCache. 默認值:1。設為非零值可以啟用內(nèi)核模式響應和分段緩存。對于大多數(shù)工作負載,緩存都應該保持啟用。如果希望獲得超低響應和較低的緩存利用率,那么請考慮禁用緩存。
· UriMaxCacheMegabyteCount. 默認值:0。設為非零值可以指定內(nèi)核緩存可以使用的最大內(nèi)存數(shù)量。默認值為0,允許系統(tǒng)自動調(diào)節(jié)緩存能夠使用的內(nèi)存數(shù)量。注意:只能設置可以使用的最大內(nèi)存數(shù)量,而且系統(tǒng)可能不允許緩存增長到指定的大小。
· UriMaxUriBytes. 默認值:262144 字節(jié)(256 KB)。本參數(shù)設定了內(nèi)核緩存中每個條目的最大長度。大于這個長度的響應或分段都不會被緩存。如果有足夠的資金,可以考慮增加此參數(shù)的值。如果資金有限,而且大型的條目會擠掉較小的條目,那么可以將本參數(shù)設為更小的值。
· UriScavengerPeriod. 默認值:120秒。一個“清道夫”程序會定期掃描 Http.sys緩存,在兩次掃描期間沒有被訪問過的條目將被刪除??梢詫呙柚芷谠O置為一個較高的值,以減少掃描次數(shù)。但是,如果訪問頻率低的老條目仍然保留在緩存中,緩存占用的內(nèi)存將不斷增加。如果將此期限設置得過低,掃描頻率會過于頻繁,而且可能導致緩存的過度清洗和擾動。
請求和連接管理設置
此外,Http.sys管理入站HTTP/HTTPS 連接,并且是在這些連接上處理請求的第一個層。它使用內(nèi)部數(shù)據(jù)結構保存有關連接和請求的信息。雖然這樣的數(shù)據(jù)結構可以按需創(chuàng)建(或釋放),但如果在 look-aside里表中保存部分數(shù)據(jù)結構留作備用,則可以實現(xiàn)更高的 CPU 效率。保存這樣的儲備有助于Http.sys利用更少的CPU資源來處理負載波動。注意:負載波動不一定由外部的負載波動而引起。一些旨在改善批處理或者中斷調(diào)解的內(nèi)部優(yōu)化措施也可能導致負載波動和起伏。
儲備有助于減少CPU的使用率和縮短延遲時間,同時能夠增加Web服務器的處理能力,但是也會增加內(nèi)存的使用率。在調(diào)整Http.sys的請求和連接管理行為的時候,需要牢記的因素便是:可用的服務器資源,性能目標以及工作負載的特性。您可以使用以下請求和連接管理設置:
· MaxConnections。 本設置用來控制Http.sys所允許的并發(fā)連接的數(shù)量。每一個連接都會耗用非分頁池(一種寶貴和有限的資源)。默認值的設置相當保守,以限制連接占用的非分頁池數(shù)量。對于配備了充足內(nèi)存的專用Web服務器,如果預計會產(chǎn)生大量的并發(fā)連接,可以將此值設置得更高一些。此值設置得越大,占用的非分頁池就越多,所以要務必小心,應該使用一個與系統(tǒng)配置相適應的正確數(shù)值。
· IdleConnectionsHighMark、IdleConnectionsLowMark和IdleListTrimmerPeriod. 這些值用來控制對非并行使用的連接結構的處理:在某個時間必須提供多少可用的連接(用于處理連接負載的波動)、釋放列表的上下界限、以及連接結構剪切和補充的頻率等。
· RequestBufferLookasideDepth 和 InternalRequestLookasideDepth 這些值控制與緩沖區(qū)管理有關的數(shù)據(jù)結構的處理工作,以及應該完成多少儲備以應付負載波動情況。
用戶模式設置
IIS 注冊表設置
以下注冊表設置可以在下面的條目下找到:
HKLM\System\CurrentControlSet\Services\Inetinfo\Parameters\
· MaxCachedFileSize(REG_DWORD),以字節(jié)為單位。決定了能夠被緩存的文件大小(默認為256 KB)。實際值根據(jù)數(shù)據(jù)表中最大文件的數(shù)量和大小以及可用的RAM數(shù)量而定。對頻繁訪問的大型文件進行緩存可以降低CPU使用率,減少磁盤訪問以及相關的延遲時間。
· MemCacheSize(REG_DWORD),以MB為單位。將IIS用戶模式緩存限制為指定的大?。J設置為根據(jù)可用內(nèi)存的數(shù)量由IIS調(diào)整緩存的大?。?。根據(jù)“熱門”文件集合(頻繁訪問文件的集合)的大小以及RAM數(shù)量或者IIS進程地址空間(正常情況下應該在2GB以下),需要認真選擇本參數(shù)的值。
· DisableMemoryCache(REG_DWORD)。如果設置為1(默認為0),則禁用用戶模式的IIS緩存。在緩存命中率非常小的時候,可以完全禁用緩存,以避免與緩存代碼路徑有關的開銷。
· MaxPoolThreads(REG_DWORD)。設置每個處理器能創(chuàng)建的池線程的最大數(shù)量(默認為 4,范圍不限。)每一個池線程都觀察網(wǎng)絡請求,然后處理它們。MaxPoolThreads 計數(shù)沒有包括當前處理ISAPI應用程序的線程。如果CPU的平均使用率沒有處于最佳狀態(tài),應該增加本參數(shù)的值,因為現(xiàn)有的所有線程都為繁忙狀態(tài),沒有用于處理新請求的可用線程。
· PoolThreadLimit(REG_DWORD)。設置系統(tǒng)能創(chuàng)建的池線程的最大數(shù)量(默認值為處理器數(shù)量的4倍,范圍不限)。PoolThreadLimit 必須大于或等于MaxPoolThreads。正常情況下,PoolThreadLimit = MaxPoolThreads ´ 處理器數(shù)量。僅僅設置其中的一個參數(shù)是不夠的。如果同時指定了MaxPoolThreads 和PoolThreadLimit參數(shù),則可以施加更嚴格的限制。
· ObjectCacheTTL(REG_DWORD),以秒為單位??刂茮]有被訪問過的對象在IIS用戶模式緩存中停留的時間長度(默認值為30秒,如設置為0xFFFFFFFF則禁用對象緩存清道夫線程)。如果系統(tǒng)配備了足夠的內(nèi)存,而且提交的內(nèi)容不經(jīng)常變化,那么可以增加本參數(shù)的值。如果系統(tǒng)內(nèi)存不足而且用戶模式緩存的大小在不斷增長,則應該降低本參數(shù)。請參閱本節(jié)下面的 ActivityPeriod 部分。
· ActivityPeriod(REG_DWORD),以秒為單位。只有當文件在活動期限(默認為10秒鐘,如果設為0則禁用本選項)內(nèi)被重復命中,才允許緩存文件。本參數(shù)會降低由于緩存不經(jīng)常訪問的文件而引起的緩存開銷,如果緩存內(nèi)容變化不大,而且沒有足夠的可用內(nèi)存,那么可以增加活動期限的值;或者,如果緩存上存在大量請求負載,可以降低活動期限的值。
· DataSetCacheSize(REG_DWORD)默認值為50。設置配置數(shù)據(jù)庫數(shù)據(jù)集緩存中虛擬目錄條目的最大數(shù)量。如果已經(jīng)安裝的虛擬目錄的數(shù)量超過了默認值,可以增加本參數(shù)的值。在提交靜態(tài)內(nèi)容的時候,一個容量不足的數(shù)據(jù)集緩存會增加延遲時間(更低的吞吐量和更低的CPU使用率)。
IIS Metabase
以下設置可以在 W3SVC/ 下找到。
· AspMaxDiskTemplateCacheFiles。啟用ASP腳本模板的磁盤緩存。ASP模板的編譯是一件非常耗費處理器資源的工作。內(nèi)存大小限制了可以緩存在內(nèi)存中的模板的數(shù)量。從磁盤上的模板緩存中取回編譯后的模板所需的開銷比編譯ASP內(nèi)存緩存中沒有的模板要小。請參見下文中的 AspScriptEngineCacheMax 一節(jié)。
· AspDiskTemplateCacheDirectory。如果可能,可以將其設置為不頻繁使用的磁盤(例如,沒有和操作系統(tǒng)、分頁文件、IIS日志或者其他頻繁訪問的內(nèi)容共享的磁盤)。默認目錄是 “%windir%\system32\inetsrv\Template Disk cache\ASP Compiled Templates”。
· AspScriptEngineCacheMax。將其設置為內(nèi)存容量所允許的最大的腳本引擎數(shù)(默認為 125)。
· AspScriptFileCacheSize。設置為內(nèi)存容量所允許的最大的ASP模板數(shù)量(默認 250)。請參閱前文中的AspMaxDiskTemplateCacheFiles一節(jié)。
· AspExecuteInMTA。如果在交付某些ASP內(nèi)容時希望對出現(xiàn)的錯誤或故障進行檢測,請將本參數(shù)設置為1(啟用)。例如,如果需要托管多個站點,而且每個站點都運行在它自己的工作進程之下,那么便可以啟用本參數(shù)。錯誤一般可以在事件查看器中的 COM+部分中看到。本設置啟用了ASP中的多線程單元模型(默認值為0,表示禁用)。
· AspProcessorThreadMax。如果當前設置(默認為25)不足以滿足負載的需求(可能會導致某些請求出現(xiàn)錯誤),可以增加本參數(shù)的值。
· CentralBinaryLoggingEnabled。通過將本參數(shù)設置為TRUE,可以啟用集中的二進制日志記錄。二進制IIS日志記錄可以減少對CPU的使用,降低占用的磁盤空間以及減少磁盤I/O操作。集中的二進制日志可以被導向一個二進制文件,而無論托管站點的數(shù)量如何。分析二進制格式的日志需要一個后處理工具。
IIS 工作進程選項(IIS Admin UI、應用程序池屬性)
在沒有管理員干預、服務重啟或者計算機重啟的情況下,IIS管理界面上的IIS工作進程回收選項為發(fā)生的緊急故障或事件提供了有效的解決辦法。這樣的情況包括內(nèi)存泄漏,泄漏會增加內(nèi)存負擔,或者導致工作進程進入不響應或空閑狀態(tài)。在正常情況下,可能不需要啟用回收選項,所以可以關閉它(或者對系統(tǒng)進行配置,以很低的頻率執(zhí)行回收工作)。在下面的章節(jié)中,黑體字名稱是per-app-pool(應用程序池)變量。在使用腳本設置這些變量的時候,可以使用路徑“ /LM/W3SVC/AppPools/n”,在這里n 代表應用程序池索引。
有三個選項,如下表所示:
· 回收選項。可以在“回收”選項卡中找到。
· 性能選項。 可以在“性能”選項卡中找到。
· 工作進程健康監(jiān)視選項。可以在“健康”選項卡中找到。
表 8. 回收選項
|
參數(shù)
|
描述
|
|
PeriodicRestartRequests,DWORD,選項默認為禁用,默認值為35000
|
按照時間定期回收
|
|
PeriodicRestartRequests,DWORD,選項默認為禁用,默認值為35000
|
根據(jù)請求的(累計)數(shù)量定期回收
|
|
PeriodicRestartSchedule, MULTISZ,默認為禁用,默認為空字符串值
|
在指定的時間進行回收
|
|
· PeriodicRestartMemory, DWORD,默認值為512 MB
· PeriodicRestartPrivateMemory, DWORD,默認值為192 MB
|
如果達到了以下兩個條件之一,基于內(nèi)存的回收(默認為禁用)將允許回收工作進程:
· 虛擬內(nèi)存的最大容量
· 已使用內(nèi)存的最大容量
如果面臨不斷增長的內(nèi)存容量壓力,可以其中一個參數(shù)或全部參數(shù),基于嚴格的內(nèi)存容量標準,頻繁回收工作進程,以緩解內(nèi)存壓力。
|
表 9. 性能選項
|
參數(shù)
|
描述
|
|
IdleTimeout,DWORD,以分鐘為單位,默認值為20
|
在進程的空閑時間超過指定的時間時,關閉工作進程。這樣可以節(jié)省有限的內(nèi)存資源,但是如果CPU負載繁重,需要頻繁啟動新的工作進程,則不建議采取這種做法,因為創(chuàng)建進程會帶來一定的開銷。
|
|
AppPoolQueueLength,DWORD,默認值為2000
|
限制每個應用程序池(App-Pool)的內(nèi)核請求隊列的長度。請求會消耗分頁池,在對分頁池具有大量需求的情況下,應該降低本參數(shù)的值。如果超過指定的長度,會導致服務器拒絕請求,并產(chǎn)生編號為503的非自定義錯誤。
|
|
CpuAccounting,BOOLEAN,默認為禁用(0),啟用為1
|
監(jiān)視CPU的使用情況。您可以按照百分比設置CPU的最大使用率(CpuLimit,DWORD,默認值為0)和監(jiān)視工作的刷新周期(CpuResetInterval,DWORD,默認值為0,以分鐘計)。如果達到了CPU的使用率限制,或者不采取任何操作(但是會在事件日志中寫入一個事件),或者關閉工作進程(CPUAction,DWORD,默認值為0,表示“不采取任何操作”;最大值為1,表示“關閉工作進程”)。
|
|
MaxProcesses,默認:使用1個工作進程處理所有請求
|
可以在操作的Web Garden(Web園)模式中控制工作進程的總數(shù)量。在Web Garden模式中,幾個工作進程負責處理單個應用程序池下的請求負載。沒有通過不同的應用程序池為Web站點預先分配任何工作進程。在某些情況下,一個工作進程無法滿足負載的處理需要(可以通過糟糕的CPU使用率和漫長的響應時間看出這一點),增加工作進程的數(shù)量則有助于改善系統(tǒng)的吞吐量和CPU使用率。在托管了多個站點的情況下,可以考慮采用Web Garden模式。此外,在其中一個進程突然崩潰的情況下,采用多個工作進程還提供了更多可靠性,而且?guī)缀醪粫霈F(xiàn)所有服務均中斷的情況。與預先分配應用程序池相比,Web Garden模式更容易設置和控制。
|
表10. 健康選項
|
參數(shù)
|
描述
|
|
PingingEnabled,BOOLEAN, 默認值為1
PingInterval,DWORD,默認值為30秒
|
以固定時間間隔(PingInterval)Ping 工作進程(PingingEnabled)。如果沒有響應,則認為工作進程發(fā)生錯誤,IIS將試圖終止進程并產(chǎn)生一個新的進程。
|
|
RapidFailProtection,BOOLEAN,默認
RapidFailProtectionMaxCrashes, DWORD,默認為5個故障
RapidFailProtectionInterval, DWORD,默認為5分鐘
|
設置在給定的時間段內(nèi)(RapidFailProtectionInterval)允許產(chǎn)生的最大故障數(shù)量(RapidFailProtectionMaxCrashes),對不斷快速產(chǎn)生故障的情況加以控制(RapidFailProtection)。如果到達了指定了故障率,應用程序池將被禁用,并且在事件日志中寫入相關信息。
|
|
StartupTimeLimit,DWORD,默認為90秒
|
控制工作進程的啟動時間,超過此時間,則認為其發(fā)生了故障。
|
|
ShutdownTimeLimit,DWORD,默認為90秒
|
控制工作進程的關閉時間,超過了此時間,則認為其處于不響應狀態(tài)。
|
安全套接字層的調(diào)整參數(shù)
安全套接字層(Secure Sockets Layer,SSL)的使用會加重CPU的負擔。SSL中最為耗費資源的部分為建立會話所需的開銷(包括一次完整的握手),然后是重新連接的開銷和加密/ 解密的開銷。為了獲得更好的SSL性能,請執(zhí)行如下操作:
· 啟用SSL會話的“保持活動”(keep-alive)特性。這樣可以消除建立會話所需的開銷。
· 如果可能,重新使用會話(特別是對于那些沒有“保持活動”的流量)。
· 注意:密鑰越長,安全性就越高,但是需要的CPU時間就越多。
· 注意:并不是所有的頁面組件都需要加密。但是,混合的純文本HTTP和HTTPS可能會導致客戶端瀏覽器彈出一個警告,告知并不是所有的頁面內(nèi)容都得到了保護。
ISAPI
對于ISAPI,沒有任何具體的調(diào)整參數(shù)。如果編寫一個私有的ISAPI擴展,請確保代碼在執(zhí)行和資源使用方面具有高效率。請參閱后文中的 影響IIS性能的其他問題。
托管代碼調(diào)整參數(shù)
· 確信已經(jīng)預先編譯了所有的腳本??梢栽诿總€目錄中調(diào)用一個.NET腳本來完成這項工作。在編譯完成之后,需要復位IIS。在修改了 Machine.config、 Web.config或任何.aspx腳本之后需要重新編譯。
· 如果不需要會話狀態(tài)信息,請確信在每個頁面中關閉了此項目。
· 當用戶在隔離模式(每個站點一個應用程序池)下運行包含ASP.NET腳本的多個主機的時候,應該監(jiān)視內(nèi)存使用情況。請根據(jù)預計將要并發(fā)運行的應用程序池的數(shù)量,為IIS服務器配備足夠的內(nèi)存??紤]在存在多個隔離進程的地方使用多個應用程序域(app-domains)。
影響IIS性能的其他問題
· 安裝沒有緩存意識的過濾器。安裝沒有HTTP緩存意識的過濾器會導致IIS禁用全部緩存,從而造成性能急劇下降。老的ISAPI過濾器(在IIS 6.0之前編寫的過濾器)可能會存在這個問題??梢允褂肏TTP緩存的過濾器在配置數(shù)據(jù)庫中被標記為“具有緩存意識”的過濾器。
· CGI 請求。出于性能的考慮,我們不建議使用CGI應用程序處理請求。由于需要頻繁創(chuàng)建(和刪除)CGI進程,會產(chǎn)生大量的系統(tǒng)開銷。更好的替代辦法是使用ISAPI程序和ASP(或ASP.NET)腳本。這些方式都可以使用隔離。
NTFS 文件系統(tǒng)設置
HKLM\System\CurrentControlSet\Control\FileSystem\ 下的 NtfsDisableLastAccessUpdate (REG_DWORD)1。
通過禁止更新最后一次訪問的文件或目錄的日期和時間戳記,這個針對整個系統(tǒng)的開關參數(shù)會降低磁盤I/O負載和縮短延遲。默認情況下本鍵不存在,因此需要額外添加。如果操作包含數(shù)千個目錄的大型數(shù)據(jù)集(或者大量主機),禁用更新的效果十分明顯。如果只需要保留信息Web供Web管理使用,我們建議用戶使用IIS日志代替它。
警告:某些應用程序(例如增量備份工具)需要使用這些更新信息,如果沒有這些信息,它們將無法正常工作。