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 記憶體狀態 - 程序/系統計數區塊 - 可用虛擬記憶體
  • 車輛管理局:sys.dm_os_process_memory - 第virtual_address_space_available_kb欄

這些數值在 x64 程序上起初約 8 TB (TB) ,並逐漸下降,) (數 GB。 

當你處於可用虛擬位址空間非常低的階段時,嘗試執行記憶體分配的查詢也可能遇到等待型的 CMEMTHREAD。

以下數據點將隨時間持續增加:

  • 車輛管理局:sys.dm_os_process_memory與sys.dm_os_memory_nodes - 第virtual_address_space_reserved_kb欄
  • DBCC MEMORYSTATUS - 記憶體管理員區段 - VM 已保留

這些數值通常會以「最大伺服器記憶體」值的倍數增加,最高可達近 8 TB。

原因

當 SQL Server 程序達到 Total Server Memory = Target Server Memory = 最大伺服器記憶體時,SQL Server 記憶體管理器中有政策允許新配置請求多個 8 KB 頁面,以暫時成功。 在此條件下重複配置模式可能導致記憶體區塊碎片化及虛擬位址空間的消耗。 如果這個過程重複多次,SQL Server 虛擬位址空間就會被耗盡,你會注意到前面提到的症狀。

解決方式

累積更新資訊

此問題首次在 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 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
    
    
    

    通常包括日誌備份與索引維護操作,且經常發生。