Как распределить оперативную память на сервере «все в одном»: 1С, MS SQL и RDP на одной машине

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

Совмещение всех серверных ролей на одной физической или виртуальной машине — довольно распространенная, но крайне опасная практика в мире 1С. Когда на одном сервере под управлением одной операционной системы Windows Server одновременно работают СУБД MS SQL Server, сервер приложений 1С:Предприятия и сервер терминалов (RDP) на 100 пользователей, оперативная память становится самым дефицитным и критически важным ресурсом. Без жесткого контроля лимитов такая система обречена на постоянные зависания, взаимные блокировки и аварийные завершения процессов.

В этой статье мы подробно разберем, по каким принципам необходимо распределять оперативную память в подобных конфигурациях, произведем детальный математический расчет потребностей каждого компонента системы и пошагово настроим лимиты для предотвращения критических сбоев.

Анализ исходной ситуации и расчет потребностей

Рассмотрим конкретный кейс: база конфигурации 1С:Управление торговлей 11 объемом 65 ГБ, сотый пул активных пользователей, работающих в терминальном режиме (RDP), и всего 100 ГБ доступной оперативной памяти на сервере. Наша задача — распределить этот объем так, чтобы ни один из компонентов не вызвал сбой всей системы.

Проанализируем реальные аппетиты каждого участника системы:

  1. Операционная система Windows Server: Для обеспечения стабильной работы самой ОС и системных служб необходимо зарезервировать как минимум 4 ГБ ОЗУ. При дефиците памяти Windows начнет сбрасывать системный кэш на диск, что парализует работу СУБД.
  2. Терминальные RDP-сессии (100 пользователей): Даже если пользователи работают исключительно в тонком клиенте 1С и не запускают ресурсоемкие сторонние приложения (такие как браузеры или тяжелые таблицы Excel), на одну сессию выделяется от 150 до 300 МБ. Для 100 активных пользователей только под терминальное окружение потребуется не менее 20–25 ГБ ОЗУ. Если пользователи запускают полноценный толстый клиент или фоновые утилиты, этот показатель может вырасти в полтора-два раза.
  3. Сервер приложений 1С:Предприятия: Каждый сеанс пользователя создает нагрузку на рабочие процессы rphost. В среднем рабочий процесс потребляет от 100 до 250 МБ на одного активного пользователя. Соответственно, под нужды сервера приложений необходимо выделить около 15–20 ГБ памяти. Отдавать серверу 1С больше половины ресурсов (например, 48 ГБ, как было у автора темы) не имеет практического смысла, за исключением случаев неоптимизированного кода, приводящего к масштабным утечкам памяти.
  4. СУБД MS SQL Server: Главный потребитель памяти. Для быстрой обработки запросов SQL Server кэширует таблицы и индексы в оперативной памяти (Buffer Pool). Если размер базы составляет 65 ГБ, то в идеальных условиях серверу СУБД нужно предоставить объем памяти, максимально близкий к размеру активных данных (не менее 50-60% от размера базы). В условиях жесткого ограничения в 100 ГБ мы можем выделить под MS SQL Server максимум 45–50 ГБ.

Таким образом, оптимальная схема распределения 100 ГБ ОЗУ выглядит следующим образом:

Шаг 1. Ограничение оперативной памяти для MS SQL Server

По умолчанию MS SQL Server спроектирован так, чтобы забирать под свой кэш всю доступную физическую память, которую ему отдает операционная система. В совмещенной среде это приводит к тому, что при росте нагрузки SQL Server вытесняет память, необходимую для терминальных сессий пользователей или процессов 1С. Система начинает активно использовать файл подкачки (pagefile.sys) на диске, из-за чего быстродействие падает в десятки раз.

Для предотвращения этой ситуации необходимо жестко ограничить максимальный объем памяти СУБД. Настроим лимит через SQL Server Management Studio (SSMS):

  1. Подключимся к нужному экземпляру SQL Server.
  2. Нажмем правой кнопкой мыши на имя сервера в обозревателе объектов и выберем пункт «Свойства» (Properties).
  3. Перейдем на вкладку «Память» (Memory).
  4. В поле «Максимальный размер памяти сервера (в МБ)» (Maximum server memory) укажем значение 45000 (что соответствует примерно 44 ГБ).
  5. Нажмем «ОК» для применения настроек без перезапуска службы.

Также эту операцию можно выполнить с помощью выполнения 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'45000'
GO
RECONFIGURE WITH OVERRIDE
GO

Шаг 2. Настройка локальной групповой политики Lock Pages in Memory

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

Чтобы запретить Windows сбрасывать кэш СУБД на диск, необходимо настроить политику «Блокировка страниц в памяти» (Lock Pages in Memory):

  1. Откроем редактор локальной групповой политики, нажав сочетание клавиш Win + R и введя команду gpedit.msc.
  2. Перейдем по пути: Конфигурация компьютера -> Конфигурация Windows -> Параметры безопасности -> Локальные политики -> Назначение прав пользователя.
  3. Найдем в списке параметр «Блокировка страниц в памяти» (Lock pages in memory) и откроем его свойства двойным кликом.
  4. Нажмем кнопку «Добавить пользователя или группу» и укажем учетную запись, под которой запускается служба СУБД MS SQL Server (например, NT Service\MSSQLSERVER).
  5. Применим изменения и перезапустим службу SQL Server для вступления настроек в силу.

Шаг 3. Включение протокола Shared Memory (Общая память)

Поскольку сервер приложений 1С и сервер СУБД SQL Server запущены в рамках одной операционной системы, им совершенно не обязательно общаться друг с другом через сетевой стек протокола TCP/IP. Использование локального протокола Shared Memory позволяет им обмениваться данными напрямую через выделенные области оперативной памяти, минуя сетевую карту и снижая нагрузку на процессор.

Проверим и включим протокол Shared Memory:

  1. Откроем утилиту Диспетчер конфигурации SQL Server (SQL Server Configuration Manager).
  2. Перейдем в раздел «Сетевая конфигурация SQL Server» (SQL Server Network Configuration) -> «Протоколы для [Имя_Экземпляра]».
  3. Убедимся, что протокол «Общая память» (Shared Memory) включен (статус Enabled). Если нет, нажмем по нему правой кнопкой мыши и выберем «Включить».
  4. Аналогично проверим раздел «Клиент SQL Native Client» -> «Клиентские протоколы» и включим там Shared Memory. При этом в порядке использования протоколов Shared Memory должен стоять на первом месте (Order = 1).

Шаг 4. Оптимизация рабочих процессов сервера 1С:Предприятия

Сервер приложений 1С подвержен фрагментации памяти и утечкам из-за неоптимального кода конфигураций. Если запустить работу всех 100 пользователей в рамках одного рабочего процесса rphost, то при критической утечке памяти процесс аварийно завершится, выбросив всех пользователей из системы.

Разберем, как правильно настроить параметры кластера 1С через утилиту администрирования:

  1. Откроем консоль «Администрирование серверов 1С Предприятия».
  2. Перейдем к свойствам нашего кластера.
  3. Настроим параметр «Допустимый объем памяти» (Allowed memory size). Рекомендуется установить значение порядка 4194304 КБ (4 ГБ) на один процесс. Если процесс превысит этот лимит, сервер 1С начнет плавно перенаправлять новые сеансы на другие рабочие процессы, а старый процесс будет безопасно перезапущен после завершения активных задач пользователей.
  4. Параметр «Интервал перезапуска процессов» (Recycle interval) установим в значение 86400 секунд (24 часа). Автоматический перезапуск процессов раз в сутки (желательно ночью) помогает полностью очистить фрагментированную память.
  5. Отрегулируем количество рабочих процессов. Для 100 пользователей рекомендуется иметь в пуле как минимум 4-5 одновременно запущенных процессов rphost. Это распределит нагрузку (примерно по 20-25 пользователей на процесс) и повысит общую отказоустойчивость системы.

Шаг 5. Тонкая настройка SQL Server для совместной работы

Для стабильной работы 1С на совмещенном сервере крайне важна правильная конфигурация параметров параллелизма и системных баз данных:

Радикальное и единственно верное решение: разделение ролей

Хотя вышеописанные настройки помогут стабилизировать работу совмещенного сервера, важно понимать: конфигурация «1С + SQL + RDP» на одной машине со 100 ГБ ОЗУ для 100 пользователей — это компромиссное решение, работающее на пределе возможностей оборудования.

Как упоминалось в процессе обсуждения на форуме, физический сервер автора имеет в распоряжении 250 ГБ оперативной памяти, на базе которой развернута система виртуализации. В такой ситуации правильным и надежным архитектурным решением будет разделение ролей по разным виртуальным машинам:

Разнесение RDP и серверов баз данных по разным виртуальным машинам гарантирует высочайшую отказоустойчивость, предсказуемость производительности и удобство администрирования всей корпоративной системы 1С.

← На главную