Устранение проблем нехватки памяти

Применимо к:SQL Server

В памяти OLTP использует больше памяти и в разных способах, чем SQL Server. Возможно, объем установленной и выделенной памяти для OLTP в памяти становится неадекватным для растущих потребностей. В таком случае может возникнуть нехватка памяти. В этом разделе описывается восстановление из ситуации с нехваткой памяти. В статье Наблюдение и устранение неисправностей при использовании памяти вы найдете рекомендации, которые помогут вам избежать многих ситуаций нехватки памяти.

Темы данного раздела

Раздел Обзор
устранить ошибки восстановления базы данных, возникающие из-за нехватки памяти Что делать, если появится сообщение об ошибке "Операция восстановления не удалось выполнить для базы данных databaseName>" из-за нехватки памяти в пуле ресурсов resourcePoolName><".<
устранить влияния нехватки свободной памяти на рабочую нагрузку Что следует предпринять, если обнаружится, что недостаток памяти отрицательно влияет на производительность.
Устранение ошибок выделения страниц, возникших из-за нехватки памяти при наличии достаточных ресурсов памяти Что делать, если появится сообщение об ошибке " Запрет выделения страниц для базы данных database "databaseName>" из-за нехватки памяти в пуле ресурсов resourcePoolName><.< если объема доступной памяти достаточно для выполнения операции.
Рекомендации по использованию выполняющейся в памяти OLTP в среде виртуальных машин Что следует помнить при использовании выполняющейся в памяти OLTP в виртуализированной среде.

устранить ошибки восстановления базы данных, возникающие из-за нехватки памяти

При попытке восстановить базу данных может появиться сообщение об ошибке : "Операция восстановления завершилась ошибкой для базы данных databaseName>" из-за нехватки памяти в пуле ресурсов resourcePoolName><".< Это означает, что у сервера недостаточно доступной памяти для восстановления базы данных.

Сервер, на который восстанавливается база данных, должен иметь достаточно памяти для оптимизированных для памяти таблиц в резервной копии базы данных, в противном случае база данных не подключится к сети и будет помечена как подозрительная.

Если сервер имеет достаточный объем физической памяти, но по-прежнему возникает данная ошибка, возможно, что другие процессы используют слишком много памяти или операция восстановления не получает достаточный объем памяти из-за проблем с конфигурацией. При подобных проблемах воспользуйтесь следующими мерами, чтобы предоставить операции восстановления дополнительную память.

  • Временно закройте выполняющиеся приложения.
    Закрыв одно или несколько выполняющихся приложений или остановив ненужные на данный момент службы, можно освободить используемую ими память для операции восстановления. Эти приложения можно будет перезапустить после успешного завершения восстановления.

  • Увеличьте значение MAX_MEMORY_PERCENT.
    Если база данных, как и рекомендуется, привязана к пулу ресурсов, то память, доступная для операции восстановления, регулируется параметром MAX_MEMORY_PERCENT. Если значение слишком мало, восстановление завершится со сбоем. В этом фрагменте кода значение параметра MAX_MEMORY_PERCENT для пула ресурсов PoolHk увеличивается до 70 % от установленной памяти.

    Внимание

    Если сервер выполняется на ВМ и не выделен, установите такое же значение MIN_MEMORY_PERCENT, как и MAX_MEMORY_PERCENT.
    Дополнительные сведения см. в статье Рекомендации по использованию выполняющейся в памяти OLTP в среде виртуальных машин.

    -- disable resource governor  
    ALTER RESOURCE GOVERNOR DISABLE  
    
    -- change the value of MAX_MEMORY_PERCENT  
    ALTER RESOURCE POOL PoolHk  
    WITH  
         ( MAX_MEMORY_PERCENT = 70 )  
    GO  
    
    -- reconfigure the Resource Governor  
    --    RECONFIGURE enables resource governor  
    ALTER RESOURCE GOVERNOR RECONFIGURE  
    GO  
    
    

    Дополнительные сведения о максимальных значениях параметра MAX_MEMORY_PERCENT см в разделе Процент памяти, доступной для оптимизированных для памяти таблиц и индексов.

  • Увеличьте значение max server memory.
    Дополнительные сведения о настройке параметра Макс. памяти сервера см. в разделе Параметры конфигурации сервера "Память сервера".

устранить влияния нехватки свободной памяти на рабочую нагрузку

Очевидно, проще всего вообще избегать ситуаций, связанных с нехваткой памяти. Помочь в этом может хорошее планирование и отслеживание. Однако даже самое хорошее планирование не гарантирует стабильной работы, и возникновение нехватки памяти всегда возможно. Для устранения этой ситуации необходимо выполнить два действия.

  1. Откройте выделенное административное соединение

  2. Примените действие по исправлению

Откройте выделенное административное соединение

SQL Server предоставляет выделенное административное соединение. С помощью выделенного административного соединения администратор может обращаться к запущенному экземпляру ядра СУБД SQL Server для устранения неполадок на сервере, даже если сервер не отвечает на другие клиентские соединения. DAC доступен через служебную sqlcmd программу и СРЕДУ SQL Server Management Studio.

Рекомендации по использованию DAC в SSMS или sqlcmd см. в разделе Диагностическое подключение для администраторов баз данных.

Примените действие по исправлению

Для устранения проблемы с нехваткой памяти необходимо либо освободить имеющуюся память путем сокращения объема ее использования, либо выделить дополнительный объем памяти таблицам в памяти.

Освобождение имеющейся памяти

Удаление неважных строк оптимизированных для памяти таблиц и ожидание выполнения сборки мусора

Можно удалить неважные строки из оптимизированной для памяти таблицы. Сборщик мусора делает объем памяти, используемый этими строками, доступным. Компонент In-memory OLTP выполняет сбор ненужных строк агрессивно. Однако долго выполняющаяся транзакция может помешать сбору мусора. Например, если имеется транзакция, которая выполняется в течение 5 минут, все версии строк, созданные из-за операций обновления или удаления во время выполнения транзакции, не подпадают под сборку мусора.

Переместить одну или несколько строк в таблице на диске

В следующих статьях TechNet представлены рекомендации по перемещению строк из таблиц, оптимизированных для памяти, в таблицы на диске.

Увеличение объема доступной памяти

Увеличение значения MAX_MEMORY_PERCENT для пула ресурсов

Если вы не создали именованный пул ресурсов для таблиц в памяти, необходимо выполнить это и привязать к ней базы данных OLTP в памяти. Дополнительные сведения о создании и привязке баз данных OLTP к пулу ресурсов см. в разделе "Привязка базы данных с оптимизированными для памяти таблицами " к пулу ресурсов.

Если база данных OLTP в памяти привязана к пулу ресурсов, вы можете увеличить процент памяти, к которым может получить доступ пул. Инструкции по изменению значения MIN_MEMORY_PERCENT и MAX_MEMORY_PERCENT для пула ресурсов см. в подразделе Изменение параметров MIN_MEMORY_PERCENT и MAX_MEMORY_PERCENT для существующего пула .

Увеличьте значение MAX_MEMORY_PERCENT.
В этом фрагменте кода значение параметра MAX_MEMORY_PERCENT для пула ресурсов PoolHk увеличивается до 70 % от установленной памяти.

Внимание

Если сервер выполняется на ВМ и не выделен, установите такое же значение MIN_MEMORY_PERCENT, как и MAX_MEMORY_PERCENT.
Дополнительные сведения см. в статье Рекомендации по использованию выполняющейся в памяти OLTP в среде виртуальных машин.

-- disable resource governor  
ALTER RESOURCE GOVERNOR DISABLE  
  
-- change the value of MAX_MEMORY_PERCENT  
ALTER RESOURCE POOL PoolHk  
WITH  
     ( MAX_MEMORY_PERCENT = 70 )  
GO  
  
-- reconfigure the Resource Governor to enabled it
ALTER RESOURCE GOVERNOR RECONFIGURE  
GO  

Дополнительные сведения о максимальных значениях параметра MAX_MEMORY_PERCENT см в разделе Процент памяти, доступной для оптимизированных для памяти таблиц и индексов.

Установка дополнительной памяти

В конечном счете наилучшим решением является установка дополнительной памяти. Если это сделать, помните, что вы, вероятно, сможете также увеличить значение MAX_MEMORY_PERCENT (см. раздел "Изменение" MIN_MEMORY_PERCENT и MAX_MEMORY_PERCENT в существующем пуле), так как SQL Server, скорее всего, не потребует больше памяти, что позволит вам сделать большую часть только что установленной памяти доступной для пула ресурсов.

Внимание

Если сервер выполняется на ВМ и не выделен, установите такое же значение MIN_MEMORY_PERCENT, как и MAX_MEMORY_PERCENT.
Дополнительные сведения см. в статье Рекомендации по использованию выполняющейся в памяти OLTP в среде виртуальных машин.

Устранение ошибок выделения страниц, возникших из-за нехватки памяти при наличии достаточных ресурсов памяти

Если в журнале ошибок появилось сообщение об ошибке Disallowing page allocations for database '*\<databaseName>*' due to insufficient memory in the resource pool '*\<resourcePoolName>*'. See 'https://go.microsoft.com/fwlink/?LinkId=330673' for more information., но доступной физической памяти достаточно для выделения страницы, это может быть связано с отключенным Resource Governor. Если регулятор ресурсов отключен, то MEMORYBROKER_FOR_RESERVE вызывает искусственную нагрузку на ресурсы памяти.

Для устранения этой ошибки необходимо включить регулятор ресурсов.

См. в разделе Включение регулятора ресурсов дополнительные сведения об ограничениях, а также рекомендации по включению регулятора ресурсов через обозреватель объектов, свойства регулятора ресурсов или Transact-SQL.

Рекомендации по использованию выполняющейся в памяти OLTP в среде виртуальных машин

Виртуализация серверов позволяет не только снизить расходы на приобретение и эксплуатацию, но и добиться большей эффективности ИТ-процессов благодаря оптимизации подготовки, обслуживания, доступности и операций резервного копирования или восстановления приложений. В результате недавних успехов в развитии технологий стало проще консолидировать сложные рабочие нагрузки базы данных с применением виртуализации. В этой статье приведены рекомендации по использованию выполняющейся в памяти OLTP для SQL Server в виртуализированной среде.

Предварительное выделение памяти

В виртуальной среде важными факторами для памяти являются более высокая производительность и расширенная поддержка. Необходимо иметь возможность как быстро выделять память виртуальным машинам в зависимости от их требований (пиковые и низкие нагрузки), так и исключить бесполезные траты памяти. Компонент Hyper-V Dynamic Memory делает выделение памяти между виртуальными машинами, выполняемыми на узле, и управление ею более гибким.

Некоторые рекомендации по виртуализации и управлению SQL Server необходимо скорректировать при виртуализации базы данных с таблицами, оптимизированными для памяти. При отсутствии оптимизированных для памяти таблиц есть две рекомендации.

  • При использовании параметра "Мин. памяти сервера" рекомендуется назначать только необходимое количество памяти, чтобы осталось достаточно памяти для других процессов (во избежание вытеснения).
  • Не назначайте слишком высокого значения предварительного выделения памяти. В противном случае другие процессы могут не получить достаточной памяти к тому времени, когда она им потребуется, а это приведет к подкачке памяти.

Если следовать указанным выше рекомендациям, когда в базе данных есть оптимизированные для памяти таблицы, может выясниться, что попытка восстановить базу данных приводит к остановке базы данных в состоянии "Ожидание восстановления", даже если доступно достаточно памяти для восстановления базы данных. Причина в том, что при запуске выполняющаяся в памяти OLTP передает данные в память активнее, чем механизм выделения динамической памяти выделяет память базе данных.

Решение

Чтобы смягчить этот эффект, заранее выделите достаточную память, чтобы восстановить или перезапустить базу данных, а не минимальное значение, в расчете на то, что динамическая память выделит дополнительную память при необходимости.

См. также

Управление памятью для компонента In-Memory OLTP
Наблюдение и устранение неисправностей при использовании памяти
Привязка базы данных с таблицами, оптимизированными для памяти, к пулу ресурсов
Руководство по архитектуре управления памятью
Параметры конфигурации сервера «Server Memory»