Ситуация, когда MS SQL Server «пожирает» почти всю доступную оперативную память, является классической для администраторов систем на базе 1С. В нашем случае мы имеем сервер с 64 ГБ ОЗУ, на котором одновременно запущены MS SQL Server 2017 и сервер 1С:Предприятие 8.3 для 30 пользователей. Потребление памяти на уровне 94% вызывает закономерные опасения. В этой статье мы подробно разберем, почему это происходит, и выясним, как правильно настроить систему, чтобы избежать сбоев.
Прежде всего, нам необходимо понять архитектурную особенность SQL Server. По умолчанию этот сервер спроектирован так, чтобы использовать максимально возможный объем оперативной памяти. Рассмотрим подробнее механизм Buffer Pool (буферный пул). SQL Server кэширует данные из таблиц и индексов в ОЗУ, чтобы при повторных запросах не обращаться к медленной дисковой подсистеме. Чем больше данных находится в памяти, тем быстрее работает база. Если не установить жесткий лимит, SQL Server будет забирать свободную память до тех пор, пока операционная система не начнет выдавать сигналы о критической нехватке ресурсов.
Проанализируем одно из предложений, прозвучавших в обсуждении, а именно включение параметра Auto Close (Автоматическое закрытие базы). Важно понимать: этот совет является крайне вредным для высоконагруженных систем 1С.
Разберем по шагам, что происходит при включении Auto Close = True:
В среде 1С параметр Auto Close всегда должен быть установлен в значение False.
Теперь перейдем к решению основной задачи — ограничению «аппетитов» SQL Server. Настройка Max Server Memory (Максимальная память сервера) — это первое, что должен сделать администратор. Если у нас на борту 64 ГБ ОЗУ и на этой же машине работает сервер 1С, мы не можем отдавать SQL-серверу 90% памяти.
Проанализируем распределение ресурсов:
Для данной конфигурации (64 ГБ ОЗУ) мы рекомендуем установить Max Server Memory в диапазоне 32–36 ГБ. Это обеспечит баланс между производительностью запросов и стабильностью сервера 1С.
Для установки лимита через SQL Management Studio выполним следующие действия:
Также это можно сделать с помощью скрипта 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
Рассмотрим ситуацию, когда операционная система решает, что SQL Server занимает слишком много памяти, и начинает выгружать его кэш в файл подкачки (pagefile.sys) на диске. Для 1С это означает катастрофическое падение производительности. Чтобы этого не произошло, мы должны настроить политику Блокировка страниц в памяти.
Разберем процесс настройки:
Win+R, введем gpedit.msc.Помимо памяти, крайне важно настроить то, как SQL Server использует ядра процессора. Для баз данных 1С параметр Max Degree of Parallelism (MAXDOP) играет решающую роль. По умолчанию он равен 0 (использовать все доступные ядра для одного запроса), что часто приводит к взаимным блокировкам в 1С.
Проанализируем рекомендации:
MAXDOP в значение 1 (запретить параллелизм для одного запроса) или, в крайнем случае, 2 или 4. Это делает работу системы более предсказуемой.Cost Threshold for Parallelism рекомендуется поднять со стандартных 5 до 50. Это скажет серверу: «не пытайся распараллеливать мелкие запросы, они и так быстро выполнятся».Поскольку 1С очень активно работает с временными таблицами, база данных tempdb становится узким местом. Посмотрим, как её оптимизировать:
tempdb на несколько файлов данных. Оптимальное количество файлов обычно равно количеству логических ядер процессора (но не более 8).tempdb, чтобы нагрузка распределялась равномерно.tempdb на самый быстрый доступный диск (NVMe или SSD).Мы выяснили, что высокая загрузка памяти — это штатное поведение SQL Server, которое, тем не менее, требует контроля в условиях совмещенного использования ресурсов. После установки лимита Max Server Memory мы должны понаблюдать за состоянием счетчика Memory Clerk. Если потребление памяти продолжает расти выше установленного лимита, это может указывать на то, что память расходуется компонентами вне буферного пула (например, кэшем планов запросов или сторонними DLL).
Помните, что связка «Сервер 1С + SQL + Пользователи» на одной физической машине — это всегда компромисс. Регулярно проверяйте нагрузку через монитор ресурсов и не допускайте, чтобы свободная физическая память опускалась ниже 2–3 ГБ, так как это может привести к нестабильности всей операционной системы.