Как правильно ограничить потребление памяти MS SQL Server при работе с 1С на одном сервере

Системный администратор 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Ситуация, когда MS SQL Server «пожирает» почти всю доступную оперативную память, является классической для администраторов систем на базе 1С. В нашем случае мы имеем сервер с 64 ГБ ОЗУ, на котором одновременно запущены MS SQL Server 2017 и сервер 1С:Предприятие 8.3 для 30 пользователей. Потребление памяти на уровне 94% вызывает закономерные опасения. В этой статье мы подробно разберем, почему это происходит, и выясним, как правильно настроить систему, чтобы избежать сбоев.

Почему SQL Server занимает всю память?

Прежде всего, нам необходимо понять архитектурную особенность SQL Server. По умолчанию этот сервер спроектирован так, чтобы использовать максимально возможный объем оперативной памяти. Рассмотрим подробнее механизм Buffer Pool (буферный пул). SQL Server кэширует данные из таблиц и индексов в ОЗУ, чтобы при повторных запросах не обращаться к медленной дисковой подсистеме. Чем больше данных находится в памяти, тем быстрее работает база. Если не установить жесткий лимит, SQL Server будет забирать свободную память до тех пор, пока операционная система не начнет выдавать сигналы о критической нехватке ресурсов.

Опасное заблуждение: параметр Auto Close

Проанализируем одно из предложений, прозвучавших в обсуждении, а именно включение параметра Auto Close (Автоматическое закрытие базы). Важно понимать: этот совет является крайне вредным для высоконагруженных систем 1С.

Разберем по шагам, что происходит при включении Auto Close = True:

  1. Когда последний пользователь отключается от базы, SQL Server закрывает её и выгружает все связанные ресурсы из памяти.
  2. При следующем обращении (например, когда сервер 1С пытается выполнить регламентное задание или заходит новый пользователь) SQL Server вынужден заново инициализировать базу данных.
  3. Это приводит к колоссальным задержкам, росту нагрузки на диски и процессор, а также к «рваному» темпу работы пользователей.

В среде 1С параметр Auto Close всегда должен быть установлен в значение False.

Расчет лимита Max Server Memory

Теперь перейдем к решению основной задачи — ограничению «аппетитов» SQL Server. Настройка Max Server Memory (Максимальная память сервера) — это первое, что должен сделать администратор. Если у нас на борту 64 ГБ ОЗУ и на этой же машине работает сервер 1С, мы не можем отдавать SQL-серверу 90% памяти.

Проанализируем распределение ресурсов:

Для данной конфигурации (64 ГБ ОЗУ) мы рекомендуем установить Max Server Memory в диапазоне 32–36 ГБ. Это обеспечит баланс между производительностью запросов и стабильностью сервера 1С.

Для установки лимита через SQL Management Studio выполним следующие действия:

  1. Нажмем правой кнопкой на корень сервера и выберем Properties (Свойства).
  2. Перейдем в раздел Memory (Память).
  3. В поле Maximum server memory (in MB) введем значение, например, 32768 (для 32 ГБ).
  4. Нажмем OK. Изменения вступят в силу мгновенно, перезагрузка службы не требуется.

Также это можно сделать с помощью скрипта T-SQL:


EXEC sys.sp_configure N'show advanced options', N'1'
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N'max server memory (MB)', N'32768'
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N'show advanced options', N'0'
RECONFIGURE WITH OVERRIDE
GO

Настройка Lock Pages in Memory (LPIM)

Рассмотрим ситуацию, когда операционная система решает, что SQL Server занимает слишком много памяти, и начинает выгружать его кэш в файл подкачки (pagefile.sys) на диске. Для 1С это означает катастрофическое падение производительности. Чтобы этого не произошло, мы должны настроить политику Блокировка страниц в памяти.

Разберем процесс настройки:

  1. Нажмем Win+R, введем gpedit.msc.
  2. Перейдем: Конфигурация компьютера -> Конфигурация Windows -> Параметры безопасности -> Локальные политики -> Назначение прав пользователя.
  3. Найдем пункт Lock pages in memory (Блокировка страниц в памяти) и добавим туда учетную запись, от имени которой запускается служба SQL Server.
  4. После этого необходимо перезапустить службу SQL Server.

Оптимизация параллелизма (MAXDOP)

Помимо памяти, крайне важно настроить то, как SQL Server использует ядра процессора. Для баз данных 1С параметр Max Degree of Parallelism (MAXDOP) играет решающую роль. По умолчанию он равен 0 (использовать все доступные ядра для одного запроса), что часто приводит к взаимным блокировкам в 1С.

Проанализируем рекомендации:

Настройка TempDB

Поскольку 1С очень активно работает с временными таблицами, база данных tempdb становится узким местом. Посмотрим, как её оптимизировать:

  1. Разделите tempdb на несколько файлов данных. Оптимальное количество файлов обычно равно количеству логических ядер процессора (но не более 8).
  2. Установите одинаковый начальный размер и шаг приращения для всех файлов tempdb, чтобы нагрузка распределялась равномерно.
  3. Крайне желательно вынести файлы tempdb на самый быстрый доступный диск (NVMe или SSD).

Итоги и мониторинг

Мы выяснили, что высокая загрузка памяти — это штатное поведение SQL Server, которое, тем не менее, требует контроля в условиях совмещенного использования ресурсов. После установки лимита Max Server Memory мы должны понаблюдать за состоянием счетчика Memory Clerk. Если потребление памяти продолжает расти выше установленного лимита, это может указывать на то, что память расходуется компонентами вне буферного пула (например, кэшем планов запросов или сторонними DLL).

Помните, что связка «Сервер 1С + SQL + Пользователи» на одной физической машине — это всегда компромисс. Регулярно проверяйте нагрузку через монитор ресурсов и не допускайте, чтобы свободная физическая память опускалась ниже 2–3 ГБ, так как это может привести к нестабильности всей операционной системы.

← На главную