概覽:
●內(nèi)存管理和 SMB 2.0
● NTFS 自修復(fù)功能、 Windows 硬件錯(cuò)誤報(bào)告體系和驅(qū)動(dòng)程序驗(yàn)證程序
● I/O 完成端口、線程池和 NUMA 的可伸縮性
● Hyper-V 虛擬化
Windows Server 2008 是最新版本的 Microsoft 服務(wù)器平臺(tái),它包含許多系統(tǒng)級(jí)更改,這些更改涉及操作系統(tǒng)的所有功能領(lǐng)域:從內(nèi)存管理到線程調(diào)度,從網(wǎng)絡(luò)連接到安全(這里只列出了少數(shù)幾個(gè))。
由于 Windows Server? 2008 和 Windows Vista? SP1 的內(nèi)核相同。只有其中的少數(shù)功能僅特定于客戶端且并未包含在 Windows Server 2008 中,如 SuperFetch、ReadyBoost、ReadyDrive、ReadyBoot 和多媒體類計(jì)劃程序服務(wù) (MMCSS)。
因此,我將不再重復(fù)介紹 Windows Vista 中已介紹過(guò)且 Windows Server 2008 中同樣包含的重要內(nèi)核變化,如 I/O 優(yōu)先級(jí)排列、新的引導(dǎo)體系結(jié)構(gòu) BitLockerTM、代碼完整性和強(qiáng)制完整性級(jí)別。我將重點(diǎn)介紹之前這些文章中未涉及到的關(guān)鍵變化,包括與可靠性、性能、可伸縮性以及新的 Microsoft 管理程序計(jì)算機(jī)虛擬化技術(shù) Hyper-VTM 相關(guān)的變化。
同樣,與之前的文章一樣,本文的范圍僅限于操作系統(tǒng)內(nèi)核 Ntoskrnl.exe 以及與其緊密關(guān)聯(lián)的系統(tǒng)組件的變化。例如,本文不會(huì)介紹安裝(WIM 或 Windows? 映像格式和基于組件的服務(wù))、管理(組策略和 Active Directory? 改進(jìn))、常規(guī)診斷和監(jiān)控(Windows 診斷基礎(chǔ)結(jié)構(gòu))、核心網(wǎng)絡(luò)(新的防火墻和 TCP/IP 實(shí)現(xiàn))、Server Core 或服務(wù)器角色的變化。
用于多處理器系統(tǒng)
系統(tǒng)的其中一項(xiàng)底層變化是 Windows Server 2008 僅提供設(shè)計(jì)用于多處理器系統(tǒng)的內(nèi)核版本。過(guò)去,Windows 擁有專門針對(duì)單 CPU 計(jì)算機(jī)上的單處理器的版本,因?yàn)樵摪姹究赏ㄟ^(guò)忽略僅在多處理器環(huán)境下需要的同步代碼來(lái)獲得稍好一點(diǎn)的性能。隨著硬件速度變得越來(lái)越快,由優(yōu)化帶來(lái)的性能提高幾乎可忽略不計(jì),并且如今的大多數(shù)服務(wù)器系統(tǒng)都包含多個(gè)處理器,所以已不再需要單處理器的內(nèi)核版本。
Windows Server 2008 內(nèi)核的各個(gè)版本,系統(tǒng)中具體使用哪個(gè)版本取決于操作系統(tǒng)是調(diào)試版本(Checked 版本)還是零售版本、安裝為 32 位還是 64 位(Itanium、Intel 64 或 AMD64),以及如果是 32 位安裝,系統(tǒng)的物理內(nèi)存是否超過(guò) 4GB 或支持?jǐn)?shù)據(jù)執(zhí)行保護(hù) (DEP)。Windows Server 2008 還可能是最后一個(gè)提供 32 位版本的 Windows Server 操作系統(tǒng)。
內(nèi)核 32位64位
多處理器是是 多處理器Checked版本是是 多處理器物理地址擴(kuò)展(PAE)是否 多處理器PAEChecked版本 是否 |
內(nèi)存管理
試驗(yàn):查看大規(guī)模的磁盤 I/O 操作
可使用 TechNet Sysinternals Process Monitor之類的文件系統(tǒng)監(jiān)視工具來(lái)查看 Windows Server 2008 系統(tǒng)上的大規(guī)模文件 I/O 操作。
有多種方法均可產(chǎn)生大規(guī)模 I/O 操作。如果有另一個(gè)運(yùn)行 Windows Vista Service Pack 1 或 Windows Server 2008 的系統(tǒng),可在頭一個(gè)服務(wù)器上運(yùn)行 Process Monitor 并監(jiān)控到第二個(gè)系統(tǒng)的文件復(fù)制。還可以通過(guò)運(yùn)行非常耗費(fèi)內(nèi)存的程序使得內(nèi)存管理器將頁(yè)面寫出到分頁(yè)文件中,從而產(chǎn)生大規(guī)模的分頁(yè)文件 I/O 操作。
圖 A 顯示了在 Windows XP 系統(tǒng)中運(yùn)行非常耗費(fèi)內(nèi)存的程序后 Process Monitor 的輸出,此時(shí)在 Process Monitor 的“Options”(選項(xiàng))菜單中選中了“Enable Advanced Output”(啟用高級(jí)輸出)選項(xiàng),并將過(guò)濾器設(shè)置為僅顯示到分頁(yè)文件 pagefile.sys 的寫入。“Detail”(詳細(xì)信息)列顯示寫入大小為 64KB。
圖 A
如果在 Windows Server 2008 上運(yùn)行相同的步驟,則很可能出現(xiàn)類似圖 B 中顯示的輸出,它顯示大多數(shù)寫入大小約為 1MB。
圖 B
Windows Server 2008 中的內(nèi)存管理器包含多項(xiàng)性能增強(qiáng)功能。例如,與 Windows Server 2003 相比,從分頁(yè)文件提取數(shù)據(jù)或?qū)τ成湮募?zhí)行預(yù)讀 I/O 時(shí),它將使用數(shù)量更少但規(guī)模更大的磁盤 I/O。I/O 系統(tǒng)中的變化是促成更大規(guī)模的文件 I/O 的前提,它去除了自 Windows NT? 的第一個(gè)版本以來(lái)一直存在的 64KB 的 I/O 大小限制。
并且,必須注意:與 Windows Server 2003 相比,使用 Windows Server 2008 時(shí),Cache Manager 從映射文件進(jìn)行預(yù)讀(猜測(cè)性讀取)的數(shù)據(jù)讀取通常要大兩倍,并且將直接進(jìn)入待機(jī)列表(系統(tǒng)的代碼和數(shù)據(jù)緩存)。這種行為取代了 Cache Manager 映射虛擬內(nèi)存并將數(shù)據(jù)讀入系統(tǒng)工作集(由內(nèi)存管理器為系統(tǒng)分配的內(nèi)存)的需要,而這種需要可能導(dǎo)致其他使用中的代碼或數(shù)據(jù)被不必要地驅(qū)出工作集。
當(dāng)把數(shù)據(jù)寫入分頁(yè)文件時(shí),內(nèi)存管理器也會(huì)執(zhí)行更大規(guī)模的 I/O。盡管 Windows Server 2003 常常執(zhí)行比 64KB 還小的寫入操作,但在 Windows Server 2008 中,內(nèi)存管理器通常使用 1MB 的寫入操作。
除通過(guò)減少寫入分頁(yè)文件的次數(shù)來(lái)提高性能外,較大規(guī)模的寫入操作還可減少分頁(yè)文件中的碎片。而它又反過(guò)來(lái)減少了讀回多個(gè)頁(yè)面所需的讀取次數(shù)和磁盤尋道次數(shù),因?yàn)槿绻幌噜彛x取和尋道次數(shù)都會(huì)多得多。
內(nèi)存管理器還會(huì)嘗試寫出其他已修改頁(yè)面(這些頁(yè)面與將要寫出到所擁有進(jìn)程的地址空間中的頁(yè)面相鄰),并且會(huì)將分頁(yè)文件放到已包含其他相鄰頁(yè)面的區(qū)域中。這種方法也可盡量減少碎片并提高性能,因?yàn)槟切┛赡軙?huì)最終寫出到分頁(yè)文件中的頁(yè)面均已被寫入。此外,它還減少了引入大量相鄰進(jìn)程頁(yè)面所需的分頁(yè)讀取次數(shù)。查看側(cè)欄“試驗(yàn):查看大規(guī)模的磁盤 I/O 操作”了解有關(guān)內(nèi)存管理器使用大規(guī)模的 I/O 方面的更多信息。
SMB 2.0
自從文件服務(wù)功能被引入到 Windows 中以來(lái),服務(wù)器消息塊 (SMB) 遠(yuǎn)程文件系統(tǒng)協(xié)議(也稱為通用 Internet 文件系統(tǒng) (CIFS))就已成為 Windows 文件服務(wù)的基礎(chǔ)。在過(guò)去的幾年中,SMB 的設(shè)計(jì)限制制約了 Windows 文件服務(wù)的性能和利用新的本地文件系統(tǒng)功能的能力。例如,單個(gè)消息能傳輸?shù)淖畲缶彌_區(qū)大小為約 60KB,并且 SMB 1.0 無(wú)法識(shí)別 Windows Vista 和 Windows Server 2008 中新增的 NTFS 客戶端符號(hào)鏈接。
Windows Vista 和 Windows Server 2008 引入了 SMB 2.0,它是客戶端和服務(wù)器都支持時(shí) Windows 所使用的一種新型遠(yuǎn)程文件服務(wù)協(xié)議。除能正確處理客戶端符號(hào)鏈接和其他 NTFS 增強(qiáng)功能外,SMB 2.0 還使用批處理來(lái)最小化客戶端和服務(wù)器之間的信息交換數(shù)量。批處理可提高廣域網(wǎng) (WAN) 之類高延遲網(wǎng)絡(luò)的吞吐量,因?yàn)樗试S同時(shí)傳輸更多數(shù)據(jù)。
SMB 1.0 針對(duì)單個(gè)文件按順序執(zhí)行 I/O,而 SMB 2.0 則實(shí)現(xiàn)了 I/O 管道,從而可針對(duì)同一文件執(zhí)行多個(gè)并發(fā) I/O。它通過(guò)衡量客戶端用于未完成 I/O 的服務(wù)器內(nèi)存數(shù)量來(lái)決定管道的深度。
由于 Windows I/O 內(nèi)存管理器和 I/O 系統(tǒng)以及 TCP/IP 接收窗口自動(dòng)調(diào)節(jié)方面的變化和文件復(fù)制引擎的改進(jìn),SMB 2.0 顯著提高了吞吐量并減少了大型傳輸?shù)奈募?fù)制時(shí)間。由于兩種操作系統(tǒng)都實(shí)現(xiàn)了 SMB 2.0,所以部署 Windows Server 2008 文件服務(wù)器和 Windows Vista 客戶端即可使用 SMB 2.0 并實(shí)現(xiàn)這些性能優(yōu)點(diǎn)。
使用 NTFS 自修復(fù)功能提高可靠性
可靠性是一個(gè)關(guān)鍵服務(wù)器屬性,Windows Server 2008 提供各種改進(jìn)來(lái)幫助管理員順暢運(yùn)行其服務(wù)器(包括在線 NTFS 一致性修復(fù)、新的硬件錯(cuò)誤報(bào)告體系以及對(duì)驅(qū)動(dòng)程序驗(yàn)證程序的擴(kuò)展)。
由于現(xiàn)在使用的存儲(chǔ)設(shè)備一般都以 TB 為單位,因此對(duì)某個(gè)卷進(jìn)行脫機(jī)一致性檢查可能會(huì)使服務(wù)中斷數(shù)小時(shí)。鑒于許多磁盤損壞都局限于單個(gè)文件或部分元數(shù)據(jù),Windows Server 2008 實(shí)現(xiàn)了新的 NTFS 自修復(fù)功能,即可在卷保持聯(lián)機(jī)的情況下修復(fù)損壞。
當(dāng) NTFS 檢測(cè)到損壞時(shí),它將阻止訪問(wèn)受損的文件并創(chuàng)建一個(gè)系統(tǒng)工作線程,該線程將對(duì)受損數(shù)據(jù)結(jié)構(gòu)執(zhí)行類似 Chkdsk 的修復(fù),完成后再允許訪問(wèn)修復(fù)后的文件。在此操作期間仍然可以正常訪問(wèn)其他文件,因而最小化服務(wù)中斷。
WHEA 基礎(chǔ)結(jié)構(gòu)
Windows Server 2008 中包含有 Windows 硬件錯(cuò)誤報(bào)告體系 (WHEA) 基礎(chǔ)結(jié)構(gòu),它可以簡(jiǎn)化硬件故障管理并主動(dòng)響應(yīng)非致命錯(cuò)誤。服務(wù)器通常都有嚴(yán)格的正常工作時(shí)間保證,因此及時(shí)確定并響應(yīng)此類系統(tǒng)中的錯(cuò)誤至關(guān)重要。
通過(guò)對(duì)利用在線崩潰分析 (OCA) 提交到 Microsoft 的崩潰進(jìn)行分析表明:約 10% 的操作系統(tǒng)崩潰是源于硬件故障,但確定此類崩潰的根本原因卻非常困難甚至于不可能,因?yàn)楸罎r(shí)所獲取的硬件錯(cuò)誤信息非常少。此外,在 Windows Server 2008 之前,Windows 并不內(nèi)置支持監(jiān)控設(shè)備的運(yùn)行狀況,也未實(shí)現(xiàn)故障前的修復(fù)或通知。其原因在于硬件設(shè)備并未使用一種通用的錯(cuò)誤格式并且不支持錯(cuò)誤管理軟件。
WHEA 為各種平臺(tái)設(shè)備(包括處理器、內(nèi)存、緩存和類似 PCI 和 PCI Express 之類的總線)提供了統(tǒng)一的錯(cuò)誤源發(fā)現(xiàn)和報(bào)告機(jī)制。其原理是實(shí)現(xiàn)圖 2 中所示的體系結(jié)構(gòu),其中核心是錯(cuò)誤源調(diào)用來(lái)報(bào)告錯(cuò)誤的內(nèi)核 API。此 API 要求所有錯(cuò)誤都以同一方法進(jìn)行格式化,然后使用 Windows 事件跟蹤 (ETW) 事件來(lái)記錄錯(cuò)誤(嚴(yán)重錯(cuò)誤則在重啟后再記錄)。
圖 2 WHEA 錯(cuò)誤報(bào)告基礎(chǔ)結(jié)構(gòu)
ETW 早在 Windows 2000 中就已引入,而當(dāng) ETW 使用 WHEA 后,硬件制造商和軟件供應(yīng)商就可輕松地開(kāi)發(fā)利用 WHEA 事件的設(shè)備診斷管理應(yīng)用程序。如果某事件已嚴(yán)重到足以導(dǎo)致系統(tǒng)崩潰,WHEA 會(huì)確保將該致命錯(cuò)誤記錄存儲(chǔ)到崩潰轉(zhuǎn)儲(chǔ)文件中,這樣管理員就可確定崩潰的根本原因。
WHEA 的另一關(guān)鍵部分是位于 %Systemroot%\System32\Pshed.dll 中的平臺(tái)特定的硬件錯(cuò)誤驅(qū)動(dòng)程序 (PSHED)。內(nèi)核與 PSHED 鏈接,而它與平臺(tái)和固件硬件連接,實(shí)質(zhì)上是用作錯(cuò)誤通知和 WHEA 錯(cuò)誤報(bào)告 API 之間的轉(zhuǎn)換層。Microsoft 為每種平臺(tái)體系結(jié)構(gòu)(x86、x64、Itanium)提供有一種 PSHED 并且 PSHED 公開(kāi)了插件模型,所以硬件供應(yīng)商和制造商可使用特定于其平臺(tái)的行為來(lái)覆蓋默認(rèn)行為。
最后,與其他錯(cuò)誤源相連的系統(tǒng)組件 — 包括設(shè)備驅(qū)動(dòng)程序、硬件抽象層 (HAL) 和內(nèi)核 — 可實(shí)現(xiàn)底層硬件錯(cuò)誤處理程序 (LLHEL)(它將首先處理錯(cuò)誤狀況)。LLHEL 的工作是從設(shè)備中提取錯(cuò)誤信息,通知 PSHED 允許其收集其他平臺(tái)錯(cuò)誤信息,然后調(diào)用內(nèi)核的 WHEA 錯(cuò)誤報(bào)告 API。
驅(qū)動(dòng)程序驗(yàn)證程序
從 Windows 2000 起,每個(gè) Windows 副本中都包含有驅(qū)動(dòng)程序驗(yàn)證程序,它是一個(gè)用于跟蹤出錯(cuò)的設(shè)備驅(qū)動(dòng)程序和故障硬件的強(qiáng)大工具。管理員通常將驅(qū)動(dòng)程序驗(yàn)證程序(%Systemroot%\System32\Verifier.exe) 配置為密切監(jiān)控可能導(dǎo)致系統(tǒng)崩潰的可疑設(shè)備驅(qū)動(dòng)程序的行為。驅(qū)動(dòng)程序驗(yàn)證程序可捕獲非法驅(qū)動(dòng)程序操作,這樣崩潰轉(zhuǎn)儲(chǔ)文件就可以直接指出罪魁禍?zhǔn)住?
之前驅(qū)動(dòng)程序驗(yàn)證程序的缺陷在于大多數(shù)配置更改都需要重新啟動(dòng)系統(tǒng),而生產(chǎn)服務(wù)器明顯不愿出現(xiàn)這種情形。Windows Server 2008 中的驅(qū)動(dòng)程序驗(yàn)證程序通過(guò)取消最有用驗(yàn)證的重啟要求而改進(jìn)了這一過(guò)程,因此可在不重新啟動(dòng)系統(tǒng)的情況下對(duì)出現(xiàn)問(wèn)題的服務(wù)器進(jìn)行故障排除。
此外,驅(qū)動(dòng)程序驗(yàn)證程序還引入了三種新的驗(yàn)證(如圖 3 所示)。安全檢查確保設(shè)備驅(qū)動(dòng)程序在用于與應(yīng)用程序連接的對(duì)象上設(shè)置了安全權(quán)限。強(qiáng)制掛起 I/O 請(qǐng)求測(cè)試了驅(qū)動(dòng)程序?qū)τ谛枇⒓赐瓿啥且欢窝舆t后再完成的異步 I/O 操作的恢復(fù)能力。雜項(xiàng)檢查則確認(rèn)驅(qū)動(dòng)程序有無(wú)錯(cuò)誤釋放使用中的資源、錯(cuò)誤使用 Windows 管理規(guī)范 (WMI) 注冊(cè) API 以及泄漏資源處理程序。
圖 3 選中 Windows Server 2008 選項(xiàng)的驅(qū)動(dòng)程序驗(yàn)證程序
可伸縮性
可伸縮性是指操作系統(tǒng)或應(yīng)用程序有效利用多個(gè)處理器和大量?jī)?nèi)存的能力。Windows 的每個(gè)版本都會(huì)通過(guò)減少或取消使用鎖(它們會(huì)降低多處理器的平行性)來(lái)提高可伸縮性,Windows Server 2008 也不例外。
執(zhí)行計(jì)時(shí)器超時(shí)的代碼中有一個(gè)較小但卻非常重要的改進(jìn),即不再需要調(diào)度程序鎖(所有底層同步操作都會(huì)使用的一種系統(tǒng)范圍調(diào)度程序鎖)。從而降低了 CPU 同步開(kāi)銷,使得 Windows Server 2008 終端服務(wù)器系統(tǒng)能比 Windows Server 2003 多支持約 30% 的并發(fā)用戶。
Windows Server 2008 中的其他可伸縮性改進(jìn)包括完成端口增強(qiáng)功能、新的線程池實(shí)現(xiàn)、更加有效地使用非一致內(nèi)存訪問(wèn) (NUMA) 硬件以及動(dòng)態(tài)系統(tǒng)分區(qū)。
改進(jìn)了 I/O 完成端口處理
大多數(shù)可伸縮的 Windows 服務(wù)器應(yīng)用程序(包括 IIS、SQL Server? 和 Exchange Server)都依靠稱為完成端口的一個(gè) Windows 同步 API 來(lái)最大程度減少執(zhí)行 I/O 操作時(shí)在多個(gè)線程之間的切換。具體方法是首先將新到請(qǐng)求(如 Web 服務(wù)器客戶端連接)通知與完成端口關(guān)聯(lián)起來(lái),并指定一個(gè)線程池來(lái)專門等待通知。當(dāng)請(qǐng)求到來(lái)時(shí),Windows 將調(diào)度一個(gè)線程,該線程通常執(zhí)行其他 I/O 操作(如從磁盤讀取一個(gè)網(wǎng)頁(yè)并將其發(fā)送到客戶端)來(lái)完成該請(qǐng)求。
因此,相同線程可盡快地返回以等待更多的客戶端請(qǐng)求,線程異步執(zhí)行 I/O 并將 I/O 完成與完成端口關(guān)聯(lián)起來(lái)。線程隨后返回等待完成端口,當(dāng)新請(qǐng)求到來(lái)或某個(gè) I/O 完成時(shí),完成端口將調(diào)度該線程。通過(guò)這種方式,同一線程在 CPU 上始終處于活動(dòng)狀態(tài):處理客戶端請(qǐng)求或等待完成端口。
之前 Windows 版本中完成端口的缺陷在于:當(dāng) I/O 完成后,I/O 系統(tǒng)將讓執(zhí)行該 I/O 的線程立即執(zhí)行一小段完成處理,而不考慮該線程當(dāng)前正在執(zhí)行的其他工作。如果還有其他線程處于活動(dòng)狀態(tài),則常常會(huì)導(dǎo)致調(diào)度程序搶占活動(dòng)線程,并上下文切換到另一個(gè)執(zhí)行線程的情況。
通過(guò)將完成處理延遲到下一線程以等待與該 I/O 關(guān)聯(lián)的完成端口,Windows Server 2008 避免了此類上下文切換。因此,即使還有另一線程正在等待完成端口,它仍會(huì)在執(zhí)行其他代碼之前先執(zhí)行完成處理,而且調(diào)度程序不必切換到執(zhí)行線程。這種最小化上下文切換的能力可顯著地改善高負(fù)載服務(wù)器應(yīng)用程序的可伸縮性。
線程池更加有效
利用多個(gè) CPU 來(lái)寫入應(yīng)用程序非常困難,因此 Windows XP 引入了工作線程池,它是一種基礎(chǔ)結(jié)構(gòu)和相關(guān) API,用于提取在多個(gè) CPU 間執(zhí)行小段工作的詳細(xì)信息。 應(yīng)用程序?qū)⒐ぷ黜?xiàng)目指定給線程池 API,然后該 API 在它為系統(tǒng)中的每個(gè) CPU 創(chuàng)建和管理的某個(gè)線程中執(zhí)行這些工作項(xiàng)目。
線程池的目的是通過(guò)使用相同的線程連續(xù)執(zhí)行多個(gè)工作項(xiàng)目來(lái)盡可能減少上下文切換。當(dāng)某個(gè)線程因?yàn)槊τ趫?zhí)行其他工作而無(wú)法達(dá)到此目的時(shí),它將使用不同 CPU 上的另一線程來(lái)執(zhí)行該工作項(xiàng)目。
Windows Server 2008 的線程池實(shí)現(xiàn)可間接地(受益于完成端口改進(jìn))和直接地(通過(guò)優(yōu)化線程管理)更好利用 CPU,這樣工作線程就能根據(jù)需要?jiǎng)討B(tài)切換以便處理應(yīng)用程序的負(fù)荷。并且,此基礎(chǔ)結(jié)構(gòu)的核心已轉(zhuǎn)移到內(nèi)核模式,從而最小化使用該 API 的應(yīng)用程序所產(chǎn)生的系統(tǒng)調(diào)用數(shù)量。最后,新 API 使應(yīng)用程序能夠更輕松地執(zhí)行某些操作,如在應(yīng)用程序關(guān)閉期間中止已排隊(duì)的工作單元。
NUMA 優(yōu)化
Windows Server 2003 在線程調(diào)度程序和內(nèi)存管理器中引入了 NUMA 優(yōu)化,而 Windows Server 2008 在 I/O 管理器中添加了 NUMA 優(yōu)化同時(shí)擴(kuò)展了內(nèi)存管理器的 NUMA 優(yōu)化。
NUMA 系統(tǒng)通常是多處理器系統(tǒng),其中的內(nèi)存延遲隨訪問(wèn)它的處理器不同而有所不同(請(qǐng)參見(jiàn)圖 4)。內(nèi)存被分成多個(gè)節(jié)點(diǎn),CPU 和節(jié)點(diǎn)之間的延遲可能各不相同,并且每個(gè) CPU 都被視為它可最快訪問(wèn)的那個(gè)節(jié)點(diǎn)的一部分。
圖 4 示例 NUMA 系統(tǒng)
NUMA 系統(tǒng)(尤其是具有超過(guò)八個(gè) CPU 的系統(tǒng))通常比一致內(nèi)存訪問(wèn)系統(tǒng)更加經(jīng)濟(jì)且性能更高。一致內(nèi)存訪問(wèn)系統(tǒng)必須平等地為所有 CPU 提供內(nèi)存,而 NUMA 系統(tǒng)則能夠?yàn)橹苯舆B接到 CPU 的內(nèi)存提供高速互連,同時(shí)為與 CPU 相隔較遠(yuǎn)的內(nèi)存提供較為便宜但更高延遲的連接。
為能在 NUMA 系統(tǒng)中有效擴(kuò)展,操作系統(tǒng)或應(yīng)用程序必須了解節(jié)點(diǎn)拓?fù)浣Y(jié)構(gòu),以便使計(jì)算能夠在包含計(jì)算數(shù)據(jù)和代碼的內(nèi)存附近執(zhí)行。例如,Windows 調(diào)度程序?yàn)槊總€(gè)線程分配一個(gè)所謂的理想處理器,該處理器是調(diào)度程序試圖始終在其上執(zhí)行該線程的 CPU。這樣做可以使線程置于 CPU 緩存中的數(shù)據(jù)能夠盡可能地在每次該線程運(yùn)行時(shí)可用。
在 Windows Server 2003 中,調(diào)度程序擴(kuò)展此概念的方法是:將包含理想處理器的節(jié)點(diǎn)視為該線程的理想節(jié)點(diǎn),并且當(dāng)理想處理器正忙于執(zhí)行另一個(gè)線程時(shí),調(diào)度程序會(huì)嘗試在理想節(jié)點(diǎn)中的另一個(gè) CPU 上調(diào)度該線程。Windows Server 2003 內(nèi)存管理器也支持 NUMA,并且在可能的情況下,它會(huì)將線程的內(nèi)存分配定向到正在執(zhí)行此線程的節(jié)點(diǎn)的內(nèi)存中。
在 Windows Server 2008 中,內(nèi)存管理器將內(nèi)核的非分頁(yè)內(nèi)存緩沖區(qū)(內(nèi)核和設(shè)備驅(qū)動(dòng)程序用于存儲(chǔ)必需保存在 RAM 中的數(shù)據(jù)的內(nèi)存)分到各個(gè)節(jié)點(diǎn),這樣可以在產(chǎn)生分配的節(jié)點(diǎn)上為線程分配內(nèi)存。系統(tǒng)頁(yè)表項(xiàng) (PTE) 是從發(fā)生分配的節(jié)點(diǎn)中分配,如果需要新頁(yè)表頁(yè)來(lái)滿足內(nèi)存分配,則會(huì)按照在 Windows Server 2003 中所采取的方式在相同的節(jié)點(diǎn)內(nèi)存中分配,而不會(huì)從任何其他節(jié)點(diǎn)的內(nèi)存中分配。
在 Windows Server 2003 中,當(dāng)線程進(jìn)行內(nèi)存分配時(shí),內(nèi)存管理器在分配內(nèi)存時(shí)將優(yōu)先考慮在線程當(dāng)前執(zhí)行的節(jié)點(diǎn)中進(jìn)行分配。如果線程暫時(shí)調(diào)度到非理想節(jié)點(diǎn),則在此期間執(zhí)行的所有分配操作都將在非理想節(jié)點(diǎn)中執(zhí)行。所以,當(dāng)線程最終回到其理想節(jié)點(diǎn)中執(zhí)行時(shí),它將不再像最初一樣緊挨著所分配內(nèi)存中存儲(chǔ)的數(shù)據(jù)或代碼。
為解決這一問(wèn)題,在 Windows Server 2008 中,內(nèi)存管理器在所有線程內(nèi)存分配時(shí)都將優(yōu)先考慮線程的理想節(jié)點(diǎn),即使線程正在另一節(jié)點(diǎn)附近執(zhí)行。內(nèi)存管理器還能自動(dòng)了解處理器和節(jié)點(diǎn)之間的延遲,所以當(dāng)理想節(jié)點(diǎn)中沒(méi)有足夠的可用內(nèi)存時(shí),它會(huì)檢查與理想節(jié)點(diǎn)最近的另一節(jié)點(diǎn)。此外,當(dāng)線程引用代碼或數(shù)據(jù)時(shí),內(nèi)存管理器將把其待機(jī)列表中的頁(yè)面遷移到線程的理想節(jié)點(diǎn)。
希望控制分配位置的應(yīng)用程序可使用新的 NUMA 內(nèi)存 API,它使這些應(yīng)用程序能夠?yàn)閮?nèi)存分配、文件映射視圖和文件映射對(duì)象指定首選節(jié)點(diǎn)。對(duì)于與文件映射相關(guān)的分配,內(nèi)存管理器會(huì)檢查映射操作是否指定節(jié)點(diǎn),然后檢查文件映射對(duì)象是否指定節(jié)點(diǎn),如果兩者都未指定,則最后它將回來(lái)繼續(xù)選用線程的理想節(jié)點(diǎn)。
在 Windows Server 2008 之前,用于存儲(chǔ)或網(wǎng)絡(luò) I/O 的中斷及其相關(guān)的延緩進(jìn)程調(diào)用 (DPC) 能夠在任意 CPU 上執(zhí)行,包括在與啟動(dòng) I/O 操作處于不同節(jié)點(diǎn)的 CPU 上執(zhí)行。這有可能導(dǎo)致 I/O 操作中的數(shù)據(jù)讀取或?qū)懭朐谠L問(wèn)數(shù)據(jù)的節(jié)點(diǎn)以外的其他節(jié)點(diǎn)的內(nèi)存中執(zhí)行。
為避免這種情況,Windows Server 2008 I/O 系統(tǒng)將 DPC 執(zhí)行定向到啟動(dòng) I/O 操作的節(jié)點(diǎn)中的 CPU,并且擁有支持 PCI 總線 MSI-X(消息信號(hào)中斷標(biāo)準(zhǔn)的擴(kuò)展)設(shè)備的系統(tǒng)還可以通過(guò)使用設(shè)備驅(qū)動(dòng)程序來(lái)進(jìn)一步讓 I/O 在本地完成,因?yàn)檫@些設(shè)備驅(qū)動(dòng)程序?qū)⒗?Windows Server 2008 API 將 I/O 中斷定向到啟動(dòng)該 I/O 的處理器。
動(dòng)態(tài)分區(qū)
讓系統(tǒng)更具伸縮性的一種方法是讓其支持動(dòng)態(tài)增加硬件資源(如 CPU 和內(nèi)存)。如果這些資源無(wú)需重啟系統(tǒng)即可實(shí)現(xiàn)更換,則此支持還能使系統(tǒng)更具可用性。
Windows Server 2003 支持動(dòng)態(tài)內(nèi)存添加功能,從而使得具有動(dòng)態(tài)內(nèi)存支持的服務(wù)器能在管理員添加的同時(shí)即可使用這些 RAM。Windows Server 2008 還擴(kuò)展了動(dòng)態(tài)內(nèi)存支持,因?yàn)樗蓪?shí)現(xiàn)內(nèi)存更換。
RAM 由于越來(lái)越依賴糾錯(cuò)碼 (ECC) 校正而非常容易發(fā)生故障,因此在支持動(dòng)態(tài)更換的服務(wù)器上,Windows Server 2008 可透明地將出現(xiàn)故障的內(nèi)存條中的數(shù)據(jù)遷移到替換內(nèi)存上。具體過(guò)程為:首先遷移操作系統(tǒng)所控制的數(shù)據(jù),然后將硬件設(shè)備置于低功耗狀態(tài)來(lái)有效關(guān)閉它們,遷移內(nèi)存中的剩余數(shù)據(jù),接著恢復(fù)設(shè)備電源繼續(xù)正常操作。
Windows Server 2008 還支持處理器的動(dòng)態(tài)添加和動(dòng)態(tài)更換。對(duì)于動(dòng)態(tài)更換,硬件必須支持備用 CPU 概念,當(dāng)現(xiàn)有 CPU 產(chǎn)生故障指示時(shí),備用 CPU 可聯(lián)機(jī)或動(dòng)態(tài)添加到系統(tǒng)中,目前僅高端系統(tǒng)支持此概念。Windows Server 2008 調(diào)度程序可減緩故障 CPU 上活動(dòng)的速度,并將工作轉(zhuǎn)移至替換硬件上,隨后可取出故障 CPU 并將其更換為新的備用件。
Windows Server 2008 支持處理器的動(dòng)態(tài)添加,因此管理員能在不停機(jī)的情況下升級(jí)服務(wù)器的處理能力。但是,調(diào)度程序和 I/O 系統(tǒng)只能將新 CPU 提供給那些通過(guò)新 API 請(qǐng)求 CPU 到達(dá)通知的設(shè)備驅(qū)動(dòng)程序和應(yīng)用程序,因?yàn)槟承?yīng)用程序內(nèi)置假定 CPU 數(shù)量對(duì)于引導(dǎo)會(huì)話而言是固定的。例如,應(yīng)用程序可能為每個(gè) CPU 分配一個(gè)工作隊(duì)列,線程執(zhí)行時(shí)將使用與該 CPU 關(guān)聯(lián)的隊(duì)列。如果調(diào)度程序?qū)⒃搼?yīng)用程序的某個(gè)線程調(diào)度到新的 CPU 上,它可能會(huì)試圖引用并不存在的隊(duì)列,因而可能導(dǎo)致?lián)p壞應(yīng)用程序的數(shù)據(jù)并很有可能致使該應(yīng)用程序崩潰。
基于 Microsoft 服務(wù)器的應(yīng)用程序(如 SQL Server 和 Exchange Server)能支持 CPU 動(dòng)態(tài)添加,一些核心 Windows 進(jìn)程也支持此功能,包括 System 進(jìn)程、會(huì)話管理器進(jìn)程 (%SystemRoot%\System32\Smss.exe) 和 Generic Service Hosting 進(jìn)程 (%Systemroot%\System32\Svchost.exe)。其他進(jìn)程也可使用 Windows API 來(lái)請(qǐng)求新 CPU 到達(dá)通知。當(dāng)新 CPU 到達(dá)時(shí),Windows 將向設(shè)備驅(qū)動(dòng)程序通知這一情況、啟動(dòng) CPU 并隨后通知所寫入的設(shè)備驅(qū)動(dòng)程序和應(yīng)用程序使用新的 CPU,這樣它們就可以在需要時(shí)分配數(shù)據(jù)結(jié)構(gòu)以跟蹤新 CPU 上的活動(dòng)。
計(jì)算機(jī)虛擬化
在 Windows Server 2008 之前,Microsoft 就已經(jīng)使用宿主虛擬化技術(shù)(如圖 5 所示)實(shí)現(xiàn)了包括 Virtual Server 2005 在內(nèi)的各種虛擬化產(chǎn)品。在宿主虛擬化中,虛擬機(jī)的實(shí)現(xiàn)技術(shù)是在宿主操作系統(tǒng)上(通常是作為設(shè)備驅(qū)動(dòng)程序)運(yùn)行的虛擬機(jī)監(jiān)控器 (VMM)。VMM 依賴宿主操作系統(tǒng)的資源管理和設(shè)備驅(qū)動(dòng)程序,并且當(dāng)宿主操作系統(tǒng)調(diào)度其運(yùn)行時(shí),它會(huì)在活動(dòng)虛擬機(jī) (VM) 之間對(duì) CPU 切分時(shí)間片。
圖 5 宿主計(jì)算機(jī)虛擬化
Hyper-V(以前的代號(hào)為“Viridian”)是利用管理程序虛擬化得以實(shí)現(xiàn)的。管理程序完全控制著所有硬件資源,甚至引導(dǎo)系統(tǒng)和用于控制 VM 的 Windows Server 2008 操作系統(tǒng)本身實(shí)質(zhì)上也是以虛擬機(jī)的方式運(yùn)行(如圖 6 所示)。
圖 6 Hyper-V 體系結(jié)構(gòu)
管理程序可將系統(tǒng)分成多個(gè) VM,并將 Windows Server 2008 的引導(dǎo)實(shí)例當(dāng)作主分區(qū)(或根分區(qū)),以使其可直接訪問(wèn)各種硬件設(shè)備(如磁盤、網(wǎng)絡(luò)適配器和圖形處理器)。管理程序要求根分區(qū)執(zhí)行電源管理并響應(yīng)硬件即插即用事件。它將截取子分區(qū)中啟動(dòng)的硬件設(shè)備 I/O 并將其路由到根分區(qū),然后根分區(qū)使用標(biāo)準(zhǔn) Windows Server 2008 設(shè)備驅(qū)動(dòng)程序來(lái)執(zhí)行硬件訪問(wèn)。通過(guò)這種方式,運(yùn)行 Hyper-V 的服務(wù)器可以充分利用 Windows 對(duì)硬件設(shè)備的支持。
當(dāng)將 Windows Server 2008 配置為具有 Hyper-V 服務(wù)器角色時(shí),Windows 將把 hypervisorimagelaunchtypeboot 引導(dǎo)配置數(shù)據(jù)庫(kù) (BCD) 設(shè)置設(shè)為 auto,并將 Hvboot.sys 設(shè)備驅(qū)動(dòng)程序配置為在引導(dǎo)過(guò)程的前期啟動(dòng)。如果配置了該選項(xiàng),Hvboot.sys 將使系統(tǒng)做好虛擬化準(zhǔn)備,然后將 %Systemroot%\System32\Hvax64.exe 或 %Systemroot%\System32\Hvix64.exe 加載到內(nèi)存中,具體加載哪個(gè)程序取決于系統(tǒng)是實(shí)現(xiàn) AMD-V 虛擬化擴(kuò)展還是 Intel VT CPU 虛擬化擴(kuò)展。
加載完成后,管理程序使用虛擬化擴(kuò)展將自身插入到 Windows Server 2008 中。用戶模式的應(yīng)用程序使用 x64 處理器的 Ring 3 權(quán)限級(jí)別,而內(nèi)核模式代碼則在 Ring 0 上運(yùn)行,因此管理程序?qū)嶋H是在概念權(quán)限級(jí)別 Ring -1 上運(yùn)行,因?yàn)樗煽刂?Ring 0 上運(yùn)行的代碼的執(zhí)行環(huán)境。
當(dāng)使用 Hyper-V 管理控制臺(tái)創(chuàng)建或啟動(dòng)子分區(qū)時(shí),它將利用 %Systemroot%\System32\Drivers\Winhv.sys 驅(qū)動(dòng)程序來(lái)與管理程序通信,該驅(qū)動(dòng)程序使用公開(kāi)記錄的 hypercall API 來(lái)指示管理程序創(chuàng)建指定物理內(nèi)存大小的新分區(qū)和執(zhí)行特征。根分區(qū)中的 VM 服務(wù) (%Systemroot%\System32\Vmms.exe) 為每個(gè)子分區(qū)創(chuàng)建一個(gè) VM 工作進(jìn)程 (%Systemroot%\System32\Vmwp.exe) 以管理子分區(qū)的狀態(tài)。
Windows 改善子 VM 操作系統(tǒng)性能的其中一種方法是 Windows Server 2008 和 Windows Vista 都已實(shí)現(xiàn)的啟發(fā)方法(即僅當(dāng)操作系統(tǒng)運(yùn)行實(shí)現(xiàn) Microsoft hypercall API 的管理程序時(shí)才會(huì)激活的代碼序列)。通過(guò)直接請(qǐng)求管理程序的服務(wù),子 VM 避免了在管理程序必須猜測(cè)子操作系統(tǒng)的意圖時(shí)所產(chǎn)生的虛擬代碼開(kāi)銷。
例如,未實(shí)現(xiàn)自旋鎖(執(zhí)行底層多處理器同步)啟發(fā)方法的來(lái)賓操作系統(tǒng)將停在一個(gè)緊湊循環(huán)上旋轉(zhuǎn)以等待其他虛擬處理器釋放自旋鎖。此旋轉(zhuǎn)可能會(huì)阻塞其中一個(gè)硬件 CPU,直到管理程序調(diào)度第二個(gè)虛擬處理器。在啟發(fā)式操作系統(tǒng)中,自旋鎖代碼會(huì)在將要發(fā)生旋轉(zhuǎn)時(shí)通過(guò) hypercall 通知管理程序,這樣管理程序可以立即調(diào)度另一個(gè)虛擬處理器并降低不必要的 CPU 使用。
Windows Server 2008 改善 VM 性能的另一種方式是加速 VM 對(duì)設(shè)備的訪問(wèn)。可通過(guò)在子操作系統(tǒng)中安裝統(tǒng)稱為“VM 集成組件”的一個(gè)組件集合來(lái)增強(qiáng)性能。
如果運(yùn)行未安裝集成組件的 VM,則子操作系統(tǒng)將為管理程序所提供的模擬設(shè)備配置硬件設(shè)備驅(qū)動(dòng)程序。當(dāng)設(shè)備驅(qū)動(dòng)程序試圖使用硬件資源時(shí),管理程序必須進(jìn)行干預(yù)以便通知根分區(qū),根分區(qū)將代表子 VM 操作系統(tǒng)使用標(biāo)準(zhǔn) Windows 設(shè)備驅(qū)動(dòng)程序執(zhí)行設(shè)備 I/O。由于單獨(dú)的高級(jí) I/O 操作(例如讀磁盤)可能包含多個(gè)離散的硬件訪問(wèn),所以它可能導(dǎo)致管理程序和根分區(qū)中出現(xiàn)許多稱為“截取”的轉(zhuǎn)換。
Windows Server 2008 使用以下三種組件來(lái)最小化截取:虛擬機(jī)總線驅(qū)動(dòng)程序 (%Systemroot%\System32\Drivers\Vmbus.sys)、虛擬服務(wù)客戶端 (VSC) 和虛擬服務(wù)提供商 (VSP)。當(dāng)利用受支持操作系統(tǒng)將集成組件安裝到 VM 中時(shí),VSC 將取代設(shè)備驅(qū)動(dòng)程序的角色,并使用子 VM 中的 Vmbus.sys 驅(qū)動(dòng)程序服務(wù),通過(guò)管理程序的 hypercall 和內(nèi)存共享服務(wù)將高級(jí) I/O 請(qǐng)求發(fā)送到根分區(qū)中的虛擬機(jī)總線驅(qū)動(dòng)程序。在根分區(qū)中,Vmbus.sys 將請(qǐng)求轉(zhuǎn)發(fā)到相應(yīng)的 VSP,然后它通過(guò)根分區(qū)的設(shè)備驅(qū)動(dòng)程序來(lái)啟動(dòng)標(biāo)準(zhǔn) Windows I/O 請(qǐng)求。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
