В практике системного администрирования 1С одна из самых неприятных ситуаций — случайные «вылеты» пользователей с ошибкой «Ошибка СУБД: Ошибка выделения памяти HRESULT=80004005». Особенно часто это проявляется на серверах, где до сих пор используется 32-битная версия службы 1С:Предприятие. В данной статье мы подробно разберем, почему возникает эта проблема, как на нее влияют действия программистов и какие шаги необходимо предпринять для стабилизации работы системы, предварительно выполнив замер производительности и поиск узких мест.
Проанализируем техническую сторону вопроса. Главная проблема 32-битного процесса rphost.exe заключается в ограничении адресного пространства. В 32-битной архитектуре Windows один процесс может адресовать не более 2 ГБ (в редких случаях до 3 ГБ при использовании ключа /3GB, что не рекомендуется для стабильной работы 1С).
Рассмотрим ситуацию, когда на сервере установлена современная платформа (например, 8.3.25) и «тяжелые» конфигурации вроде 1С:Комплексная автоматизация или 1С:Бухгалтерия предприятия. Новые версии платформы потребляют значительно больше памяти для хранения кэша метаданных, индексов полнотекстового поиска и расширений, для управления которым может потребоваться автоматическая очистка серверного кэша. Как только потребление виртуальной памяти процессом rphost.exe приближается к отметке 2.5–3 ГБ, возникает фрагментация адресного пространства. Система не может найти непрерывный участок памяти для выполнения очередной операции, и выдает ошибку HRESULT=80004005.
Выясним, почему включенный режим отладки (-debug) на рабочем сервере может стать «миной замедленного действия». Рассмотрим механизмы, которые запускаются при отладке:
Рекомендация: Никогда не оставляйте отладку включенной на постоянной основе на «проде». Если она необходима для поиска ошибки, включайте её временно и обязательно используйте протокол HTTP (ключ -http), который работает стабильнее.
Посмотрим на процесс динамического обновления изнутри. Когда программист вносит изменения и нажимает «Обновить конфигурацию базы данных», сервер 1С не подменяет старую конфигурацию новой мгновенно. Вместо этого в памяти rphost создается вторая копия метаданных.
Если в базе работают пользователи, они продолжают использовать «старую» версию. Новые подключения получают «новую». В памяти висят обе. Если выполнить динамическое обновление трижды за час, в памяти может оказаться три-четыре версии метаданных. Для тяжелой конфигурации типа «КА 1.1», где метаданные занимают сотни мегабайт, это мгновенно приводит к переполнению памяти 32-битного процесса.
Это самое эффективное и радикальное решение. 64-битный процесс rphost практически не ограничен в объеме используемой оперативной памяти (лимит измеряется терабайтами). Рассмотрим преимущества:
Если переход на x64 откладывается, попробуем настроить кластер 1С для минимизации последствий. В консоли администрирования серверов 1С (для версии ПРОФ) мы можем изменить следующие параметры:
rphost. Если один процесс «упадет» по памяти, это затронет только часть пользователей, а не всех сразу.Иногда ошибка выделения памяти связана с механизмом Shared Memory, который используется, если SQL и 1С стоят на одном сервере. Рассмотрим, как принудительно перевести систему на TCP/IP:
Проанализируем строку соединения или настройки в SQL Server Configuration Manager. Нужно убедиться, что протокол TCP/IP включен, а в настройках базы данных в консоли 1С указано имя сервера в формате tcp:ServerName или просто IP-адрес. Это изолирует адресные пространства процессов и может убрать ошибку 80004005. Кроме того, важно убедиться в корректности регламентных операций СУБД, для чего пригодится инструкция по настройке MS SQL SERVER,
Совместно с программистом внедрим правила работы:
Для автоматизации контроля за состоянием процессов можно использовать параметры кластера. Рассмотрим, какие значения стоит выставить в консоли администрирования:
Допустимый объем памяти: 2500000 (КБ)
Интервал превышения допустимого объема памяти: 300 (сек)
Выключать работающие процессы: Да
Интервал перезапуска процессов: 86400 (сек)
Подведем итог: Ошибка HRESULT=80004005 на 32-битной платформе — это всегда сигнал о нехватке «жизненного пространства» для процесса. Сочетание перехода на 64-битную архитектуру и отказ от небезопасных методов обновления (динамическое обновление) — единственный надежный способ обеспечить бесперебойную работу пользователей в современных конфигурациях 1С.