分享方式:


針對快取與記憶體管理員效能問題進行疑難排解

在 Windows Server 2012 之前,兩個主要的潛在問題導致系統檔案快取成長,直到某些工作負載下可用的記憶體幾乎耗盡為止。 當這種情況導致系統變慢時,您可以判斷伺服器是否面臨下列其中一個問題。

要監視的計數器

  • 記憶體\長期平均待命快取存留期 (秒) < 1800 秒

  • 記憶體\可用 (以位元組、KBytes 或 MBytes 為單位)

  • 記憶體\系統快取常駐位元組

如果記憶體\可用的 Mbytes 很低,而且同時記憶體\系統快取常駐位元組正耗用實體記憶體的一大部分,您可以使用 RAMMAP 來找出快取的用途。

系統檔案快取包含 NTFS 中繼檔資料結構

此問題會由 RAMMAP 輸出中的大量使用中中繼檔案頁面所表示,如下圖所示。 可能會在有數百萬個檔案被存取的忙碌伺服器上觀察到此問題,因而導致快取 NTFS 中繼檔資料無法從快取中釋出。

rammap view

以往會使用 DynCache 工具來減輕問題。 由於 Windows Server 2012+ 中的架構已經過重新設計,此問題應該不再存在。

系統檔案快取包含記憶體對應檔案

此問題會由 RAMMAP 輸出中的大量使用中對應檔案頁面所表示,如下圖所示。 這通常表示伺服器上的某些應用程式正在使用 CreateFile API (已設定 FILE_FLAG_RANDOM_ACCESS 旗標) 開啟大量大型檔案。

知識庫文章 2549369 會詳述此問題。 FILE_FLAG_RANDOM_ACCESS 旗標是對於快取管理員的提示,以儘可能長時間將檔案的對應檢視保留在記憶體中 (直到記憶體管理器未發出記憶體不足的訊號)。 同時,此旗標會指示快取管理員停用預先擷取檔案資料。

Windows Server 2012+ 中的工作集修整改進在一定程度上緩解了這種情況,但問題本身需要由應用程式供應商負責解決,而不是使用 FILE_FLAG_RANDOM_ACCESS。 應用程式廠商的替代解決方案可能是存取檔案時,使用低記憶體優先順序。 這可以使用 SetThreadInformation API 來達成。 以低記憶體優先順序存取的頁面會更積極地從工作集中移除。

從 Windows Server 2016 開始的快取管理員透過在做出修剪決策時忽略 FILE_FLAG_RANDOM_ACCESS 來進一步解決此問題,因此問題的處理方式就像在沒有 FILE_FLAG_RANDOM_ACCESS 旗標的情況下打開的任何其他檔案一樣 (快取管理器仍遵循此標誌以停用檔案資料的預取)。 如果您有大量以這個旗標開啟且以真正隨機的方式存取的檔案,您仍然可以造成系統快取膨脹。 強烈建議應用程式不要使用 FILE_FLAG_RANDOM_ACCESS

遠端檔案已變更頁面閾值一致超過

若系統在從遠端用戶端寫入期間偶爾會變慢,則會表示此問題。 當大量資料從快速遠端用戶端寫入慢速伺服器目的地時,可能會出現此問題。

在 Windows Server 2016 之前,在這類案例中,如已達到快取中已變更頁面的閾值,進一步的寫入將表現得像有寫穿一樣。 這可能會導致大量資料排清到磁碟,如果儲存體速度緩慢,可能會導致長時間延遲,而導致遠端連線逾時。

在 Window Server 2016 和轉送中,已設定緩和措施,以減少逾時的可能性。 為遠端寫入實作單獨的中途分頁閾值,當超過該閾值時,將執行內嵌排清。 這可能會導致在大量寫入活動期間偶爾會變慢,但在大部分情況下會消除逾時的風險。 根據預設,遠端已變更頁面閾值為 每個檔案 5 GB。 對於某些配置和工作負載,使用不同的數字效果會更好。

如果預設大小 5 GB 不適合您的組態,建議嘗試以 256 MB 的增量提高限制,直到效能令人滿意為止。 請注意下列事項:

  • 需要重新啟動才能使對此登錄機碼的變更生效。

  • RemoteFileDirtyPageThreshold 的單位 頁數 (由快取管理員所管理的頁面大小)。 這表示它應該設定為所需的位元組大小,除以 4096。

  • 建議值為 128 MB <= N <= 50% 的可用記憶體。

  • 您可以將此閾值設定為 -1,以完全停用。 不建議,因為這可能會導致遠端連線逾時。

例如,若您希望將限制設定為 10GiB,也就是 10,737,418,240 位元組/ 4096 = 2,621,440,這是 2621440 的十進位 DWORD 值。

您可以使用下列登錄值來控制此閾值。

  • 金鑰HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
    • 類型DWORD
    • 值名稱: RemoteFileDirtyPageThreshold
    • 值名稱:十進位 - 頁數 (快取管理員所管理的頁面大小)。