Проблемы с нехваткой памяти в SQL Server 2012 SP3

8

У меня периодически возникали ошибки 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, на котором я должен сосредоточиться?

user132852
источник
1
Есть ли другие службы / приложения, размещенные на этом сервере? Является ли учетная запись службы SQL Server частью политики безопасности локальных заблокированных страниц в памяти? Указывают ли в журналах событий Windows какие-либо другие проблемы во время сбоя SQL Server?
Джон Айсбренер
- Никакое другое приложение, размещенное на этом сервере, это выделенный сервер SQL. Учетная запись службы сервера -SQL является частью группы администраторов Windows. - Я просто вижу кучу ошибок VSS: Ошибка службы теневого копирования тома: Неожиданная ошибка запроса для интерфейса IVssWriterCallback. hr = 0x80070005, доступ запрещен. , Это часто вызвано неправильными настройками безопасности в процессе записи или в запросчике. Операция: сбор данных записывающего контекста: идентификатор класса записывающего устройства: {35e81631-13e1-48db-97fc-d5bc721bb18a} Имя записывающего устройства: NPS VSS Идентификатор записывающего устройства записывающего устройства: {...}
user132852
1
Является ли сервер виртуальной машиной? Если да, есть ли у него «выделенные» ресурсы памяти или он используется совместно с другими виртуальными машинами? И, если он разделяет память, является ли распределение ресурсов памяти чрезмерным? Я видел, как это происходит (независимо от версии) на серверах виртуальных машин, где память была перераспределена.
SQL_Hacker
3
Спасибо, Шанки. Просто для обновления, я обнаружил проблему в прошлую пятницу после добавления ее в мониторинг. Похоже, что один из сеансов мониторинга приложения в приложении (третье лицо) не был настроен должным образом, сеанс подключения не закрывается до нескольких часов спустя, когда OOM убивает это.
user132852
1
@ user132852, вы можете поместить свое решение в ответ и отметить его как ответное.
Томас Кронавиттер

Ответы:

2

Поскольку SQL Server работает в виртуальной машине, как указано (hypervisor)индикатором в заявлении о версии, вы должны убедиться, что у него есть резервирование памяти в VMWare (или Hyper-V и т. Д.) На хост-сервере.

Резервирование памяти обычно должно составлять 100% памяти, выделенной виртуальной машине для виртуальных машин SQL Server, которые используются в производственной среде. Без резервирования памяти хост-сервер может «украсть» память у виртуальной машины с помощью «всплывающего драйвера» для использования другой виртуальной машиной, что, вероятно, является причиной вашего состояния нехватки памяти.

В VMWare vCenter, чтобы настроить резервирование памяти на виртуальной машине:

  1. Выключите виртуальную машину перед настройкой параметров памяти.

  2. В клиенте vSphere щелкните правой кнопкой мыши виртуальную машину из инвентаря и выберите «Изменить параметры».

  3. В окне «Свойства виртуальной машины» перейдите на вкладку «Ресурсы» и выберите «Память».

  4. На панели «Распределение ресурсов» установите флажок «Зарезервировать всю гостевую память (все заблокировано)».

  5. Нажмите ОК.

Если вы используете Microsoft Hyper-V, отключите динамическую память для виртуальной машины, используя этот процесс в диспетчере Hyper-V:

  1. Убедитесь, что виртуальная машина выключена.
  2. Щелкните правой кнопкой мыши виртуальную машину, выберите «Настройки»
  3. Выберите «Память» в левой панели.
  4. Убедитесь, что «Включить динамическую память» не отмечен.
  5. Запустите ВМ.
Макс Вернон
источник
1

Пару изменений конфигурации я бы сделал:

  1. Удалите минимальные настройки памяти, буквально в этом нет необходимости .
    • Причина, по которой вы хотите изменить это, заключается в том, что, если это установлено, SQL Server никогда не освободит память ниже отметки. Если страницы заблокированы в памяти, память больше не может быть выгружена.
  2. Отрегулируйте максимальный объем памяти сервера до 75% от общего объема для общего объема <32 ГБ или 87,5% для общего объема> 32 ГБ.
    • Предполагая, что SQL Server - это единственное, что работает на компьютере, пусть он потребляет всю оставшуюся память после предоставления ОС достаточного объема памяти для нормальной работы.

Вы можете использовать следующий скрипт для этого:

use master;
go

-- MIN Server Memory
exec sys.sp_configure
    'min server memory (MB)'
    ,0;

-- MAX Server Memory
declare
  @systemMemory int
  ,@maxServerMemory int;

select
  @systemMemory = total_physical_memory_kb / 1024
from
  sys.dm_os_sys_memory;

set @maxServerMemory = floor(@systemMemory * .75);

if @systemMemory >= 32768
  begin
    set @maxServerMemory = floor(@systemMemory * .875);
  end;

exec sys.sp_configure
  'max server memory (MB)'
  ,@maxServerMemory;

reconfigure;
go
pimbrouwers
источник
3
Я знаю, что это довольно стандартные передовые практики, но не могли бы вы немного объяснить, как их изменение поможет с ошибкой, которую они совершают?
Эрик Дарлинг