MS SQL забирает 99% памяти: настройка Max Server Memory для 1С
Почему SQL Server занимает всю память сервера?
Системный администратор открывает Диспетчер задач на сервере 1С и видит пугающую картину: процесс sqlservr.exe потребил 30 ГБ из 32 ГБ доступной оперативной памяти (95–99%). Сама 1С начинает выдавать ошибки нехватки памяти, а сервер зависает.
Это нормальное поведение или сбой?
По умолчанию в настройках Microsoft SQL Server максимальный объем памяти установлен на 2 147 483 647 МБ (2 Петабайта). Архитектура SQL Server устроена так, что он кэширует в оперативной памяти абсолютно все прочитанные таблицы и индексы базы 1С (Buffer Pool), чтобы не читать их повторно с медленного диска. Он будет забирать всю память до последнего мегабайта, если его жестко не ограничить!
Как правильно рассчитать и ограничить память для MS SQL
Формула расчета лимита памяти (Если 1С и SQL стоят на одном сервере):
- Операционной системе Windows: отдаем минимум 4–6 ГБ.
- Службе сервера 1С (rphost, rmngr): отдаем 20–30% RAM (минимум 8–12 ГБ).
- Остаток: отдаем под MS SQL Server.
Пример для сервера с 32 ГБ RAM: отдаем Windows 4 ГБ, процессам 1С 10 ГБ, для SQL Server выделяем 18 ГБ (18432 МБ).
Пошаговое ограничение через SQL Server Management Studio (SSMS):
- Запустите SQL Server Management Studio (SSMS) и подключитесь к вашему SQL серверу.
- В обозревателе объектов (слева) кликните правой кнопкой мыши по самому верхнему узлу сервера и выберите «Свойства» (Properties).
- В левом меню перейдите на страницу «Память» (Memory).
- В поле «Максимальный размер памяти сервера (в МБ)» (Maximum server memory) укажите рассчитанное значение (например,
18432). - Нажмите «ОК».
Альтернатива: мгновенное ограничение через 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'18432'
GO
RECONFIGURE WITH OVERRIDE
GOПерезагрузка не требуется! SQL Server мгновенно применит лимит и в течение 1–2 минут сам освободит лишнюю память для нужд процессов 1С и Windows.
Частые вопросы (FAQ)
Нужно ли трогать параметр «Минимальный размер памяти» (Min Server Memory)?
Обычно его оставляют по умолчанию равным 0, чтобы СУБД могла гибко отдавать память при простое.
Что будет, если выделить для SQL Server слишком мало памяти?
Если размер буферного пула будет меньше объема активных рабочих таблиц 1С, СУБД начнет постоянно сбрасывать кэш на медленный диск, что приведет к сильным тормозам всей базы.
Почему после ограничения диспетчер задач все равно показывает высокое потребление?
SQL Server не освобождает память мгновенно до нуля — он фиксирует за собой выделенный пул памяти и переиспользует его внутри своего диспетчера памяти.
Поможет ли включение опции Lock Pages in Memory (Блокировка страниц в памяти)?
Да, для высоконагруженных SQL-серверов эта опция Windows полезна: она запрещает операционной системе сбрасывать память SQL Server в файл подкачки (pagefile.sys).