У меня периодически возникали ошибки OOM в SQL Server, один раз до того, что SQL Server сам закрывался и всегда происходил в ночное время, когда его никто не использовал, и в это время не выполнялось задание агента SQL:
Вот типичная ошибка:
17.08.2017 19: 31: 17, spid100, Unknown, Недостаточно системной памяти в «внутреннем» пуле ресурсов для выполнения этого запроса.
17.08.2017 19: 31: 17, spid100, Неизвестно, Ошибка: 701 Серьезность: 17 Состояние: 123.
17.08.2017 19: 31: 17, spid112, Неизвестно, Ошибка: 18056 Уровень серьезности: 20 Состояние: 29. (Параметры :). Ошибка печатается в кратком режиме, потому что во время форматирования произошла ошибка. Трассировка уведомлений ETW и т. Д. Пропускаются.
Вот информация о сервере:
- 10 ГБ MIN памяти SQL сервера
- 21 ГБ МАКС. Память сервера SQL
- только 4 БД на сервере
- их размеры составляют всего от 1 до 2 ГБ каждый
- Размер базы данных Tempdb никогда не увеличивался до более чем 1 ГБ (установлено автоматическое увеличение до 10 ГБ)
- Все индексы слабо фрагментированы, статистика обновлена
Версия:
Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) Oct 20 2015 15:36:27 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
Я проверил несколько пунктов:
- DBCC memorystatus
Быстрая статистика:
SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB] FROM sys.dm_os_process_memory; GO Output: 20 GB Page Life Expectancy 155932
Регулятор ресурсов не включен:
select pool_id, cache_memory_kb, used_memory_kb, out_of_memory_count,used_memgrant_kb from sys.dm_resource_governor_resource_pools Output: pool_id | cache_memory_kb | used_memory_kb | out_of_memory_count | used_memgrant_kb --------+-----------------+----------------+---------------------+----------------- 1 | 295368 | 641416 | 0 | 0 select (physical_memory_in_use_kb/1024) Memory_usedby_Sqlserver_MB, (locked_page_allocations_kb/1024) Locked_pages_used_Sqlserver_MB, (total_virtual_address_space_kb/1024 )Total_VAS_in_MB, process_physical_memory_low, process_virtual_memory_low from sys. dm_os_process_memory Output: Memory_usedby_Sqlserver_MB | Locked_pages_used_Sqlserver_MB | Total_VAS_in_MB | process_physical_memory_low | process_virtual_memory_low ---------------------------------------------------------------------------------------------------------------------------------------- 20553 | 20393 | 134217727 | 0 | 0
Сервер установлен на SP3, я знаю, что в SP1 была проблема утечки памяти, поэтому исключаю ее.
Кто-нибудь заметил что-нибудь в результате DBCC, на котором я должен сосредоточиться?
источник
Ответы:
Поскольку SQL Server работает в виртуальной машине, как указано
(hypervisor)
индикатором в заявлении о версии, вы должны убедиться, что у него есть резервирование памяти в VMWare (или Hyper-V и т. Д.) На хост-сервере.Резервирование памяти обычно должно составлять 100% памяти, выделенной виртуальной машине для виртуальных машин SQL Server, которые используются в производственной среде. Без резервирования памяти хост-сервер может «украсть» память у виртуальной машины с помощью «всплывающего драйвера» для использования другой виртуальной машиной, что, вероятно, является причиной вашего состояния нехватки памяти.
В VMWare vCenter, чтобы настроить резервирование памяти на виртуальной машине:
Выключите виртуальную машину перед настройкой параметров памяти.
В клиенте vSphere щелкните правой кнопкой мыши виртуальную машину из инвентаря и выберите «Изменить параметры».
В окне «Свойства виртуальной машины» перейдите на вкладку «Ресурсы» и выберите «Память».
На панели «Распределение ресурсов» установите флажок «Зарезервировать всю гостевую память (все заблокировано)».
Нажмите ОК.
Если вы используете Microsoft Hyper-V, отключите динамическую память для виртуальной машины, используя этот процесс в диспетчере Hyper-V:
источник
Пару изменений конфигурации я бы сделал:
Вы можете использовать следующий скрипт для этого:
источник