После применения этого обновления необходимо добавить флаг трассировки — T8075 в качестве параметра запуска, чтобы включить это изменение.
Проблемы
При выполнении запроса в 64-разрядной версии Microsoft SQL Server 2012 появляется сообщение об ошибке "недостаточно памяти", подобное приведенному ниже в журнале ошибок SQL Server.
Сбой выделения страниц: FAIL_PAGE_ALLOCATION 513
Выполнение запросов занимает много времени, и возникнет SOS_MEMORY_TOPLEVELBLOCKALLOCATOR ожидания. Когда вы просматриваете следующие информационные точки, вы обнаружите, что для виртуального адресного пространства очень мало свободного места:
-
Раздел DBCC MEMORYSTATUS-Process/System инвентаризации — Доступная виртуальная память
-
Представление DMV: sys.dm_os_process_memory-столбец virtual_address_space_available_kb
Эти значения начинаются около 8 терабайт (ТБ) в процессе x64 и продолжают переходить к нескольким гигабайтам (ГБ). Если вы находитесь в рабочей области, где доступное виртуальное адресное пространство очень низкое, запросы, которые пытаются выполнить выделение памяти, также могут столкнуться с типом ожидания CMEMTHREAD. Следующие точки данных будут увеличиваться с течением времени.
-
Представление DMV: sys.dm_os_process_memory и sys.dm_os_memory_nodes-Column virtual_address_space_reserved_kb
-
Раздел DBCC MEMORYSTATUS-Memory Manager — виртуальная машина зарезервирована
Эти значения обычно увеличиваются в кратных значениях "max server memory" до почти 8 ТБ.
Причина
Когда процесс SQL Server достиг состояния, в котором общая память сервера = Целевая память сервера = max server memory, в диспетчере памяти SQL Server есть политики, позволяющие временно дополнить запрос на несколько страниц в 8 КБ. Повторяющийся шаблон выделения в соответствии с таким условием могут привести к фрагментации блоков памяти и потреблению виртуального адресного пространства. Если этот процесс повторяется много повременных событий, виртуальное адресное пространство сервера SQL Server будет исчерпано, и вы увидите симптомы, упомянутые выше.
Решение
Сведения о накопительном пакете обновления
Эта проблема впервые устранена в следующем накопительном обновлении SQL Server.
Все новые накопительные обновления для SQL Server содержат все исправления и все исправления для системы безопасности, которые были включены в предыдущий накопительный пакет обновления. Мы рекомендуем вам загрузить и установить последние накопительные обновления для SQL Server.
Это исправление предотвращает недостаточное количество памяти и непрерывное сокращение доступного виртуального адресного пространства, которое может возникнуть.
Статус
Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе "Применяется к".
Дополнительная информация
-
Windows 2012 R2 позволяет виртуальному адресному пространству увеличиваться до размера 128 ТБ. Поэтому в средах 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
Обычно это резервные копии журналов и операции обслуживания индексов, которые происходят часто.