При совместном размещении сервера СУБД MS SQL Server и Сервера 1С:Предприятия на одной физической машине системные администраторы часто сталкиваются с ситуацией, когда служба sqlservr.exe постепенно захватывает практически весь объем доступной оперативной памяти. В часы пиковой нагрузки свободная память исчерпывается до 99%, операционная система начинает активно использовать файл подкачки, а пользователи сталкиваются с резким падением производительности при проведении документов и формировании отчетов. Разберем по шагам, почему это происходит и как правильно настроить ограничения памяти на стороне SQL Server и кластера 1С.
Проанализируем архитектуру управления памятью в СУБД. По умолчанию параметр максимального объема памяти сервера в MS SQL Server выставлен в значение 2 147 483 647 МБ (более 2 ПБ). Это означает, что сервер баз данных проектировался под принцип максимального кэширования: все прочитанные страницы данных, индексы и скомпилированные планы выполнения запросов удерживаются в буферном пуле (Buffer Pool) до тех пор, пока операционная система явно не запросит освобождение ресурсов.
Однако в версиях SQL Server 2005, 2008 и 2008 R2 параметр max server memory ограничивает только пул буферов для страниц размером до 8 КБ. Выделения памяти под большие планы запросов (Multi-Page Allocator), структуры потоков, процедуры и среда CLR могут приводить к дополнительному потреблению памяти свыше заданного лимита. Если не установить жесткие рамки, СУБД не оставит ресурсов для стабильной работы службы rphost сервера 1С и системных сервисов Windows.
Рассмотрим стандартный способ задания лимита ОЗУ для службы СУБД:
5120).Для выполнения аналогичной операции через скрипт T-SQL используем системную процедуру sp_configure:
EXEC sys.sp_configure N'show advanced options', N'1';
RECONFIGURE WITH OVERRIDE;
EXEC sys.sp_configure N'max server memory (MB)', 5120;
RECONFIGURE WITH OVERRIDE;
Выясним, как правильно разделить доступную оперативную память между компонентами системы. При совмещении на одном сервере операционной системы, сервера 1С и MS SQL Server распределение планируется по следующим правилам:
rphost требуется от 2 до 4 ГБ и более. Точный объем зависит от числа активных пользователей, фоновых заданий и наличия ресурсоемких алгоритмов (например, обработка больших коллекций типа ТаблицаЗначений на стороне сервера).Если SQL Server уже занял память, а производительность системы упала, не рекомендуется использовать аварийные bat-скрипты для перезапуска служб по расписанию. Перезагрузка службы MSSQLSERVER сбрасывает все кэши планов и страниц, из-за чего последующие запросы пользователей и перепроведение документов начинают выполняться в разы медленнее, вызывая высокую нагрузку на дисковую подсистему.
Для динамического сброса памяти без остановки работы пользователей можно временно уменьшить параметр max server memory на меньшее значение, выполнить RECONFIGURE, подождать несколько минут (пока служба отдаст освободившиеся страницы операционной системе), после чего вернуть расчетный порог обратно.
Для принудительной очистки кэшей планов и внутренних структур применяются команды DBCC:
-- Очистка кэша планов выполнения запросов (актуально при накоплении непараметризованных запросов 1С)
DBCC FREEPROCCACHE;
-- Очистка всех неиспользуемых системных кэшей
DBCC FREESYSTEMCACHE ('ALL');
Чтобы избежать утечек памяти и падения рабочих процессов rphost, настроим встроенные механизмы управления ресурсами в консоли Администрирование серверов 1С:Предприятия в свойствах кластера или рабочего сервера:
Сбалансированное ограничение памяти max server memory для SQL Server в сочетании со штатными политиками перезапуска процессов rphost сервера 1С обеспечивает стабильную работу инфраструктуры без зависаний и внезапных перезагрузок служб.