Параметры конфигурации памяти сервера

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

Использование памяти для ядра СУБД SQL Server ограничивается парой параметров конфигурации, min server memory (MB) (минимальный объем памяти сервера в МБ) и max server memory (MB) (максимальный объем памяти сервера в МБ). Со временем и в обычных обстоятельствах SQL Server попытается запросить память до предела, установленного параметром max server memory (MB).

Заметка

Индексы columnstore и объекты выполняющейся в памяти OLTP имеют собственные клерки памяти, что упрощает мониторинг использования буферного пула. Дополнительные сведения см. в статье sys.dm_os_memory_clerks.

В более ранних версиях SQL Server использование памяти практически не было ограничено, указывая для SQL Server, что вся системная память доступна для использования. Рекомендуется настроить верхний предел использования памяти SQL Server во всех версиях SQL Server, настроив максимальный объем памяти сервера (МБ).

  • Начиная с SQL Server 2019 (15.x) программа установки SQL на серверах Windows предоставляет рекомендации по значению max server memory (MB) для автономного экземпляра SQL Server на основе процента доступной системной памяти во время установки.
  • В любое время можно перенастроить ограничения памяти (в мегабайтах) для процесса SQL Server, используемого экземпляром SQL Server, с помощью параметров конфигурации min server memory (MB) и max server memory (MB).

Заметка

Это руководство относится к экземпляру SQL Server в Windows. Сведения о конфигурации памяти в Linux см. в разделах Рекомендации по повышению производительности и конфигурации для SQL Server в Linux и Параметр memory.memorylimitmb.

Рекомендации

Параметры по умолчанию и минимальное допустимое значение для этих параметров

Вариант По умолчанию. Допустимый минимум Рекомендуемая конфигурация
min server memory (MB) 0 0 0
max server memory (MB) 2 147 483 647 мегабайт (МБ) 128 МБ 75 % доступной системной памяти, не потребляемой другими процессами, включая другие экземпляры. Более подробные рекомендации см. в разделе о максимальном объеме памяти сервера.

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

  • Если вы зададите слишком высокое значение max server memory (MB), одному экземпляру SQL Server, возможно, придется конкурировать за память с другими экземплярами SQL Server, размещенными на том же узле.
  • Однако если установить слишком маленькое значение max server memory (MB), это не позволит увеличить производительность и может привести к проблемам с нехваткой памяти и производительностью в экземпляре SQL Server.
  • Если присвоить параметру max server memory (MB) минимальное значение, SQL Server может не запуститься. Если не удается запустить SQL Server после изменения этого параметра, запустите его с использованием параметра запуска -f и установите для параметра max server memory (MB) предыдущее значение. Дополнительные сведения см. в разделе Параметры запуска службы Database Engine.
  • Не рекомендуется устанавливать для параметров max server memory (MB) и min server memory (MB) одинаковые или почти одинаковые значения.

Заметка

Параметр max server memory (максимальный объем памяти сервера) ограничивает только размер буферного пула SQL Server. Он не влияет на незарезервированную память, которую SQL Server оставляет для выделения других компонентов, таких как расширенные хранимые процедуры, COM-объекты, библиотеки DLL, не являющиеся общими, и EXE-файлы.

SQL Server может использовать память динамически. Но можно установить параметры памяти вручную и ограничить объем памяти, доступный для SQL Server. Перед настройкой объема памяти для SQL Server определите подходящее значение путем вычитания из общего объема физической памяти того объема, который требуется операционной системе, выделениям памяти, не управляемым параметром max server memory (MB), и другим экземплярам SQL Server (и для других нужд, если на сервере размещены другие приложения, потребляющие память, включая другие экземпляры SQL Server). Это различие — максимальное количество памяти, которое можно назначить текущему экземпляру SQL Server.

Память может быть настроена до ограничения виртуального адресного пространства процесса во всех выпусках SQL Server. Дополнительные сведения см. в разделе Предельный объем памяти для выпусков Windows и Windows Server.

Минимальный объем памяти сервера

Параметр min server memory (MB) используется для гарантированного предоставления минимального объема памяти, доступного диспетчеру памяти SQL Server.

  • SQL Server не выделяет объем памяти, указанный в параметре min server memory (MB), сразу после запуска. Тем не менее, когда это значение достигается с ростом рабочей нагрузки, экземпляр SQL Server не может освободить память, если не уменьшить значение параметра min server memory (MB). Например, если на одном сервере установлено несколько экземпляров SQL Server, задайте параметр min server memory (MB), чтобы зарезервировать память для экземпляра.

  • Кроме того, необходимо задать значение min server memory (MB) в виртуализированной среде, чтобы гарантировать, что при дефиците памяти на базовом узле не будет попыток выделить больше памяти из буферного пула в гостевой виртуальной машине, чем это необходимо для приемлемой производительности. В идеале экземпляры SQL Server на виртуальной машине не должны конкурировать с процессами упреждающего распределения памяти на виртуальном узле.

  • SQL Server не гарантирует, что объем памяти, заданный параметром min server memory (MB), будет выделен. Если нагрузка на сервер никогда не требует выделения всего объема памяти, заданного параметром min server memory (MB), сервер SQL Server будет использовать меньше памяти.

Max server memory

Используйте параметр max server memory (MB), чтобы гарантировать, что операционная система и другие приложения не пострадают от нехватки памяти в SQL Server.

  • Перед настройкой конфигурации max server memory (MB) отслеживайте общее потребление памяти сервера, на котором размещен экземпляр SQL Server, во время нормальной работы, чтобы определить доступность и требования к памяти. Для начальной конфигурации или когда с течением времени не было возможности собирать использование памяти процесса SQL Server, используйте следующий обобщенный подход для настройки максимальной памяти сервера (МБ) для одного экземпляра:
    • Из значения общего объема памяти ОС вычтите эквивалент потенциального выделения памяти потоков SQL Server сверх значения max server memory (MB) (вычисляется так: размер стека 1 × вычисляемое максимальное число рабочих потоков2).
    • Затем вычтите 25 % для других выделений памяти вне элемента управления max server memory (MB), например для буферов резервного копирования, библиотек DLL расширенных хранимых процедур, объектов, созданных с помощью процедур автоматизации (вызовов sp_OA), и выделений от поставщиков связанных серверов. Это обобщенное значение, которое может отличаться.
    • Остаток и даст значение параметра max server memory (MB) в случае установки одного экземпляра.

1 Сведения о размерах стеков потока для различных архитектур см. в разделе Руководство по архитектуре управления памятью.

2 Сведения о вычислении рабочих потоков по умолчанию для заданного числа сходных ЦП на текущем узле см. в разделе Настройка параметра конфигурации сервера "Максимальное число рабочих потоков".

Настройка параметров вручную

Можно установить для параметров сервера min server memory (MB) и max server memory (MB) значения, покрывающие весь доступный объем памяти. Этот метод полезен для системных администраторов или администраторов баз данных, когда требуется настроить экземпляр SQL Server так, чтобы его параметры не противоречили требованиям к памяти других приложений или других экземпляров SQL Server, запущенных на этом узле.

Использование Transact-SQL

Параметры min server memory (MB) и max server memory (MB) являются расширенными. При использовании системной хранимой процедуры sp_configure для изменения этих настроек изменить их можно, только если параметр show advanced options установлен в значение 1. Эти параметры вступают в силу сразу же без перезагрузки сервера. Дополнительные сведения: sp_configure.

В следующем примере для параметра max server memory (MB) устанавливается значение 12 288 МБ, или 12 ГБ. Хотя sp_configure указывает имя параметра как max server memory (MB), можно опустить (MB).

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'max server memory', 12288;
GO
RECONFIGURE;
GO

Следующий запрос возвращает сведения о настроенных значениях и значении, которое сейчас используется. Этот запрос возвращает результаты независимо от того, включен ли sp_configure параметр "Показать расширенные параметры".

SELECT [name], [value], [value_in_use]
FROM sys.configurations
WHERE [name] = 'max server memory (MB)' OR [name] = 'min server memory (MB)';

Использование среды SQL Server Management Studio

Используйте параметры min server memory (MB) и max server memory (MB) для настройки объема памяти (в мегабайтах), которая находится в управлении диспетчера памяти SQL Server для экземпляра SQL Server.

  1. В обозревателе объектов щелкните правой кнопкой мыши сервер и выберите пункт Свойства.

  2. Выберите страницу Память окна Свойства сервера. Отображаются текущие значения минимального объема памяти сервера и максимального объема памяти сервера.

  3. В разделе Параметры памяти сервера введите требуемые значения для параметров минимального объема памяти сервера и максимального объема памяти сервера. Рекомендации см. в разделе min server memory (MB) и max server memory (MB) в этой статье.

На следующем снимке экрана показаны все три шага:

Screenshot of the memory configuration options in SSMS.

Блокировка страниц в памяти (LPIM)

Приложения на основе Windows могут использовать API Address Windowing Extensions (AWE) ОС Windows, чтобы выделять физическую память и сопоставлять ее с адресным пространством процесса. Эта политика LPIM Windows определяет, какие учетные записи могут получать доступ к API для сохранения данных в физической памяти, чтобы система не отправляла страницы данных в виртуальную память на диске. Память, выделенная с помощью AWE, блокируется до тех пор, пока приложение не освободит ее или не завершит работу. Использование API AWE для управления памятью в 64-разрядной версии SQL Server также часто называют заблокированными страницами. Блокировка страниц в памяти может обеспечивать отклик сервера, когда содержимое памяти заносится в файл подкачки. Для параметра Блокировка страниц в памяти указывается значение enabled в экземплярах выпуска SQL Server Standard и выше, если учетной записи с привилегией на выполнение sqlservr.exe предоставлено право пользователя Windows Блокировка страниц в памяти (LPIM).

Чтобы отключить параметр Блокировка страниц в памяти для SQL Server, удалите право пользователя Блокировка страниц в памяти у учетной записи с привилегиями для запуска sqlservr.exe (стартовой учетной записи SQL Server).

Использование LPIM не влияет на динамическое управление памятью в SQL Server, что позволяет расширить или сузить ее по запросу других клерков памяти. При использовании страниц блокировки в памяти справа настоятельно рекомендуется задать верхний предел для максимальной памяти сервера (МБ). См. дополнительные сведения о параметре max server memory (MB).

LPIM следует использовать при наличии признаков того, что sqlservr процесс выстраивается. В этом случае ошибка 17890 будет сообщаться в журнале ошибок, напоминая приведенный ниже пример:

A significant part of sql server process memory has been paged out. This may result in a performance degradation. Duration: #### seconds. Working set (KB): ####, committed (KB): ####, memory utilization: ##%.

Использование LPIM с неправильно настроенным параметром максимальной памяти сервера (МБ), который не учитывается для других потребителей памяти в системе, может привести к нестабильности в зависимости от объема памяти, требуемого другими процессами, или требований к памяти SQL Server за пределами области максимальной памяти сервера (МБ). См. дополнительные сведения о max server memory. Если предоставляется разрешение на блокировку страниц в памяти (LPIM) (в 32-разрядных или 64-разрядных системах), настоятельно рекомендуется задать параметр max server memory (MB), а не оставлять значение по умолчанию, равное 2 147 483 647 МБ.

Заметка

Начиная с SQL Server 2012 (11.x), флаг трассировки 845 не требуется для использования заблокированных страниц выпуска Standard Edition.

Включение параметра Блокировка страниц в памяти

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

Чтобы определить учетную запись службы для экземпляра SQL Server, обратитесь к диспетчеру конфигурации SQL Server или запросите service_account из sys.dm_server_services. Для получения дополнительной информации см. sys.dm_server_services (Transact-SQL).

Просмотр статуса Блокировка страниц в памяти

Чтобы определить, предоставлено ли учетной записи службы разрешение Блокировка страниц в памяти для экземпляра SQL Server, используйте следующий запрос. Этот запрос поддерживается в SQL Server 2016 (13.x) с пакетом обновления 1 (SP1) и более поздних версий.

SELECT sql_memory_model_desc FROM sys.dm_os_sys_info;

Следующие значения sql_memory_model_desc указывают состояние LPIM:

  • CONVENTIONAL. Разрешение "Блокировка страниц в памяти" не предоставлено.
  • LOCK_PAGES. Разрешение "Блокировка страниц в памяти" предоставлено.
  • LARGE_PAGES. Разрешение "Блокировка страниц в памяти" предоставляется в режиме предприятия с включенным флагом трассировки 834. Это расширенная конфигурация, которая не рекомендуется для большинства сред. Дополнительные сведения и важные рекомендации см. в разделе Флаг трассировки 834.

Используйте следующие методы, чтобы определить, использует ли экземпляр SQL Server заблокированные страницы:

  • Выходные данные следующего запроса Transact-SQL указывают ненулевое значение для locked_page_allocations_kb:

    SELECT osn.node_id, osn.memory_node_id, osn.node_state_desc, omn.locked_page_allocations_kb 
    FROM sys.dm_os_memory_nodes omn 
    INNER JOIN sys.dm_os_nodes osn ON (omn.memory_node_id = osn.memory_node_id) 
    WHERE osn.node_state_desc <> 'ONLINE DAC';
    
  • Текущий журнал ошибок SQL Server сообщает об этом сообщении Using locked pages in the memory manager во время запуска сервера.

  • В разделе диспетчера памяти выходных данных DBCC MEMORYSTATUS отображается ненулевое значение элемента AWE Allocated .

Несколько экземпляров SQL Server

При запуске нескольких экземпляров ядра СУБД существуют различные подходы, которые можно использовать для управления памятью:

  • Используйте параметр max server memory (MB), чтобы управлять использованием памяти, как описано выше. Установите максимальные значения для каждого экземпляра, учитывая, что их сумма не должна превышать общий объем физической памяти, установленной на компьютере. Рекомендуется выделять каждому экземпляру объем памяти, пропорциональный его ожидаемой рабочей нагрузке или размеру базы данных. Данный подход имеет то преимущество, что свободная память доступна новым процессам или экземплярам сразу же после их запуска. Недостаток в том, что, когда выполняются не все экземпляры, ни один из выполняющихся экземпляров не сможет использовать память, оставшуюся свободной.

  • Используйте параметр min server memory (MB), чтобы управлять использованием памяти, как описано выше. Установите минимальные значения для каждого экземпляра так, чтобы их сумма была на 1–2 ГБ меньше общего объема физической памяти, установленной на компьютере. Рекомендуется выделять каждому экземпляру минимальный объем памяти, пропорциональный его ожидаемой рабочей нагрузке. Данный подход имеет то преимущество, что выполняющиеся экземпляры могут использовать оставшуюся свободную память в случае, когда выполняются не все экземпляры. Этот подход также полезен при наличии другого интенсивного в памяти процесса на компьютере, так как это позволит SQL Server по крайней мере получить разумный объем памяти. Недостаток состоит в том, что при запуске нового экземпляра (или любого другого процесса) уже выполняющимся экземплярам требуется некоторое время для освобождения памяти, особенно если для этого им необходимо записать измененные страницы обратно в базу данных.

  • Используйте параметры max server memory (MB) и min server memory (MB) в каждом экземпляре для управления использованием памяти, наблюдения и настройки максимального использования каждого экземпляра, а также защиты минимального объема памяти в широком диапазоне возможных уровней использования памяти.

  • Отсутствие действий (не рекомендуется). Первые экземпляры, представленные рабочей нагрузкой, обычно выделяют всю память. Простаивающие экземпляры или экземпляры, запущенные позже других, могут в конечном итоге быть вынуждены работать лишь с минимальным доступным объемом памяти. SQL Server не пытается сбалансировать использование памяти между экземплярами. Тем не менее все экземпляры будут реагировать на сигналы уведомлений памяти Windows, корректируя объемы используемой ими памяти. Операционная система Windows не балансирует память между приложениями с помощью API уведомлений о памяти. Эти уведомления лишь обеспечивают глобальную обратную связь относительно доступности памяти в системе.

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

Примеры

О. Задание для параметра max server memory значения 4 ГБ

В следующем примере для параметра max server memory (MB) устанавливается значение 4096 МБ, или 4 ГБ. Хотя sp_configure указывает имя параметра как max server memory (MB), можно опустить (MB).

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'max server memory', 4096;
GO
RECONFIGURE;
GO

В результате вы получите инструкцию, аналогичную Configuration option 'max server memory (MB)' changed from 2147483647 to 4096. Run the RECONFIGURE statement to install. Новое ограничение памяти вступает в силу сразу после выполнения RECONFIGURE. Дополнительные сведения: sp_configure.

B. Определение текущего распределения памяти

Следующий запрос возвращает информацию о текущем распределении памяти.

SELECT
  physical_memory_in_use_kb/1024 AS sql_physical_memory_in_use_MB,
   large_page_allocations_kb/1024 AS sql_large_page_allocations_MB,
   locked_page_allocations_kb/1024 AS sql_locked_page_allocations_MB,
   virtual_address_space_reserved_kb/1024 AS sql_VAS_reserved_MB,
   virtual_address_space_committed_kb/1024 AS sql_VAS_committed_MB,
   virtual_address_space_available_kb/1024 AS sql_VAS_available_MB,
   page_fault_count AS sql_page_fault_count,
   memory_utilization_percentage AS sql_memory_utilization_percentage,
   process_physical_memory_low AS sql_process_physical_memory_low,
   process_virtual_memory_low AS sql_process_virtual_memory_low
FROM sys.dm_os_process_memory;

C. Просмотр значения max server memory (MB)

Следующий запрос возвращает сведения о настроенном сейчас значении и используемом значении. Этот запрос возвращает результаты независимо от того, включен ли sp_configure параметр "Показать расширенные параметры".

SELECT [value], [value_in_use]
FROM sys.configurations WHERE [name] = 'max server memory (MB)';

Далее