Устранение проблем нехватки памятиResolve Out Of Memory issues

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions)

SQL Server In-Memory OLTPSQL Server In-Memory OLTP использует больше памяти, чем SQL ServerSQL Server, и делает это по-другому.uses more memory and in different ways than does SQL ServerSQL Server. Возможно, что объем памяти, установленный и выделенный для Выполняющаяся в памяти OLTPIn-Memory OLTP , станет недостаточным для растущих потребностей.It is possible that the amount of memory you installed and allocated for Выполняющаяся в памяти OLTPIn-Memory OLTP becomes inadequate for your growing needs. В таком случае может возникнуть нехватка памяти.If so, you could run out of memory. В этом разделе описывается восстановление из ситуации с нехваткой памяти.This topic covers how to recover from an OOM situation. В статье Наблюдение и устранение неисправностей при использовании памяти вы найдете рекомендации, которые помогут вам избежать многих ситуаций нехватки памяти.See Monitor and Troubleshoot Memory Usage for guidance that can help you avoid many OOM situations.

Темы данного разделаCovered in this topic

РазделTopic ОбзорOverview
устранить ошибки восстановления базы данных, возникающие из-за нехватки памятиResolve database restore failures due to OOM Что делать при получении сообщения об ошибке "Операция восстановления базы данных ’ <databaseName> ’ завершилась сбоем из-за нехватки памяти в пуле ресурсов ’ <resourcePoolName> ’."What to do if you get the error message, "Restore operation failed for database '<databaseName>' due to insufficient memory in the resource pool '<resourcePoolName>'."
устранить влияния нехватки свободной памяти на рабочую нагрузкуResolve impact of low memory or OOM conditions on the workload Что следует предпринять, если обнаружится, что недостаток памяти отрицательно влияет на производительность.What to do if you find low memory issues are negatively impacting performance.
Устранение ошибок выделения страниц, возникших из-за нехватки памяти при наличии достаточных ресурсов памятиResolve page allocation failures due to insufficient memory when sufficient memory is available Что делать, если выдается сообщение об ошибке "Запрет распределения страниц для базы данных ’ <databaseName> ’ из-за нехватки памяти в пуле ресурсов ’ <resourcePoolName> ’."What to do if you get the error message, "Disallowing page allocations for database '<databaseName>' due to insufficient memory in the resource pool '<resourcePoolName>'. если объема доступной памяти достаточно для выполнения операции...." when available memory is sufficient for the operation.
Рекомендации по использованию выполняющейся в памяти OLTP в среде виртуальных машинBest Practices using In-Memory OLTP in a VM environment Что следует помнить при использовании выполняющейся в памяти OLTP в виртуализированной среде.What to keep in mind when using In-Memory OLTP in a virtualized environment.

устранить ошибки восстановления базы данных, возникающие из-за нехватки памятиResolve database restore failures due to OOM

При попытке восстановления базы данных можно получить следующее сообщение об ошибке: "Сбой операции восстановления для базы данных ’ <databaseName> ’ из-за нехватки памяти в пуле ресурсов ’ <resourcePoolName> ’." Это означает, что у сервера недостаточно памяти для восстановления базы данных.When you attempt to restore a database you may get the error message: "Restore operation failed for database '<databaseName>' due to insufficient memory in the resource pool '<resourcePoolName>'." This indicates that the server does not have enough available memory for restoring the database.

Сервер, на который восстанавливается база данных, должен иметь достаточно памяти для оптимизированных для памяти таблиц в резервной копии базы данных, в противном случае база данных не подключится к сети и будет помечена как подозрительная.The server you restore a database to must have enough available memory for the memory-optimized tables in the database backup, otherwise the database will not come online, and will be marked as suspect.

Если сервер имеет достаточный объем физической памяти, но по-прежнему возникает данная ошибка, возможно, что другие процессы используют слишком много памяти или операция восстановления не получает достаточный объем памяти из-за проблем с конфигурацией.If the server does have enough physical memory, but you are still seeing this error, it could be that other processes are using too much memory or a configuration issue causes not enough memory to be available for restore. При подобных проблемах воспользуйтесь следующими мерами, чтобы предоставить операции восстановления дополнительную память.For this class of issues, use the following measures to make more memory available to the restore operation:

  • Временно закройте выполняющиеся приложения.Temporarily close running applications.
    Закрыв одно или несколько выполняющихся приложений или остановив ненужные на данный момент службы, можно освободить используемую ими память для операции восстановления.By closing one or more running applications or stopping services not needed at the moment, you make the memory they were using available for the restore operation. Эти приложения можно будет перезапустить после успешного завершения восстановления.You can restart them following the successful restore.

  • Увеличьте значение MAX_MEMORY_PERCENT.Increase the value of MAX_MEMORY_PERCENT.
    Если база данных, как и рекомендуется, привязана к пулу ресурсов, то память, доступная для операции восстановления, регулируется параметром MAX_MEMORY_PERCENT.If the database is bound to a resource pool, which is best practice, the memory available to restore is governed by MAX_MEMORY_PERCENT. Если значение слишком мало, восстановление завершится со сбоем.If the value is too low, restore will fail. В этом фрагменте кода значение параметра MAX_MEMORY_PERCENT для пула ресурсов PoolHk увеличивается до 70 % от установленной памяти.This code snippet changes MAX_MEMORY_PERCENT for the resource pool PoolHk to 70% of installed memory.

    Важно!

    Если сервер выполняется на ВМ и не выделен, установите такое же значение MIN_MEMORY_PERCENT, как и MAX_MEMORY_PERCENT.If the server is running on a VM and is not dedicated, set the value of MIN_MEMORY_PERCENT to the same value as MAX_MEMORY_PERCENT.
    Дополнительные сведения см. в статье Рекомендации по использованию выполняющейся в памяти OLTP в среде виртуальных машин.See the topic Best Practices using In-Memory OLTP in a VM environment for more information.

    -- 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 см в разделе Процент памяти, доступной для оптимизированных для памяти таблиц и индексов.For information on maximum values for MAX_MEMORY_PERCENT see the topic section Percent of memory available for memory-optimized tables and indexes.

  • Увеличьте значение max server memory.Increase max server memory.
    Дополнительные сведения о настройке параметра Макс. памяти сервера см. в разделе Параметры конфигурации сервера "Память сервера".For information on configuring max server memory see the topic Server Memory Server Configuration Options.

устранить влияния нехватки свободной памяти на рабочую нагрузкуResolve impact of low memory or OOM conditions on the workload

Очевидно, проще всего вообще избегать ситуаций, связанных с нехваткой памяти.Obviously, it is best to not get into a low memory or OOM (Out of Memory) situation. Помочь в этом может хорошее планирование и отслеживание.Good planning and monitoring can help avoid OOM situations. Однако даже самое хорошее планирование не гарантирует стабильной работы, и возникновение нехватки памяти всегда возможно.Still, the best planning does not always foresee what actually happens and you might end up with low memory or OOM. Для устранения этой ситуации необходимо выполнить два действия.There are two steps to recovering from OOM:

  1. Откройте выделенное административное соединениеOpen a DAC (Dedicated Administrator Connection)

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

Откройте выделенное административное соединениеOpen a DAC (Dedicated Administrator Connection)

SQL ServerSQL Server предоставляет выделенное административное соединение (DAC).provides a dedicated administrator connection (DAC). С помощью выделенного административного соединения администратор может обращаться к запущенному экземпляру ядра СУБД SQL Server для устранения неполадок на сервере, даже если сервер не отвечает на другие клиентские соединения.The DAC allows an administrator to access a running instance of SQL Server Database Engine to troubleshoot problems on the server-even when the server is unresponsive to other client connections. DAC доступны в программе sqlcmd и в среде SQL Server Management StudioSQL Server Management Studio.The DAC is available through the sqlcmd utility and SQL Server Management StudioSQL Server Management Studio.

Рекомендации по использованию DAC в SSMS или sqlcmd см. в разделе Диагностическое подключение для администраторов баз данных.For guidance on using DAC through SSMS or sqlcmd, refer to Diagnostic Connection for Database Administrators.

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

Для устранения проблемы с нехваткой памяти необходимо либо освободить имеющуюся память путем сокращения объема ее использования, либо выделить дополнительный объем памяти таблицам в памяти.To resolve your OOM condition you need to either free up existing memory by reducing usage, or make more memory available to your in-memory tables.

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

Удаление неважных строк оптимизированных для памяти таблиц и ожидание выполнения сборки мусораDelete non-essential memory optimized table rows and wait for garbage collection

Можно удалить неважные строки из оптимизированной для памяти таблицы.You can remove non-essential rows from a memory optimized table. Сборщик мусора делает объем памяти, используемый этими строками, доступным.The garbage collector returns the memory used by these rows to available memory. Компонент In-memory OLTP выполняет сбор ненужных строк агрессивно.In-memory OLTP engine collects garbage rows aggressively. Однако долго выполняющаяся транзакция может помешать сбору мусора.However, a long running transaction can prevent garbage collection. Например, если имеется транзакция, которая выполняется в течение 5 минут, все версии строк, созданные из-за операций обновления или удаления во время выполнения транзакции, не подпадают под сборку мусора.For example, if you have a transaction that runs for 5 minutes, any row versions created due to update/delete operations while the transaction was active can't be garbage collected.

Переместить одну или несколько строк в таблице на дискеMove one or more rows to a disk-based table

В следующих статьях TechNet представлены рекомендации по перемещению строк из таблиц, оптимизированных для памяти, в таблицы на диске.The following TechNet articles provide guidance on moving rows from a memory-optimized table to a disk-based table.

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

Увеличение значения MAX_MEMORY_PERCENT для пула ресурсовIncrease value of MAX_MEMORY_PERCENT on the resource pool

Если именованный пул ресурсов для таблиц в памяти еще не создан, то его необходимо создать и привязать к нему базы данных Выполняющаяся в памяти OLTPIn-Memory OLTP .If you have not created a named resource pool for your in-memory tables you should do that and bind your Выполняющаяся в памяти OLTPIn-Memory OLTP databases to it. Инструкции по созданию пула ресурсов и привязки к нему баз данных см. в разделе Привязка базы данных с таблицами, оптимизированными для памяти, к пулу ресурсов Выполняющаяся в памяти OLTPIn-Memory OLTP .See the topic Bind a Database with Memory-Optimized Tables to a Resource Pool for guidance on creating and binding your Выполняющаяся в памяти OLTPIn-Memory OLTP databases to a resource pool.

Если база данных Выполняющаяся в памяти OLTPIn-Memory OLTP привязана к пулу ресурсов, то пользователь может увеличить процент памяти, доступной для пула.If your Выполняющаяся в памяти OLTPIn-Memory OLTP database is bound to a resource pool you may be able to increase the percent of memory the pool can access. Инструкции по изменению значения MIN_MEMORY_PERCENT и MAX_MEMORY_PERCENT для пула ресурсов см. в подразделе Изменение параметров MIN_MEMORY_PERCENT и MAX_MEMORY_PERCENT для существующего пула .See the sub-topic Change MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT on an existing pool for guidance on changing the value of MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT for a resource pool.

Увеличьте значение MAX_MEMORY_PERCENT.Increase the value of MAX_MEMORY_PERCENT.
В этом фрагменте кода значение параметра MAX_MEMORY_PERCENT для пула ресурсов PoolHk увеличивается до 70 % от установленной памяти.This code snippet changes MAX_MEMORY_PERCENT for the resource pool PoolHk to 70% of installed memory.

Важно!

Если сервер выполняется на ВМ и не выделен, установите такое же значение MIN_MEMORY_PERCENT, как и MAX_MEMORY_PERCENT.If the server is running on a VM and is not dedicated, set the value of MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT to the same value.
Дополнительные сведения см. в статье Рекомендации по использованию выполняющейся в памяти OLTP в среде виртуальных машин.See the topic Best Practices using In-Memory OLTP in a VM environment for more information.

-- 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 см в разделе Процент памяти, доступной для оптимизированных для памяти таблиц и индексов.For information on maximum values for MAX_MEMORY_PERCENT see the topic section Percent of memory available for memory-optimized tables and indexes.

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

В конечном счете наилучшим решением является установка дополнительной памяти.Ultimately the best solution, if possible, is to install additional physical memory. Если выбран этот вариант, то необходимо учитывать, что, скорее всего, также можно будет увеличить значение MAX_MEMORY_PERCENT (см. подраздел Изменение параметров MIN_MEMORY_PERCENT и MAX_MEMORY_PERCENT для существующего пула), так как SQL ServerSQL Server вряд ли будет нужно больше памяти, а это позволит выделить большую часть или даже всю установленную новую память пулу ресурсов.If you do this, remember that you will probably be able to also increase the value of MAX_MEMORY_PERCENT (see the sub-topic Change MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT on an existing pool) since SQL ServerSQL Server won't likely need more memory, allowing you to make most if not all of the newly installed memory available to the resource pool.

Важно!

Если сервер выполняется на ВМ и не выделен, установите такое же значение MIN_MEMORY_PERCENT, как и MAX_MEMORY_PERCENT.If the server is running on a VM and is not dedicated, set the value of MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT to the same value.
Дополнительные сведения см. в статье Рекомендации по использованию выполняющейся в памяти OLTP в среде виртуальных машин.See the topic Best Practices using In-Memory OLTP in a VM environment for more information.

Устранение ошибок выделения страниц, возникших из-за нехватки памяти при наличии достаточных ресурсов памятиResolve page allocation failures due to insufficient memory when sufficient memory is available

Если в журнале ошибок появилось сообщение об ошибке 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.If you get the error message, 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. in the error log when the available physical memory is sufficient to allocate the page, it may be due to a disabled Resource Governor. Если регулятор ресурсов отключен, то MEMORYBROKER_FOR_RESERVE вызывает искусственную нагрузку на ресурсы памяти.When the Resource Governor is disabled MEMORYBROKER_FOR_RESERVE induces artificial memory pressure.

Для устранения этой ошибки необходимо включить регулятор ресурсов.To resolve this you need to enable the Resource Governor.

См. в разделе Включение регулятора ресурсов дополнительные сведения об ограничениях, а также рекомендации по включению регулятора ресурсов через обозреватель объектов, свойства регулятора ресурсов или Transact-SQL.See Enable Resource Governor for information on Limits and Restrictions as well as guidance on enabling Resource Governor using Object Explorer, Resource Governor properties, or Transact-SQL.

Рекомендации по использованию выполняющейся в памяти OLTP в среде виртуальных машинBest Practices using In-Memory OLTP in a VM environment

Виртуализация серверов позволяет не только снизить расходы на приобретение и эксплуатацию, но и добиться большей эффективности ИТ-процессов благодаря оптимизации подготовки, обслуживания, доступности и операций резервного копирования или восстановления приложений.Server virtualization can help you lower IT capital and operational costs and attain greater IT efficiency with improved application provisioning, maintenance, availability, and backup/recovery processes. В результате недавних успехов в развитии технологий стало проще консолидировать сложные рабочие нагрузки базы данных с применением виртуализации.With recent technological advances, complex database workloads can be more readily consolidated using virtualization. В этой статье приведены рекомендации по использованию выполняющейся в памяти OLTP для SQL Server в виртуализированной среде.This topic covers best practices for using SQL Server In-Memory OLTP in a virtualized environment.

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

В виртуальной среде важными факторами для памяти являются более высокая производительность и расширенная поддержка.For memory in a virtualized environment, better performance and enhanced support are essential considerations. Необходимо иметь возможность как быстро выделять память виртуальным машинам в зависимости от их требований (пиковые и низкие нагрузки), так и исключить бесполезные траты памяти.You must be able to both quickly allocate memory to virtual machines depending on their requirements (peak and off-peak loads) and ensure that the memory is not wasted. Компонент Hyper-V Dynamic Memory делает выделение памяти между виртуальными машинами, выполняемыми на узле, и управление ею более гибким.The Hyper-V Dynamic Memory feature increases agility in how the memory is allocated and managed between virtual machines running on a host.

Некоторые рекомендации по виртуализации и управлению SQL Server необходимо скорректировать при виртуализации базы данных с таблицами, оптимизированными для памяти.Some best practices for virtualizing and managing SQL Server need to be modified when virtualizing a database with memory-optimized tables. При отсутствии оптимизированных для памяти таблиц есть две рекомендации.Without memory-optimized tables, two of the best practices are:

  • При использовании параметра "Мин. памяти сервера" рекомендуется назначать только необходимое количество памяти, чтобы осталось достаточно памяти для других процессов (во избежание вытеснения).If you use min server memory, it is better to assign only the amount of memory that is required so sufficient memory remains for other processes (thereby avoiding paging).
  • Не назначайте слишком высокого значения предварительного выделения памяти.Do not set the memory pre-allocation value too high. В противном случае другие процессы могут не получить достаточной памяти к тому времени, когда она им потребуется, а это приведет к подкачке памяти.Otherwise, other processes may not get sufficient memory at the time when they require it, and this can result in memory paging.

Если следовать указанным выше рекомендациям, когда в базе данных есть оптимизированные для памяти таблицы, может выясниться, что попытка восстановить базу данных приводит к остановке базы данных в состоянии "Ожидание восстановления", даже если доступно достаточно памяти для восстановления базы данных.If you follow the above practices for a database with memory-optimized tables, an attempt to restore and recover a database could result in the database being in a "Recovery Pending" state, even if you have sufficient memory to recover the database. Причина в том, что при запуске выполняющаяся в памяти OLTP передает данные в память активнее, чем механизм выделения динамической памяти выделяет память базе данных.The reason for this is that, when starting up, In-Memory OLTP brings data into memory more aggressively than dynamic memory allocation allocates memory to the database.

РешениеResolution

Чтобы смягчить этот эффект, заранее выделите достаточную память, чтобы восстановить или перезапустить базу данных, а не минимальное значение, в расчете на то, что динамическая память выделит дополнительную память при необходимости.To mitigate this, pre-allocate sufficient memory to the database to recover or restart the database, not a minimum value relying on dynamic memory to provide the additional memory when needed.

См. также:See Also

Управление памятью для компонента In-Memory OLTP Managing Memory for In-Memory OLTP
Наблюдение и устранение неисправностей при использовании памяти Monitor and Troubleshoot Memory Usage
Привязка базы данных с таблицами, оптимизированными для памяти, к пулу ресурсов Bind a Database with Memory-Optimized Tables to a Resource Pool
Руководство по архитектуре управления памятьюMemory Management Architecture guide
Параметры конфигурации сервера «Server Memory»Server Memory Server Configuration Options