应用此更新后,你必须添加 跟踪标记-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 开始,并继续顺向下并达到几千兆字节(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
通常情况下,这些是日志备份和索引维护操作,这些操作经常发生。