挑戰Windows極限:物理內存

挑戰Windows極限:物理內存

打現在起數月內,筆者將會撰寫一個系列專題,而這是開山第一篇。該系列叫做《挑戰Windows極限》,描述Windows和應用程序對具體資源的使用方法、資源使用在許可和實現方面的限制、資源使用的測量方法,以及資源泄露的診斷方法等。爲了能夠有效地管理Windows系統,我們需要知道Windows系統是怎樣管理物理資源的,例如CPU和內存等,還要知道Windows系統怎樣管理邏輯資源的,例如虛擬內存、句柄,還有窗口管理器對象等。瞭解這些資源的限制,並對其使用情況進行追蹤,有助於我們精確地掌握應用程序的資源使用狀況,幫助我們給某個關鍵應用分配足夠多的系統資源,還有助於我們找出導致資源泄露的應用程序。

物理內存

物理內存是計算機上的最重要的資源之一。Windows的內存管理器負責給活動進程、設備驅動,和操作系統自己分配內存。因爲絕大多數系統所能訪問的數據和代碼遠比物理內存多,所以從本質上來說,物理內存是代碼和數據在其中運行的窗口。所以內存容量對性能有影響,因爲如果進程或者操作系統所需的代碼或者數據不存在,內存管理器就需要從磁盤中讀取這些內容。

除了會對性能造成影響,物理內存的容量還會影響其他資源。例如,對於非分頁池來說,這是由物理內存提供後備的操作系統緩衝,很明顯,其容量會受到物理內存的限制。物理內存也會對系統的虛擬內存限制有影響,虛擬內存的大小等於物理內存容量、再加上所有頁面文件的最大容量。物理內存還會對進程的最大數量具有間接的影響,筆者將會在今後的文章裏專門提到線程和進程的限制。

Windows Server內存限制

Windows對於物理內存的支持,要受到諸如硬件限制、許可、操作系統數據結構,以及驅動程序的兼容性等方面的綜合影響。MSDN網站的Memory Limits for Windows Releases文章對不同Windows版本、以及同一個版本的不同SKU的限制進行介紹。

我們可以查看所有Windows版本的不同SKU的物理內存支持許可。例如,32位Windows Server 2008標準版僅支持4GB,而32位Windows Server 2008數據中心版支持64GB。類似的,64位Windows Server 2008標準版支持32GB,而64位32位Windows Server 2008數據中心版支持2TB。目前來說,並沒有多少系統擁有2TB內存,不過Windows Server性能產品組知道有兩臺服務器擁有那麼多的內存,其中一臺位於某地的實驗室。該服務器的任務管理器如下圖所示:

32位的最大限制是128GB,Windows Server 2003數據中心版可以支持,這是因爲在大內存的系統上,內存管理器用來追蹤物理內存的結構,需要消耗更多系統虛擬地址空間。內存管理器把每個內存頁的追蹤數據保存在叫做PFN數據庫的數組中,而且考慮到性能因素,會把整個PFN數據庫映射到虛擬內存中。因爲它用28字節的數據結構來代表每個內存頁,128GB系統的PFN數據庫需要將近930MB的空間。32位Windows擁有4GB的虛擬地址空間,由硬件所定義,默認劃分爲兩半,其中一半供用戶模式進程(例如Notepad)所使用,另一半供系統所使用。因此980MB的容量就要佔據將近一半的系統虛擬地址空間(共2GB),只剩下約1GB空間可以用來映射內核、驅動程序、系統緩存和其他系統數據結構:

這也就是爲什麼當同一個SKU版本以4GB的調整選項引導時(也叫做4GT,在Boot.ini文件裏配置/3GB或者/USERVA選項,或者配置Bcdedit命令的/Set IncreaseUserVa啓動選項),其內存限制會更大,這是因爲4GT選項會給用戶模式進程分配3GB空間,而僅給系統保留1GB空間。

內存管理器可以僅把PFN數據庫的一部分映射到系統地址空間,這樣就可以提供更多的內存空間,這會增加複雜性,同時由於增加了映射和取消映射的操作,而可能導致性能的下降。由於直到現在,計算機所配備的內存容量才變得足夠大,才需要考慮採用這種辦法,但是因爲在64位Windows中,並不需要強制把整個PFN數據庫映射到系統地址空間,所以這種可以提供更多內存的辦法僅供64位Windows使用。

64位Windows Server 2008數據中心版最多支持2TB內存,這不是由於硬件限制所造成的,而是因爲微軟對2TB進行了嚴格測試,而只支持2TB內存。在Windows Server 2008發佈的時候,計算機所配備的最大內存基本上就是2TB,所以Windows將其作爲物理內存的最大值。

Windows客戶端內存限制

64位Windows客戶端,不同SKU的內存支持也有所不同,Windows XP Starter版的內存支持最低,僅512MB,而Windows Vista旗艦版的內存支持最高,可達128GB。但是所有版本的32位Windows客戶端SKU,包括Windows Vista、Windows XP和Windows 2000 Professional,最大支持4GB物理內存。標準的X86內存管理模式,最大可以支持4GB的物理地址訪問。在早期,並不需要考慮在客戶端提供超過4GB的支持,因爲當時很少有計算機配備那麼高的內存,哪怕是服務器。

但是在Windows XP SP2開發的過程中,已經可以預見客戶端計算機將會配備超過4GB的內存,所以Windows產品組對超過4GB的Windows XP計算機進行大量的測試。Windows XP SP2還支持物理地址擴展(PAE)功能,該功能本來是爲了在硬件上實現非執行(NX)保護,因爲這是數據執行保護(DEP)的必要條件,但是該功能還可以支持超過4GB的內存。

Windows產品組的工程師發現,很多測試計算機會發生崩潰、掛起,或者無法啓動的故障現象,這是因爲某些設備驅動程序,主要是一些客戶端計算機(而非服務器)上的顯卡或者聲卡,其驅動程序在編寫時沒有考慮到內存大於4GB的情況。所以,這些驅動程序會截去那部分地址,從而導致內存衝突以及其他副作用。而服務器則通常會配備更加常規的硬件設備,其驅動程序更加簡單穩定,因爲通常來說碰到這些問題的機率很小。由於客戶端設備驅動程序所存在的這些問題,迫使Windows客戶端SKU只能忽略高於4GB的那部分物理內存,哪怕從理論上來說可以對其進行尋址。

32位客戶端計算機的實際內存限制

儘管從許可上來說,32位客戶端SKU的最大內存支持是4GB,但是實際上的限制會更低,這要看計算機的芯片組以及所連接的設備。這是因爲物理地址映射不僅僅包含物理內存,還包含設備內存,X86和X64位系統會把所有設備內存映射到低於4GB的地址邊界,以便確保和32位操作系統的兼容性,這些操作系統不知道如何處理超過4GB的地址部分。如果計算機配備4GB內存和類似顯卡、聲卡和網卡這樣的設備,Windows會給這些設備內存分配共計500MB空間,而4GB物理內存中的500MB只能佔用超過4GB的地址邊界,如下圖所示:

其結果是,如果計算機擁有3GB或者更多內存,同時又運行32位Windows客戶端操作系統,我們可能無法享受到所有內存。在Windows 2000、Windows XP和Windows Vista RTM系統上,我們可以在系統屬性對話框、任務管理器的“性能”標籤頁上看到可以訪問的物理內存,在Windows XP和Windows Vista(包含SP1)中,我們還可以在Msinfo32和Winver工具窗口裏看到這些信息。在Windows Vista SP1中,其中某些工具會顯示系統所安裝的物理內存,而不是可以使用的內存,可以參考這篇微軟知識庫文章

在筆者的4GB筆記本電腦中,如果啓動到32位Windows Vista,可用的物理內存是3.5GB,可以在Msinfo32工具中看到。

我們可以使用Alex Ionescu所開發的Meminfo工具來查看物理內存的分配情況(這哥們將會參與編寫《Windows Internals》的第五版,原本由筆者和David Solomon合寫)。在這檯筆記本電腦上運行Meminfo,並加上-r參數以便轉儲物理內存的分配情況,結果如下圖所示:

注意其中內存地址範圍中存在兩個缺口,其中一個從頁9F0000到頁100000,另一個缺口從DFE6D000到FFFFFFFF(4GB)。但是,如果啓動到64位Windows Vista,所有的4GB內存都可以使用,剩餘的500MB物理內存位於高於4GB邊界的地址部分,我們可以看到Windows是如何使用這500MB物理內存的:

到底是誰佔據了4GB以下的內存地址?設備管理器可以回答這個問題。要訪問該工具,可以運行“devmgmt.msc”,在“查看”菜單中選擇“依連接排序資源”選項,然後展開“內存”節點。在筆者的這檯筆記本上,最大的映射設備內存,果然是顯卡產生的,共佔據256MB內存,從E0000000-EFFFFFFF:

其他設備佔用其他大部分的地址空間,PCI總線會保留一部分地址範圍,以供系統引導時某些設備固件所使用。

在帶超級顯卡的高端遊戲計算機上,4GB以下的內存地址會減少很大一塊。舉個例子,筆者曾經購買過一臺遊戲計算機,帶4GB內存和兩塊1GB的顯卡。在採購時,筆者並沒有指定操作系統版本,還以爲他們會安裝64位版本的Windows Vista,但是實際上安裝的是32位版本,結果Windows只能訪問2.2GB的內存。安裝64位Windows後,我們可以在Meminfo的結果中看到從8FEF0000到FFFFFFFF存在如此大的內存空洞:

設備管理器顯示,在2GB的內存空洞中,有512MB是顯卡所佔用的(每塊顯卡佔用256MB),看起來設備固件保留其他更多的動態映射內存:

哪怕計算機只有2GB內存,在32位Windows中也無法使用所有的內存,因爲芯片組會爲設備強制保留一部分內存範圍。我們的一臺家庭公用計算機,幾個月前從一家OEM廠商那裏購買的,顯示安裝了2GB內存,但是隻有1.97GB是可用的:

其中7E700000到FFFFFFFF的物理地址範圍是給PCI總線和設備所保留的,理論上還有最多7E700000字節(1.976GB)的物理地址空間,但是其中還有一些還要給設備內存所保留,這就是爲什麼Windows報告說1.97GB。

因爲設備廠商需要向微軟硬件質量實驗室(WHQL)同時遞交32位和64位驅動程序,才能獲得驅動程序簽名認證,目前絕大多數設備驅動程序能夠處理超過4GB邊界的物理地址。但是,32位Windows會繼續忽略超出4GB的內存空間,因爲很難衡量這樣做的風險,如果沒有問題的話,OEM廠商應該轉向64位Windows。

使用64位Windows,我們能夠完全使用所有的系統內存(SKU的最大限制),而不管容量多大,如果我們要購買高端遊戲計算機,則應該請OEM廠商預裝64位Windows。

是否擁有足夠的內存?

不管系統擁有多少內存,問題是內存是否足夠?不幸的是,我們沒有快又準的方法來確切地瞭解。這裏只有一個大致的辦法可以使用,該方法基於對系統“可用”內存的長期監控,特別是在運行內存密集型負載的時候。如果物理內存沒有分配給進程、內核,或者驅動程序,則Windows會把這部分物理內存定義爲可用內存。顧名思義,可用內存可以在需要時分配給某個進程或者系統。Windows當然會對這部分內存進行最大限度的利用,會將其用作文件緩存(備用列表),還有存放清零內存(清零頁列表),另外,Windows Vista還會使用SuperFetch功能,把數據和代碼預加載到備用列表中,確保今後會使用的代碼和數據,得到優先處理。

如果可用內存變少了,這說明進程或者系統正在大量消耗內存,如果可用內存在相當長的時間內都接近0,則可以考慮添加內存,有助於增加性能。有很多方法可以追蹤可用內存。在Windows Vista裏,我們可以在任務管理器裏查看“物理內存使用記錄”,以便間接地追蹤可用內存,確認其是否長期逼近100%。筆者的8GB桌面計算機的任務管理器如下圖所示(嘿嘿,是不是覺得偶的內存太多了哈!):

在所有版本的Windows中,我們可以使用性能監視器來查看可用內存,只需在Memory計數器組中添加Available Bytes計數器即可:

我們可以在Process Explorer的“System Information”對話框裏查看可用內存的即時值,也可以在Windows Vista之前的Windows系統的任務管理器的“性能”標籤頁裏查看可用內存大小。

挑戰極限

在CPU、內存和磁盤這三大因素中,對總體系統性能來說,內存通常是最重要的。內存越多越好。64位Windows可以確保我們能夠充分利用所有內存,而且64位Windows還有其他一些性能上的優勢,這些筆者將會在今後的系列博客文章講到有關虛擬內存限制的時候再提及。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章