系統環境:
Windows Server 2008 R2 + Sql Server 2008 R2
問題描述:
Windows Server 2008 R2系統內存佔用率過大,而在任務管理器中各進程內存佔用總和都遠不到此佔用率。
相關現象:
1. 內存佔用率90%以上
2. 任務管理器中全部進程內存和較低,遠不到90%,有二十多G的內存誤差
分析過程:
-
首先懷疑SQL Server內存佔用,可是SQL Server設置了最大內存,且任務管理器中顯示的內存佔比並無達到很高,排除此緣由
-
用RamMap工具查看內存的詳細使用狀況,發現圖元文件(Metafile)佔用了二十多G的內存,應該與此有關
解決方法:利用RamMap的「清空系統工做集」功能,能夠釋放內存。
圖元文件(Metafile):
Metafile能夠理解爲系統緩存,Windows server 2008系統中,好比存在大量的文件拷貝等磁盤io操做,系統會自動將其緩存到內存中,這部分被佔用的內存在任務管理器的中未體現出來的,因此用戶會認爲系統的內存佔用異常。同時,MetaFile默認是沒有限制的,因此係統會無限制佔用內存。 可是對於Windows 2012以後,操做系統會自動限制系統緩存的上限從而避免物理內存的耗盡。
看了圖元文件的解釋後,發現前兩天一直在作轉移文件的操做,幾百G的大量小文件在不一樣磁盤中轉移,從而致使內存佔用太高,符合此解釋。至此,問題調查清楚。
以下, 是微軟官方Blog中介紹修改註冊表來限制動態緩存的方法:
Microsoft Windows Dynamic Cache的更新程序,用戶能夠下載後添加到服務中,經過修改註冊表來限制動態緩存的最大值,好比設置上限爲200M等,這樣系統就能夠把做爲緩存使用的內存設置了上限值。
具體設置步驟以下:
1. 解壓後根據不一樣系統版本中對應的DynCache.exe文件複製到C:\windows\system32中。
2. 以管理員身份打開命令提示符,執行以下命令添加服務:
sc create DynCache binPath= %SystemRoot%\System32\DynCache.exe start= auto type= own DisplayName= "Dynamic Cache Service"
3. 回到DynCache文件夾,找到DynCache.reg的註冊表文件導入。
4. 打開註冊表,找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DynCache\Parameters
5. 右側找到MaxSystemCacheMBytes,雙擊它,這裏咱們選擇「十進制」,在數值裏輸入要限制最大的緩存數(單位是MB),輸入800就是限制緩存最大爲800MB,輸入0爲不限制。
6. 到服務中啓動DynCache服務。
注:下載的dyncache解壓出來是有多幾個版本可選的,請選擇retail amd64的版本,不要選擇ia64(ia64表示安騰的64位處理器版本)。