Переход на новые версии платформы 1С:Предприятие часто преподносит системным администраторам и программистам неожиданные сюрпризы. Одним из наиболее резонансных изменений в ветке 8.3.15 стал перенос механизмов контроля памяти из стандартных настроек лицензий уровня ПРОФ в дорогостоящие лицензии уровня КОРП. В результате владельцы 32-разрядных серверов 1С столкнулись с регулярными аварийными завершениями процессов rphost.exe без их штатного перезапуска. В этой статье мы подробно разберем, почему возникает эта проблема, как устроена новая система ограничений памяти, и какими способами можно вернуть стабильность работы сервера.
Для начала проанализируем архитектурные ограничения 32-разрядных систем. Любой 32-битный процесс в операционной системе Windows (включая рабочий процесс сервера 1С — rphost.exe) имеет жесткий лимит на адресацию виртуальной памяти. Теоретический предел составляет 4 ГБ, однако на практике из-за фрагментации памяти и резервирования адресов под нужды операционной системы процесс rphost.exe аварийно завершается при достижении объема 3.2 – 3.5 ГБ с ошибкой выделения памяти (Out of Memory).
В версиях платформы до 8.3.15 администраторы успешно боролись с этой проблемой с помощью параметра «Допустимый объем памяти рабочих процессов» в консоли администрирования кластера. Достаточно было указать лимит (например, 2.5 ГБ), и как только процесс превышал этот порог, кластер 1С мягко запускал резервный процесс, переносил туда пользовательские сеансы и завершал старый переполненный rphost.exe.
Начиная с версии 8.3.15, разработчики «1С» кардинально изменили этот механизм:
Для пользователей ПРОФ-лицензий платформа по умолчанию установила жесткий лимит «Временно допустимого объема памяти» на уровне 80% от общего объема физической оперативной памяти (ОЗУ) сервера. Здесь и кроется главная ловушка для 32-битных систем. Если на физическом сервере установлено, к примеру, 16 ГБ или 32 ГБ оперативной памяти, то 80% составят 12.8 ГБ или 25.6 ГБ соответственно. Очевидно, что один 32-разрядный процесс rphost.exe физически не способен вырасти до таких объемов — он упадет от нехватки адресного пространства при достижении 3.5 ГБ. Поскольку лимит в 80% ОЗУ сервера никогда не достигается, кластер 1С считает ситуацию штатной и не предпринимает никаких попыток перезапустить процесс. Пользователи при этом получают аварийный разрыв соединений и потерю несохраненных данных.
Под давлением сообщества разработчиков и системных администраторов фирма «1С» признала данное поведение платформы недоработкой и вернула управление лимитами памяти в лицензии ПРОФ. Рассмотрим, как правильно настроить кластер на исправленных релизах платформы (начиная с 8.3.15.1700, а также в последующих ветках 8.3.17, 8.3.18 и новее).
Разберем по шагам процесс настройки безопасных лимитов для 32-битного сервера:
localhost или имя вашего сервера).2147483648 (2 * 1024 * 1024 * 1024). Для лимита в 2.5 ГБ укажите: 2684354560.При такой конфигурации, как только один из процессов rphost.exe превысит заданный лимит памяти (например, 2 ГБ) и продержится в таком состоянии более указанного времени (например, 60 секунд), сервер 1С плавно переведет активных пользователей на новый запущенный рабочий процесс, а старый и переполненный будет штатно остановлен без потери сеансов.
Если у вас по каким-либо причинам нет возможности оперативно обновить платформу 1С до исправленных версий, можно прибегнуть к проверенному методу принудительного перезапуска процессов средствами операционной системы. Для этого мы настроим регулярный мониторинг и завершение «тяжелых» процессов rphost.exe.
Рассмотрим вариант автоматизации с использованием сценария PowerShell. Этот скрипт будет находить все процессы rphost.exe, потребляющие память свыше установленного безопасного порога, и принудительно завершать их. Служба кластера 1С (rmngr.exe) автоматически обнаружит падение процесса и мгновенно запустит новый, восстановив пользовательские сеансы (в управляемом приложении этот процесс происходит практически незаметно для пользователей, вызывая лишь кратковременную задержку в 15-20 секунд).
Проанализируем код PowerShell-скрипта:
$MemoryLimitBytes = 2684354560 # Лимит памяти 2.5 ГБ в байтах
$Processes = Get-Process -Name "rphost" -ErrorAction SilentlyContinue
foreach ($Process in $Processes) {
# Получаем объем памяти, занимаемой процессом (WorkingSet)
$ProcessMemory = $Process.WorkingSet64
if ($ProcessMemory -gt $MemoryLimitBytes) {
$ProcessId = $Process.Id
Write-Host "Процесс rphost (PID: $ProcessId) превысил лимит: $ProcessMemory байт. Завершение процесса..."
Stop-Process -Id $ProcessId -Force
}
}
Чтобы автоматизировать выполнение этого сценария, выполните следующие действия:
.ps1 (например, C:\Scripts\Monitor1C.ps1).powershell.exe.-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\Monitor1C.ps1".Если вы предпочитаете использовать классические командные файлы Windows (батники), можно воспользоваться утилитой taskkill. Однако стоит учитывать, что стандартная команда taskkill /F /IM rphost.exe завершит абсолютно все запущенные рабочие процессы 1С, что приведет к одновременному выбросу всех пользователей из базы. Этот метод жестковат и подходит только для профилактического перезапуска сервера в ночное время. Пример классического ночного батника перезапуска службы:
net stop "1C:Enterprise 8.3 Server Agent"
timeout /t 10
taskkill /F /IM rphost.exe
taskkill /F /IM rmngr.exe
taskkill /F /IM ragent.exe
net start "1C:Enterprise 8.3 Server Agent"
Важно понимать, что использование 32-разрядных серверов 1С в современных реалиях — это временная мера, сопряженная с постоянными рисками нестабильности. Современные типовые конфигурации (такие как 1С:ERP, Комплексная автоматизация или Управление торговлей) разрабатываются под стандарты 64-битных систем. Выполнение одного тяжелого отчета или проведение сложного регламентного документа в многопользовательском режиме может мгновенно исчерпать доступные 3 ГБ памяти, что приведет к падению процесса даже при настроенных лимитах.
Кроме того, фирма «1С» активно сворачивает поддержку устаревших x86-технологий. Для долгосрочной и стабильной работы бизнеса настоятельно рекомендуется рассмотреть переход на полноценную 64-разрядную версию сервера 1С:Предприятия. Это избавит вас от необходимости конструировать «костыли» для контроля памяти и позволит серверу эффективно задействовать весь доступный объем оперативной памяти физического оборудования.