При работе с базами данных «1С:Предприятие 8.3» системные администраторы и разработчики часто сталкиваются с ситуацией, когда ресурсоемкие операции — такие как «Закрытие месяца», формирование крупных отчетов (например, оборотно-сальдовой ведомости за большой период) или проведение тяжелых документов — прерываются аварийным завершением сеанса. При этом система выдает ошибки нехватки памяти, а стабильная работа восстанавливается только после перезапуска службы сервера приложений 1С. Через несколько часов активной работы пользователей проблема повторяется снова.
В этой статье мы подробно проанализируем причины возникновения этой проблемы, разберем физику процесса распределения оперативной памяти в 32-битных системах, рассмотрим особенности платформы 1С и СУБД PostgreSQL, а также предложим пошаговые сценарии для временного устранения сбоев и долгосрочного решения проблемы.
Основной корень проблемы в описанной ситуации кроется в использовании 32-разрядной версии сервера «1С:Предприятие». Давайте детально разберем, почему физически происходит падение рабочего процесса rphost.exe:
rphost.exe) имеет жесткое ограничение на объем виртуального адресного пространства. По умолчанию оно составляет всего 2 ГБ (в редких конфигурациях с использованием ключа /3GB его можно расширить до 3 ГБ, но это часто приводит к нестабильности самой ОС).rphost.exe падает задолго до достижения отметки в 2 ГБ. Обычно критическое завершение (крэш) происходит при потреблении 1.4–1.7 ГБ. Это связано с фрагментацией виртуальной памяти. При выполнении сложных запросов или расчете себестоимости системе требуются крупные непрерывные блоки памяти для временных таблиц. Если в адресном пространстве процесса свободные мегабайты «разбросаны» мелкими кусками, операционная система не сможет выделить один сплошной блок (например, размером 150 МБ), и процесс мгновенно завершит работу по ошибке Out of memory.rphost.exe. Нагрузка суммируется, память забивается лавинообразно, и падение процесса одной базы приводит к вылету сеансов пользователей во всех остальных базах.Помимо архитектурных ограничений разрядности, на стабильность работы сервера влияют особенности конкретного релиза платформы и конфигурации:
rphost.exe.Если осуществить мгновенный переход на 64-разрядную версию сервера приложений 1С невозможно (например, из-за бюджетных ограничений или согласования закупки лицензий), мы можем настроить кластер 1С так, чтобы минимизировать падения и исключить необходимость ручной перезагрузки сервера каждые 4 часа. Рассмотрим эти настройки по шагам.
Для оптимизации работы нам потребуется запустить утилиту «Администрирование серверов 1С Предприятия» и изменить свойства нашего локального кластера:
Вместо того чтобы ждать, пока процесс накопит ошибки и упадет самостоятельно, мы настроим его плановый и незаметный для пользователей перезапуск. В свойствах кластера зададим следующие параметры:
14400 секунд (4 часа) или 86400 секунд (24 часа) в зависимости от интенсивности работы.60 до 180 секунд. Это время, в течение которого старый процесс с заполненной памятью будет ожидать завершения длительных запросов пользователей, пока новые пользователи уже бесшовно подключаются к новому («чистому») процессу rphost.exe.По умолчанию кластер запускает один рабочий процесс на все базы. Мы можем принудительно заставить систему создавать несколько параллельных процессов rphost.exe, распределяя нагрузку между ними. Для этого в свойствах рабочего сервера установим параметры:
1. В этом случае для каждой базы (или группы баз) выделится свой изолированный процесс, и падение процесса под тяжелой базой БП не затронет пользователей других баз.10 до 25 соединений. При превышении этого лимита кластер автоматически запустит дополнительный процесс rphost.exe.Для предотвращения падения всего процесса из-за одного неоптимального запроса (например, когда бухгалтер пытается построить ОСВ по счету 41 за 3 года без отборов), настроим лимиты вызовов:
1073741824 (1 ГБ). Если серверный вызов попытается потребовать больше памяти, этот конкретный вызов будет принудительно завершен системой с выдачей предупреждения пользователю, но сам процесс rphost.exe продолжит функционировать, и сеансы остальных сотрудников не пострадают.Если СУБД PostgreSQL и сервер «1С:Предприятие» развернуты на одном физическом или виртуальном сервере, они начинают жестко конкурировать за доступную оперативную память. При нехватке физической памяти операционная система Windows начинает активно сбрасывать данные процессов rphost.exe в файл подкачки (swapping) на жестком диске. Скорость работы падает в сотни раз, сессии пользователей зависают, удерживая занятые структуры данных в памяти еще дольше, что ускоряет аварийное завершение процесса.
Проанализируем конфигурационный файл postgresql.conf СУБД PostgreSQL и скорректируем основные параметры выделения памяти, чтобы СУБД не забирала все доступные ресурсы сервера:
# Ограничиваем объем общей памяти, используемой PostgreSQL для кэширования данных
shared_buffers = 2048MB # Задайте значение в пределах 25% от общего объема ОЗУ сервера
# Задаем объем памяти для индивидуальных операций сортировки и группировки
work_mem = 64MB # Слишком большое значение при множестве подключений быстро исчерпает ОЗУ
# Объем памяти для обслуживания временных таблиц в рамках одной сессии
temp_buffers = 32MB
Описанные выше настройки кластера и СУБД являются временными паллиативными мерами, позволяющими лишь отсрочить падение серверов. Единственным полноценным и технически обоснованным решением является переход на 64-разрядный сервер приложений «1С:Предприятие».
Переход на 64-битную архитектуру дает ключевые преимущества:
rphost.exe получает возможность использовать практически неограниченный объем оперативной памяти, выделяемый операционной системой (вплоть до физического предела установленной планки памяти на сервере).Для миграции вам потребуется приобрести лицензию на 64-битный сервер «1С:Предприятия» (если у вас используется программная защита или USB-ключ соответствующего номинала), деинсталлировать 32-битную версию сервера приложений и установить аналогичный по релизу 64-битный дистрибутив платформы, после чего восстановить запуск службы сервера.