Как решить проблему «Недостаточно памяти» на сервере 1С:Предприятие

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

Рассмотрим распространенную и крайне неприятную ситуацию: сервер 1С:Предприятие неожиданно начинает прерывать работу пользователей, генерируя ошибку «Недостаточно памяти». При этом при анализе ресурсов физического или виртуального сервера выясняется, что оперативной памяти доступно еще достаточно много (например, свободными остаются около 10 ГБ), файл подкачки настроен корректно, а дисковое пространство не переполнено. Перезагрузка службы 1С временно решает проблему, но через некоторое время сбой повторяется.

Выясним причину такого поведения системы и разберем по шагам, как полностью устранить данную ошибку, настроить рабочие процессы и оптимизировать распределение ресурсов между сервером приложений и СУБД.

Выясняем архитектурные причины сбоя

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

Если на сервере установлена 32-битная (x86) версия сервера 1С:Предприятие, то каждый рабочий процесс rphost физически не может использовать более 4 ГБ виртуального адресного пространства (на практике операционная система Windows по умолчанию ограничивает его вовсе 2 ГБ для пользовательских нужд). Когда процесс приближается к этому порогу, платформа выдает ошибку нехватки памяти и аварийно завершает работу.

Помимо жесткого лимита в 2–3 ГБ, существуют дополнительные факторы, провоцирующие сбой:

  1. Фрагментация адресного пространства: Память под тяжелые операции (например, формирование сложных отчетов, закрытие месяца или обновление конфигурации) должна выделяться непрерывным блоком. Если виртуальное пространство процесса сильно фрагментировано (свободные участки чередуются с занятыми), операционная система не сможет выделить один крупный кусок памяти, даже если суммарно свободных ресурсов достаточно. Процесс rphost аварийно завершится.
  2. Утечки памяти (Memory Leaks): В платформе 1С и в коде прикладных конфигураций периодически возникают ситуации, когда объекты после выполнения операций не удаляются из памяти должным образом. Со временем рабочий процесс накапливает этот балласт, раздувается до критического предела и падает.

Теперь рассмотрим комплекс мер для устранения этой проблемы — от радикальных и наиболее правильных до временных и профилактических.

Шаг 1. Переход на 64-разрядную версию сервера 1С

Это самое надежное и стратегически верное решение. В 64-битных системах лимит адресного пространства на один процесс практически отсутствует (составляет до 8 ТБ), что полностью нивелирует проблему фрагментации виртуальной памяти процесса rphost.

Убедимся, какая именно разрядность сервера установлена в нашей системе. Для этого откроем диспетчер задач Windows и найдем процесс rphost. Если рядом с его именем отображается суффикс *32 или (32 бита), значит, мы используем устаревшую разрядность платформы.

Для миграции выполним следующие действия:

  1. Приобретем (при необходимости) и скачаем дистрибутив 64-разрядного сервера «1С:Предприятие».
  2. Создадим резервную копию всех баз данных и настроек кластера (каталог srvinfo).
  3. Остановим службу 1C:Enterprise 8.3 Server Agent.
  4. Удалим 32-битные компоненты сервера через панель управления (клиентские приложения можно оставить, если они требуются).
  5. Установим 64-битный сервер 1С:Предприятие.
  6. Запустим службу сервера и проверим работоспособность системы. Теперь процессы rphost смогут свободно утилизировать всю физическую память сервера по мере необходимости.

Шаг 2. Временный обход проблемы на 32-битном сервере

Если быстро перейти на x64-платформу не представляется возможным (например, из-за задержек с согласованием бюджета на лицензии), мы можем временно облегчить жизнь серверу с помощью настроек операционной системы и кластера 1С.

Увеличим лимит виртуальной памяти для пользовательских процессов в Windows с 2 ГБ до 3 ГБ. Для этого откроем командную строку от имени администратора и выполним следующую команду:

bcdedit /set increaseuserva 3072

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

Также временно снизим нагрузку на один рабочий процесс, изменив параметр «Количество соединений на один процесс» в свойствах рабочего сервера через утилиту администрирования кластера. Если по умолчанию там установлено значение 128, попробуем снизить его до 10–20. Это заставит кластер создавать новые процессы rphost для новых пользователей, распределяя их по разным адресным пространствам. Обратите внимание, что тонкая балансировка нагрузки доступна в полной мере на лицензиях КОРП, однако базовое уменьшение лимита соединений сработает и на ПРОФ лицензиях, помогая избежать перегрузки единственного процесса.

Шаг 3. Тонкая настройка параметров перезапуска процессов в кластере 1С

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

Установим следующие параметры для контроля «прожорливости» процессов:

  1. Допустимый объем памяти (Allowed memory size): Для 32-битного сервера жестко пропишем значение в районе 2 000 000 KB (около 2 ГБ). Для 64-битного сервера этот параметр рассчитывается исходя из общего объема ОЗУ на сервере за вычетом нужд ОС и SQL-сервера.
  2. Интервал превышения допустимого объема памяти: Установим значение равным 60 секундам. Если процесс превышает лимит непрерывно в течение этого времени, он помечается как выключаемый.
  3. Выключенные процессы останавливать через: Зададим 120 секунд. Это время, в течение которого старый процесс будет «доживать» и завершать текущие пользовательские запросы, пока новые пользователи уже незаметно перенаправляются на вновь созданный рабочий процесс.
  4. Интервал перезапуска рабочих процессов: Установим значение 86400 секунд (ровно одни сутки). Это гарантирует, что раз в сутки каждый процесс будет превентивно заменен новым чистым процессом, что полностью решает проблему постепенного накопления утечек памяти. Оптимально настроить перезапуск на ночное время.

Шаг 4. Ограничение потребления памяти СУБД MS SQL Server

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

Чтобы SQL-сервер не «душил» процессы 1С, жестко ограничим его аппетиты:

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

Рассчитаем лимит по следующей формуле: вычтем из общего объема оперативной памяти сервера 4 ГБ на нужды операционной системы и еще по 2 ГБ на каждый планируемый процесс rphost сервера 1С. Например, если на сервере установлено 20 ГБ ОЗУ, выделим под MS SQL Server не более 10–12 ГБ. Это оставит гарантированный буфер для стабильной работы службы 1С.

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

Шаг 5. Дополнительные меры профилактики и диагностики

Проанализируем сопутствующие факторы, которые могут вызывать перегрузку памяти на сервере приложений:

Регулярно выполняя эти рекомендации, мы обеспечим стабильную и бесперебойную работу сервера 1С:Предприятие, исключив внезапные падения рабочих процессов из-за дефицита памяти.

← На главную