构建高性能.NET应用之配置高可用IIS服务器-第一篇:IIS必须掌握的知识
??正確而合理的配置IIS是構建一個高性能和高可擴展應用的基礎。雖然很多的時候采用默認的配置就已經可以處理一般的情況,但是隨著站點應用的發展,特別是當訪問量稍微大一點的時候,就會暴露出很多我們認為的“奇奇怪怪”的問題。
??????? 所以,對IIS以及相關的配置有一個全面的理解是非常有必要的,不僅僅可以很好的幫助我們來搭建IIS宿主環境,而且還對我們應用代碼的編寫以更多的指導,而且也是性能優化中一個非常重要的組成部分。
??????? 我們首先會講述IIS的一些知識和它的架構,這是理解后續內容的基礎。
??????? 本篇的議題如下:
??????? IIS 與應用程序池
??????? 初窺IIS的內核
??????? Http.sys解析
???????
?????對于一臺應用程序服務器而言,它的兩個比較重要的功能就是:
?????????1.??????監聽從客戶端發送來的Http請求;
? ?2.??????調用請求處理程序從監聽者那里獲取請求,然后處理,并且把響應發送給監聽者,然后由監聽者發送回給客戶端。
??為了使得IIS 6的性能和可伸縮性最大,Microsoft將HTTP的監聽者放在了操作系統的內核模式中,同時Microsoft也重寫了請求處理程序,使得所有的應用程序有著更好的獨立性,并且也加入了很多配置和特性,使得性能和穩定性有了大幅度的提升。
首先我們就來講講“內核模式”與“用戶模式”的一些概念,因為后面的文章會大量的用到這些概念。
所謂的內核模式,就是Windows內部核心的操作,在內核模式中運行的進程有著很高的優先級,可以直接訪問硬件以及系統底層的一些數據例如管理線程,進程,管理I/O設備的驅動等。
用戶模式就是除了內核模式以外的操作,例如位來自用戶應用程序的請求提供服務,包括IIS,SQL Server等。所有用戶模式的應用程序通過運行在內核模式的執行層訪問資源,例如,如果應用程序要進行磁盤的I/O,那么該請求就會提交到內核模式的執行層,由它來執行請求并且將結果返回給發出請求的用戶模式的進程。
??????? Http請求監聽者(HTTP.sys)是運行在內核模式中的,所以允許它已經非常高的優先級運行,并且還可以直接的訪問網絡接口,這樣極大的提升了性能,所以這樣使得IIS對HTTP的請求的響度度也大大的提高。
??????? 下面,我們就開始進入今天的第一個議題。
IIS 與應用程序池
??????? 從IIS6引入了應用程序池的概念,應用程序池使得每個Web程序都在一個獨立的環境中運行。一個或者多個Web應用可以加入到一個應用程序池中,每一個應用程序池都在一個單獨的進程中運行,這就意味著即使一個應用程序池崩潰了也不會影響其他的應用程序池。
??????? 出了獨立性以外,應用程序池還允許我們進行更多的配置,例如,配置應用程序池運行中的進程運行是的標識(即,以何種身份進行運行),還可配置.NET Framework的版本,健康檢查,以及與高性能高可用的一些設置。
??????? 對于不同的Web應用程序,其性能,穩定性等都是不一樣的,所以正確的配置會對站點的影響非常大(其實很多的時候,我們采用了很多的默認的配置)。
??????? 在每一個應用程序池中接受至少有一個運行的進程來接受與處理請求,我們就將這個進程稱之為“工作進程”。當一個發送到特性的URL請求被IIS接受之后,請求就會被轉發給正確的應用程序池,然后被池中的工作進程處理。
??????? 一個應用程序池可以配置為運行多個工作進程,這個時候,我們就將這個情況稱為“Web Garden”(中文的意思翻譯出來就變味了)。當一個池被配置稱為Web Garden的時候,請求就會被轉發給其中的一個進程處理。
??????? 說了這么多,我們就來看看一些比較深一點點的話題。
?
初窺IIS的內核
??????? 正如之前我們所說的,為了使得IIS的性能最高,那個介紹HTTP請求的監聽者運行在內核模式中。被接受到的請求被放在對應的應用程序池的隊列中,之后被用戶模式的工作進程處理。如果我們從這里來分析性能的話,大家其實可以分析出:處理一個ASP.NET的請求,其實需要涉及到三次的線程切換與二次的模式切換,所以請求的處理時間和代價是相當的高的,我們后面會講述如何盡量的避免這樣的情況。
??????? 為了使得大家更加的清楚,我們用一個圖來說明一下:
? ? ? ? ? ? ? ? ? ? ? ? ? ?
??????? 上圖顯示了在IIS7中的請求的處理的一般流程,但是這IIS6的處理流程還是有點區別的。在IIS6中,WWW Service包含了Windows Process ActivationService (WAS)的功能。
??????? 朋友們可能擔心上面的圖看不懂,沒關系,我們就來具體的看看。
Http.sys解析
??????? 我們這里的講述就以上圖做參照來說明。
??????? 當一個請求被HTTP監聽者(HTTP.sys)接受之后,它根據請求的URL進行匹配,然后馬上就把請求放在一個內核模式的不同的隊列中,以便這些請求可以被用戶模式中的應用程序池中工作進程獲取,然后處理。這里之所以要把請求放在隊列中是為了快速的釋放HTTP監聽線程,從而使得HTTP.sys可以接受其他更多的請求。另外,請求被放在不同的隊列,主要是根據請求的URL來分組的,并且應用程序池中也配置了處理何種URL。
??????? 當響應產生之后,響應會被再次發送給HTTP.sys(大家可以看到圖中第5個步驟),然后再把響應發送給客戶端。HTTP.sys可以基于一些配置將響應進行緩存,我們會在后面進一步的討論。
??????? 這里有一點非常中的就是:HTTP.sys將響應緩存在內核中,并且這個內核中的這個緩存空間是不分頁的。
什么是不分頁的呢?
不分頁就意味著HTTP.sys總是將響應的內容緩存物理的內存中,而且這一塊內存不會被交換出去,就是說不會被分頁到磁盤上面(這部分的內容已經涉及到了Windows的內存管理知識)。
??????? 當請求的響應被緩存在了內核模式之后,下次再次請求的時候,可以直接的讀取緩存,而后續的步驟全部跳過,這會極大的提升性能。
??????? 今天我們談到這里,下一篇接著談!
作者介紹:汪洋,哪合伙CEO,曾大漢電子商務有限公司首席技術官,副總裁,負責公司產品、技術、運營,參與商業模式設計。華康移動醫療前CTO,副總裁,首席架構師。微軟MVP
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
贊賞
人贊賞
總結
以上是生活随笔為你收集整理的构建高性能.NET应用之配置高可用IIS服务器-第一篇:IIS必须掌握的知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 发布在即!.NET Core 1.0 R
- 下一篇: 构建高性能.NET应用之配置高可用IIS