【短文】記憶體最佳化的鬧劇 --- RAM 最佳化工具的不實承諾



贊助商連結


琥珀
2004-04-14, 09:16 PM
文章來源:Windows & .NET Magazine, April 2004
作者:Mark Russinovich

能夠重組記憶體並增進效能的工具,乍聽之下似乎不錯,但真是如此嗎?本文帶你一探記憶體最佳化工具的真章。

當您瀏覽網頁的時候,你有時候可能會看到瀏覽器跳出像是「重組你的記憶體並且增進效能」,另外還有像是「減少應用程式與系統的失敗,並且釋放沒有使用的記憶體」。如果你按下滑鼠,連結到廣告所提供的工具網站,你就會看到只要多付 9.95 美元、14.95 美元或 29.95 美元,就可以提供你達到這個目的的工具。聽起來似乎還不錯?這些工具似乎看起來可以替你做一些有用的工作,但其中的記憶體最佳化工具是沒有效果的,且更糟的是,可能會嚴重地影響效能。

你可以找到好幾十種所謂的「記憶體最佳化工具」,有些是商業軟體,有些則是一些免費軟體。你可能會想在自己的系統上執行像是這樣的產品,這些產品真正能做什麼?而這些產品是否愚弄了你,讓你相信產品所聲稱的效果?本文就讓我們深入的剖析記憶體最佳化工具的內部,看這些工具是如何控制 Windows 內部的可見記憶體計算。

@小標 記憶體最佳化工具的使用者介面

記憶體最佳化工具一般所提供的使用者介面,可以顯示可用記憶體的圖形顯示,以及以線條呈現閥值,如果記憶體低於該閥值,工具就會採取動作。另外一個線條則顯示最佳化工具在執行的時候,嘗試釋放的記憶體數量。通常你可以設定其中一個或是兩者的等級;使用手動的方式啟動記憶體最佳化或是使用排程的方式執行最佳化。某些工具則還可以顯示執行於系統上的處理程序。

當排程好的最佳化工作執行的時候,工具的可用記憶體計數器通常會往上爬升,有時候這個數字會大幅增加,讓使用者感覺這個工具實際上釋放了許多記憶體可以讓你的應用程式執行。為了瞭解這些工具實際上是如何讓可用記憶體上升的,我們必須先瞭解 Windows 管理實體記憶體的方式。

@小標 Windows 記憶體管理

與大部分目前的作業系統類似,Windows 採用了根據需求而規劃的頁次虛擬記憶體系統。作業系統使用虛擬記憶體提供應用程式一個假象,就是電腦擁有比實體記憶體更多記憶體。

在 32 位元的 Windows 系統上,處理程序可以定址虛擬記憶體達到 4GB,作業系統會在處理程序和系統之間平均的分配。因此,根據使用的量,處理程序可以配置達到 2GB 的虛擬記憶體。配置給所有處理程序的所有虛擬記憶體,不可以超過系統頁次檔案以及其大部分實體記憶體的總量(作業系統保留相當小部份的實體記憶體)。

因此針對處理程序,只要有足夠的頁次檔案,可以配置超過電腦實體記憶體能力的虛擬記憶體,Windows 記憶體管理員子系統必須在處理程序之間與快取管理員的快取檔案資料分享實體記憶體。記憶體管理員指定給每個處理程序(例如 Microsoft Word、記事本、檔案總管)一部分的實體記憶體,我們稱之為處理程序的工作集。Kernel 和驅動程式可以使用頁次的部分,除了可以使用頁次的 Kernel,記憶體緩衝區之外的部分,我們稱之為頁次集區。由快取管理員管理的實體記憶體,會指定他們自己的工作集,稱之為系統工作集。

記憶體管理員可以擴充和縮減系統和處理程序的工作集,以回應處理程序快速存取他們的程式碼和資料的需求。電腦的記憶體管理硬體,需要 Windows 管理工作集和虛擬記憶體以頁次大小區塊的方式管理(在 32 位元的 x86 處理器,頁次的大小一般是 4096 位元組,然而,作業系統和需要耗用大量記憶體的應用程式,當有可能的時候,也使用單位比較大的 4MB 頁次作為最佳化選擇)。

當處理程序存取不存在於工作集的虛擬記憶體的頁次時,處理程序會產生頁次錯誤硬體例外情況。當發生這種情況的時候,記憶體管理員會指定可以使用的實體記憶體指定頁次,以儲存新存取的資料。另外,記憶體管理員可能會決定藉由增加頁次到工作集中,擴充處理程序的工作集。然而,如果記憶體管理員需要處理程序的工作集夠大,就會使用新的頁次與已經存在於工作集的頁次進行交換,選擇取代處理程序最近所存取的頁次,這是假設處理程序最近不太可能會存取該頁次。

當記憶體管理員從處理程序工作清單移除頁次的時候,必須決定要對頁次做什麼事情。如果頁次已經修改了,記憶體管理員會先放置到修改的頁次清單,頁次的清單最後會寫到頁次檔案,或是到網頁所對應的記憶體對應檔案中。從被修改的頁次清單中,記憶體管理員會挪動頁次到名稱為待命清單的集區。沒有修改過的頁次,則會直接到待命清單中。因此,你可以將待命清單當成是資料的快取。

@小標 可以使用的記憶體

我們之前提到記憶體管理員會提供可以使用的實體記憶體頁次,給產生頁次錯誤的處理程序,但是我們還沒有說明如何定義可用的記憶體。待命清單是記憶體管理員認為是實體記憶體的一部分。其他成為可用記憶體的集區,是包含屬於配置虛擬記憶體資料的頁次(例如:包含已經離開處理程序的),另外還有已經清空,以及後續被記憶體管理員的低優先性空頁次執行緒所填入的空資料。這些類型的頁次,會分別儲存在記憶體管理員的可用清單和空頁次清單。

圖 2 顯示了發生在工作集和頁次清單之間的轉換。每一秒的時候,系統執行緒會啟動,然後呼叫記憶體管理員的工作集管理員,檢查系統和處理程序的工作集。如果可用記憶體偏低,工作集管理員會從處理程序移除在過去一秒還沒有產生的許多頁次錯誤。被移除的頁次會到被修改或待命清單中,以準備提供於可用記憶體。這種調校機制有個重要的副作用,如果系統需要提供其他處理程序記憶體,記憶體管理員就會從閒置處理程序的工作集取得頁次。這樣一來,那些處理程序的工作集最後就會消失,也就是說那些處於閒置狀況的處理程序,如果閒置時間過長,最後會沒有實體記憶體可以使用。

當處理程序需要有新的實體記憶體頁次的時候,記憶體管理員會先判斷所存取的處理程序頁次是否位於待命或修改的頁次清單。如果頁次從處理程序工作集移除,並且基於其他的目的沒有重複使用,頁次就會在這些清單中。將頁次放回到處理程序工作集,我們稱之為軟頁次錯誤,因為與硬頁次錯誤不同的是,並不會產生從磁碟讀取頁次檔案或是其他的檔案。

如果頁次不在待命清單,或是在修改的頁次清單中,記憶體管理員就會從已經有頁次的清單取得頁次,首先檢查可用的清單,然後是空頁次清單,最後則是待命清單。如果沒有記憶體可以取得,記憶體管理員就會觸發「平衡集管理員」,進行處理程序工作集的整理,並且產生三個清單的其中之一,以取得可以使用的記憶體。如果記憶體管理員必須從空頁次、可用或待命清單移除頁次以供重複使用,則決定於如何存取目標的程式碼或資料,其中包括了從頁次檔案讀取資料或可執行檔映像內容,或是建立空資料(如果應用程式配置了新的資料,而頁次並不是從空頁次清單取得)。

@小標 建立可用記憶體

在瞭解了記憶體管理員的行為之後,我們現在可以將注意力放到記憶體最佳化程式的工作上。記憶體最佳化程式所顯示的可用記憶體數據,與在工作管理員中,「效能」頁次的「實體記憶體」可用部分的值是一樣的。這個值是待命、零頁次與可用清單的總和。系統快取記憶體則是待命清單和系統工作集的總和(在 Windows NT 4.0 以及之前的版本,檔案快取的值只反應了系統工作集)。

記憶體最佳化工具藉由配置,然後釋放大量的虛擬記憶體,應用了記憶體管理員行為的優點。圖 4 顯示了記憶體最佳化工具在系統上的產生的效果。第一列顯示了在最佳化前的工作集與可用記憶體。第二列顯示了記憶體最佳化工具,藉由在短時間中增加許多的頁次錯誤,建立了高記憶體需求。為了回應這樣的需求,記憶體管理員增加了最佳化器的工作集。這個工作集的擴充發生在可用記憶體的耗用(當可用記憶體變低),使用了其他處理程序工作集的耗用。第三列顯示了在記憶體最佳化程式釋放記憶體之後的情況,記憶體管理員會移動所有指定給記憶體最佳化工具的所有頁次到可用清單,因此可以增高可用記憶體的值。大部分的最佳化器隱藏了在第一個步驟的時候可用記憶體快速降低的事實,但是如果你在最佳化的時候執行工作管理員,你經常可以看到記憶體降低的情況。

雖然取得更多可用記憶體似乎可以獲得效益,但是情況並非如此。由於記憶體最佳化工具強迫升高可用記憶體,因此也就強迫其他處理程序資料和程式碼從記憶體釋出。假設你正在執行 Word,而最佳化器強迫進行可用記憶體的升高,Word 的開啟文件文字以及程式碼在最佳化之前存在於記憶體中(也就是在實體記憶體中),必須從磁碟再次讀取,你才能繼續編輯文件。效能的降低會對伺服器造成影響,因為在待命清單以及在系統工作集中快取的檔案資料(另外還有被活動中的伺服器應用程式所使用的程式碼和資料),可能都會清除。

@小標 其他記憶體最佳化工具的宣稱

某些廠商會針對他們的記憶體最佳化工具產品作出額外的宣稱。像是你可能會看到產品能夠釋放沒有使用的處理程序所佔用的記憶體(如那些在工作列中執行的程式)。所有的這些宣稱都是不真實的,因為 Windows 會自動的清除閒置處理程序的工作集。記憶體管理員會控制所有必要的記憶體最佳化。

記憶體最佳化工具的開發人員也會宣稱他們的產品能夠對記憶體進行重組。配置的動作會釋放大量的虛擬記憶體,產生可能的副作用,進而產生連續的可用記憶體區塊。然而因為虛擬記憶體是從處理程序配置實體記憶體,處理程序無法直接從擁有虛擬記憶體獲得好處,雖然後面是連續的實體記憶體。隨著處理程序的執行及底下工作集的減少或成長,他們的虛擬記憶體對實體記憶體對應會成為斷離情況,而不管連續記憶體情況如何。

擁有連續的可用記憶體,可以在一種情況中增進效能:當記憶體管理員最大化 CPU 記憶體快取的行為,會使用稱為「頁次染色」(page coloring)的機制,判斷從可用或空頁次清單的哪個頁次,要指定給處理程序。然而,任何由於連續可用實體記憶體所得到小小效益,可能會由於程式碼與資料從記憶體被迫移出,而減損所帶來的價值。

最後,廠商通常會宣稱記憶體最佳化工具,可以重新取得記憶體記憶體遺漏的部分。這樣的說法可能所有說法中最大的錯誤。

記憶體管理員不管在任何時候,都知道實體與虛擬記憶體屬於哪個處理程序。然而如果處理程序配置了記憶體,可能會由於程式的 Bug 導致記憶體在使用後沒有釋放的情況(一般稱之為遺漏--leak),記憶體管理員無法確認所配置記憶體不會在相同點被存取,因此會一直等待,直到處理程序結束,並且釋出其所擁有的記憶體為止。

即是在不會會產生遺漏的處理程序中,記憶體管理員工作集的縮減,最後還是會從處理程序的工作集中,任何指定給遺漏虛擬記憶體的任何實體頁次取得記憶體。該處理程序會傳送遺漏頁次給頁次檔案,並且讓系統使用實體記憶體以供其他處理程序使用。因此,記憶體遺漏只會對可用實體記憶體產生有限的影響。真正的影響是在虛擬記憶體的耗用上(工作管理員稱之為 PF Usage 和 Commit Charge)。沒有工具可以對虛擬記憶體的耗用做任何事情,除非直接刪除耗用記憶體的處理程序。

@小標 假軟體

我們已經看過記憶體最佳化工具的一些說法。如果你更仔細的研究,你會發現廠商會在網站上加上一句推翻自己長久以來的宣稱—產品可能對系統的效能沒有任何影響,並且也可能會降低系統的效能。即使不知道這些產品是如何應用記憶體管理員的特性,讓記憶體的統計數能上升,一般在常識上我們可以這樣想,若記憶體最佳化工具有效,Microsoft 開發人員應該很早就會直接整合到 Kernel 部分了。