在您套用此更新之後,您必須將 trace 標誌 T8075 新增為啟動參數,才能啟用此變更。
徵狀
當您在64位版本的 Microsoft SQL Server 2012 中執行查詢時,您會收到類似于 SQL Server 錯誤記錄中下列內容的記憶體不足錯誤訊息:
無法指派頁面: FAIL_PAGE_ALLOCATION 513
查詢需要花很長的時間來完成執行,而且會 SOS_MEMORY_TOPLEVELBLOCKALLOCATOR 等待。 當您檢查下列資訊點時,您會發現有非常低的可用虛擬位址空間:
-
DBCC MEMORYSTATUS-Process/系統計數區段-可用的虛擬記憶體
-
DMV: sys.dm_os_process_memory 欄 virtual_address_space_available_kb
這些值會在 x64 程式上從 8 tb (TB)開始,繼續順向下並達到幾個千百萬位元組(GB)。 當您在可用虛擬位址空間較低的階段時,嘗試執行記憶體分配的查詢也可能會遇到 CMEMTHREAD 的等待類型。 下列資料點將會隨著時間不斷增加:
-
DMV: sys.dm_os_process_memory 與 sys.dm_os_memory_nodes 欄 virtual_address_space_reserved_kb
-
DBCC MEMORYSTATUS-記憶體管理器區段-已保留 VM
這些值通常會以 [最大伺服器記憶體] 值的倍數增加到幾乎 8 TB。
原因
當 SQL Server 進程達到 [總伺服器記憶體 = 目標伺服器記憶體 = 最大伺服器記憶體] 的狀態時,在 SQL Server 記憶體管理器中有一些原則可讓新的分配要求多個 8 KB 頁面暫時失敗。 在這種情況下重複的分配模式可能會造成記憶體區塊和虛擬位址空間消耗的碎片。 如果這個程式重複多次,就會耗盡 SQL Server 虛擬位址空間,您會注意到先前提到的問題。
解決方案
累積更新資訊
此問題最初是在 SQL Server 的後續累積更新中修正。
每個新的 SQL Server 累計更新都包含所有的修正程式,以及前一個累積更新中所包含的所有安全性修正程式。 我們建議您下載並安裝最新的 SQL Server 累積更新:
此熱修復程式可避免記憶體不足以及您可能會遇到的可用虛擬位址空間持續減少。
狀態
Microsoft 已確認<適用於>一節中所列的 Microsoft 產品確實有上述問題。
其他相關資訊
-
Windows 2012 R2 可讓虛擬位址空間以大到 128 TB 的方式增加。 因此,您可能不會在 Windows 2012 R2 環境中注意到這個問題。 如需詳細資訊,請參閱 Windows 開發人員中心的下列主題:windows 和 Windows Server 版本的記憶體限制
-
如果您在套用修正程式之後,仍會看到虛擬位址空間中的連續增長,您可以使用 Page_allocated 延伸事件來判斷哪些查詢或作業要求大量的記憶體區塊。 範例腳本看起來像這樣:
CREATE EVENT SESSION [memory_tracking] ON SERVERADD EVENT sqlos.page_allocated( ACTION(package0.callstack,sqlos.cpu_id,sqlos.task_address,sqlos.worker_address,sqlserver.database_id,sqlserver.query_hash,sqlserver.request_id,sqlserver.session_id,sqlserver.sql_text) WHERE ([number_pages]>(1)))ADD TARGET package0.event_file(SET filename=N'E:\Data\MSSQL11.MSSQLSERVER\MSSQL\Log\memory_tracking.xel')WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=PER_CPU,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)GO
通常這些是記錄備份和索引維護作業,這會經常發生。