KB3074434 - 修正:當SQL Server程式的虛擬位址空間中的可用記憶體非常不足時,發生記憶體不足錯誤

套用到
SQL Server 2012 Service Pack 3 SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Enterprise Core SQL Server 2012 Standard

套用此更新之後,您必須將追蹤旗標 -T8075 新增為啟動參數,才能啟用此變更。

症狀

在 64 位元版本的 Microsoft SQL Server 2012 中執行查詢時,您會收到類似於 SQL Server 錯誤日誌中類似的記憶體不足錯誤訊息:

注意

配置頁面失敗:FAIL_PAGE_ALLOCATION 513

查詢需要很長的時間才能完成執行並遇到SOS_MEMORY_TOPLEVELBLOCKALLOCATOR等待。

當您檢查以下資訊點時,會發現可用的虛擬位址空間非常少:

  • DBCC MEMORYSTATUS - [處理序/系統計數] 區段 - 可用虛擬記憶體
  • DMV:sys.dm_os_process_memory - 資料行virtual_address_space_available_kb

這些值在 x64 進程上大約 8 TB (TB) 開始,並持續下降並達到幾 GB (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 的每個新累積更新都包含所有 Hotfix 和先前累積更新的所有安全性修正程式。 我們建議您下載並安裝 SQL Server 的最新累積更新:

此 Hotfix 可防止記憶體不足,以及您可能會遇到的可用虛擬位址空間持續減少的情況。

狀態

Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。

更多資訊

  • Windows 2012 R2 允許虛擬位址空間增長至 128 TB。 因此,在 Windows 2012 R2 環境中,您可能不會注意到此問題。 如需詳細資訊,請參閱 Windows 開發人員中心的下列主題:

    Windows 和 Windows Server 版本的記憶體限制

  • 如果您在套用修正程式之後,仍看到虛擬位址空間持續成長,您可以使用 Page_allocated 擴充事件來判斷哪些查詢或作業要求大量記憶體。 範例指令碼如下所示:

    CREATE EVENT SESSION [memory_tracking] ON SERVER
    ADD 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
    
    
    

    這些通常是經常發生的日誌備份和索引維護操作。