Как решить проблему неконтролируемого роста потребления оперативной памяти в связке 1С:Предприятие и MS SQL Server?

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

При совместной работе кластера серверов 1С:Предприятие и MS SQL Server системные администраторы часто сталкиваются с ситуацией, когда физическая память сервера непрерывно заполняется и процесс СУБД sqlservr.exe забирает практически весь доступный объем RAM. Это приводит к замедлению работы пользователей, вытеснению процессов 1С в файл подкачки и нестабильности системы. Разберем детально, почему так происходит, какие настройки являются ошибочными и как правильно сконфигурировать серверную инфраструктуру.

Поведение MS SQL Server: норма или утечка памяти?

Для начала проанализируем архитектурную особенность MS SQL Server. По своей природе СУБД стремится занять всю память, выделенную ей настройкой max server memory. Это поведение является штатным и преследует цель максимального кэширования данных в оперативной памяти (буферный пул), чтобы минимизировать медленные операции чтения с диска. Однако в условиях работы с 1С возникают две специфические проблемы:

  1. Разрастание кэша планов запросов (Plan Cache Bloat): Платформа 1С генерирует большое количество динамических и непараметризованных SQL-запросов. В результате SQL Server создает и удерживает в памяти миллионы уникальных планов выполнения (клерк CACHESTORE_SQLCP), вытесняя полезные данные из буферного пула.
  2. Конкуренция за оперативную память: Если Сервер 1С и MS SQL Server установлены на одной физической машине (или в одной виртуальной машине), рабочие процессы 1С (rphost) и процесс sqlservr.exe начинают бороться за свободную память ОС. Если СУБД заняла всю память, процессы 1С при пиковых нагрузках начинают сбрасываться в своп (paging), что вызывает резкие системные зависания.

Ошибочные настройки, усугубляющие нехватку ресурсов

Рассмотрим параметры SQL Server, ручное изменение которых часто приводит к деградации производительности:

  1. Включение флага «Boost SQL Server priority» (Повышение приоритета SQL Server): Данная опция категорически не рекомендуется. Перевод процесса SQL Server в высокий приоритет ОС Windows приводит к ресурсному голоданию потоков самой операционной системы и рабочих процессов Сервера 1С (rphost, rmngr), провоцируя тайм-ауты и сбои соединений. Опцию необходимо отключить.
  2. Завышение параметра «Max Worker Threads»: Установка вручную высоких значений (например, 2048 потоков) приводит к избыточному резервированию памяти, так как под каждый рабочий поток в 64-битной системе резервируется стек памяти объемом до 2 МБ. Рекомендуется оставлять значение 0 (автоматический расчет).

Пошаговый расчет и настройка параметров MS SQL Server

Разберем по шагам, как правильно распределить память и настроить СУБД для стабильной работы с базами 1С.

  1. Расчет максимального объема памяти (Max Server Memory):
    Рассчитаем лимит по следующей формуле: из общего объема физической RAM вычитаем 4–8 ГБ на нужды операционной системы, а также резерв под процессы 1С (в среднем 2–4 ГБ на каждый рабочий процесс rphost с учетом пиковых нагрузок). Оставшийся объем задаем параметру max server memory (MB).
    Применим настройку с помощью T-SQL команд:
    
    EXEC sys.sp_configure N'show advanced options', N'1';
    RECONFIGURE WITH OVERRIDE;
    EXEC sys.sp_configure N'max server memory (MB)', 98304; -- Пример для лимита в 96 ГБ
    RECONFIGURE WITH OVERRIDE;
    
  2. Включение оптимизации для динамических запросов:
    Параметр optimize for ad hoc workloads заставляет SQL Server при первом выполнении запроса сохранять в кэше только компактную заглушку (plan stub), а полный план сохранять только при повторных обращениях. Это освобождает десятки гигабайт памяти в базах 1С.
    Выполним команду:
    
    EXEC sys.sp_configure N'optimize for ad hoc workloads', 1;
    RECONFIGURE WITH OVERRIDE;
    
  3. Настройка параллелизма:
    Для большинства конфигураций 1С рекомендуется ограничить максимальную степень параллелизма, установив Max degree of parallelism (MAXDOP) в значение 1, чтобы исключить взаимные блокировки потоков при выполнении запросов:
    
    EXEC sys.sp_configure N'max degree of parallelism', 1;
    RECONFIGURE WITH OVERRIDE;
    
  4. Регулярная очистка кэша планов без перезапуска службы:
    Чтобы не перезагружать службу SQL Server целиком, сброс разросшегося кэша планов запросов можно автоматизировать с помощью регламентного задания SQL Server Agent в ночное время: DBCC FREESYSTEMCACHE('SQL Plans'); Эта команда освобождает память от неиспользуемых планов, сохраняя закэшированные страницы данных в буферном пуле.

Настройка управления памятью в кластере 1С:Предприятие

Проанализируем параметры кластера 1С, которые позволяют защитить сервер от утечек памяти в сеансах пользователей. В свойствах кластера и рабочих серверов через консоль администрирования или утилиту rac настроим следующие ограничения:

  1. Допустимый объем памяти: Зададим суммарный лимит оперативной памяти для всех рабочих процессов сервера. При превышении порога кластер автоматически запустит новые процессы rphost и плавно перезапустит устаревшие.
  2. Интервал превышения допустимого объема памяти: Укажем время (в секундах), по истечении которого процесс, превысивший лимит, будет принудительно перезапущен со сбросом зависших сеансов.
  3. Количество ИБ и соединений на один процесс: Для распределения нагрузки создадим несколько рабочих процессов rphost, ограничив количество сеансов на каждый процесс, чтобы изолировать потенциальные утечки памяти в рамках отдельных сессий.

Архитектурные рекомендации

Если после выполнения всех настроек сервер продолжает испытывать нехватку ресурсов, наилучшим решением станет физическое или виртуальное разделение ролей: вынос рабочего сервера 1С и СУБД MS SQL Server на две отдельные машины. Это полностью исключит взаимную конкуренцию за оперативную память и дисковую подсистему.

← На главную