При активной работе пользователей в клиент-серверном варианте базы данных 1С:Предприятие периодически может возникать внезапное аварийное завершение работы системы с критической ошибкой: «Неспецифицированная ошибка работы с ресурсом. Ошибка при выполнении запроса GET к ресурсу /e1cib/cmi/commands: Недостаточно свободной памяти для выполнения операции». Данная ситуация часто ставит в тупик системных администраторов, поскольку на самом сервере может быть установлено огромное количество физической оперативной памяти (например, 64 ГБ или 128 ГБ), большая часть которой остается абсолютно свободной.
В этой статье мы подробно разберем природу возникновения данной ошибки, проанализируем архитектурные ограничения 32-разрядных систем, рассмотрим влияние веб-серверов, задокументированные баги платформы и предложим пошаговые методы устранения этой проблемы как на стороне сервера, так и на стороне клиентских рабочих станций.
Для того чтобы понять суть проблемы, нам необходимо углубиться в особенности адресации памяти операционной системой Windows. Любое запущенное приложение в Windows выполняется в рамках собственного виртуального адресного пространства. Размер этого пространства жестко ограничен разрядностью процесса:
Когда вы видите ошибку Недостаточно свободной памяти для выполнения операции при обращении к ресурсу /e1cib/cmi/commands, это означает, что один из рабочих процессов (это может быть процесс сервера 1С rphost.exe, процесс веб-сервера Apache httpd.exe, пул приложений IIS w3wp.exe или сам исполняемый файл тонкого/толстого клиента 1С) исчерпал выделенный ему лимит в 2 ГБ виртуального адресного пространства. Процесс больше не может выделить непрерывный блок памяти под новые объекты, из-за чего происходит аварийный сбой.
Ресурс /e1cib/cmi/commands отвечает за построение командного интерфейса управляемых форм. Когда конфигурация 1С является «тяжелой» (например, 1С:ERP, 1С:Комплексная автоматизация или 1С:Управление торговлей), дерево метаданных и командный интерфейс разрастаются до колоссальных размеров. При входе пользователя или открытии сложных разделов система пытается скомпилировать этот интерфейс в памяти, что и приводит к моментальному перерасходу адресного пространства.
Это самая распространенная причина сбоя. Если на вашем сервере установлен 32-разрядный сервер 1С:Предприятие, рабочий процесс rphost.exe неизбежно будет падать при достижении планки потребления памяти около 1.6–1.8 ГБ.
Проанализируем ситуацию и выполним переход на 64-разрядную версию сервера:
rphost.exe, rmngr.exe и ragent.exe отображается пометка *32 или 32-разрядный, то сервер однозначно работает в 32-битном режиме.Сервер 1С:Предприятия (64-bit).После перехода на 64-разрядную версию сервера процессы rphost.exe смогут использовать всю доступную физическую память сервера, и ошибка полностью исчезнет.
Очень часто информационные базы 1С публикуются на веб-сервере для работы пользователей через веб-браузеры или тонкие клиенты по протоколам HTTP/HTTPS. В этом случае узким местом становится рабочий процесс веб-сервера.
Рассмотрим особенности настройки для каждого веб-сервера отдельно:
Для веб-сервера Apache:
Если используется 32-разрядная версия Apache, его рабочий процесс httpd.exe будет падать с ошибкой child process exited with status 255 -- Restarting в логах Apache, а пользователь увидит в 1С ошибку работы с ресурсом. Чтобы исправить это:
webinst, указав путь к новым 64-разрядным библиотекам расширения веб-сервера (модуль wsap24.dll из каталога bin 64-разрядной платформы 1С).Для веб-сервера IIS (Internet Information Services):
При использовании IIS ошибка возникает, если для пула приложений разрешена работа 32-разрядных приложений или установлены жесткие ограничения по памяти. Помогает следующая настройка:
Пулы приложений (Application Pools).DefaultAppPool).Дополнительные параметры (Advanced Settings).Разрешены 32-разрядные приложения (Enable 32-Bit Applications) установлен в значение False.Предельные значения виртуальной памяти (Virtual Memory Limit) и Предельные значения частной памяти (Private Memory Limit). Установите эти значения в 0 (без ограничений), чтобы пул не перезапускался принудительно при росте потребления ресурсов.Выясним причину сбоев, связанную с ошибками в коде самой платформы. Разработчики фирмы «1С» официально признали наличие критических утечек памяти при работе с внутренними ресурсами платформы, такими как /e1cib/logForm и /e1cib/cmi/commands. Данные ошибки активно проявлялись в ветках платформы 8.3.15, 8.3.16, 8.3.17 и 8.3.18.
Для исправления этой проблемы:
Даже если на сервере развернута полноценная 64-разрядная инфраструктура, на компьютерах пользователей может быть по умолчанию установлен 32-разрядный клиент 1С:Предприятие. При работе с тяжелыми управляемыми интерфейсами ERP-систем локальный 32-битный процесс 1cv8c.exe падает из-за превышения собственного лимита виртуальной памяти на компьютере пользователя.
Выполним следующие действия для исправления:
Разрядность принудительно выберите значение 64 (x64) вместо значения Выбирать автоматически или 32 (x86).Влияние журнала регистрации на стабильность работы сервера 1С часто недооценивают. Если база данных существует давно, файлы журнала регистрации в старом текстовом формате (файлы с расширением .lgf) могут разрастаться до десятков и сотен гигабайт. При формировании отчетов, анализе прав или попытках логирования операций платформа считывает огромные фрагменты журнала регистрации непосредственно в оперативную память процесса rphost.exe или rmngr.exe. Это вызывает моментальное исчерпание адресного пространства.
Рекомендуем выполнить оптимизацию журнала регистрации по следующим шагам:
Конфигуратор под учетной записью администратора.Администрирование — Настройка журнала регистрации.Сократить и укажите дату, до которой записи журнала будут удалены (рекомендуется перенести старые записи в отдельный файл-архив)..lgp). Это можно сделать там же, в настройках журнала регистрации, выбрав новый формат хранения. SQLite-формат гораздо эффективнее работает с памятью и не загружает весь объем данных целиком.Если по техническим или организационным причинам вы не можете оперативно перейти на 64-разрядную платформу (например, сервер работает под управлением устаревшей 32-битной ОС Windows Server), можно применить временное обходное решение — увеличить лимит виртуальной памяти для пользовательских процессов с 2 ГБ до 3 ГБ.
Разберем по шагам, как это сделать:
Пуск, найдите Командная строка (cmd), нажмите правой кнопкой мыши и выберите Запуск от имени Администратора.
bcdedit /set increaseuserva 3072
Если вы хотите оставить больше памяти для нужд ядра самой операционной системы, можно задать более безопасный лимит в 2.5 ГБ:
bcdedit /set increaseuserva 2560
Важное предупреждение: этот метод является временным костылем. Увеличение лимита для пользовательских процессов уменьшает адресное пространство, доступное для ядра операционной системы и драйверов устройств. Это может привести к нестабильной работе самой ОС Windows или сетевых адаптеров при высоких нагрузках.
Иногда сбой при обработке запроса /e1cib/cmi/commands может быть вызван не реальной нехваткой памяти, а повреждением кэша метаданных или логическими ошибками в структуре таблиц базы данных в СУБД (MS SQL Server, PostgreSQL).
Проанализируем и устраним данные проблемы:
C:\Program Files\1cv8\srvinfo\reg_1541) и удалите все папки со сложными буквенно-цифровыми именами (UID баз), за исключением конфигурационных файлов. Запустите службу сервера заново.%userprofile%\AppData\Local\1C\1cv8 и %userprofile%\AppData\Roaming\1C\1cv8.Конфигуратор. Перейдите в меню Администрирование — Тестирование и исправление. Установите флажки напротив пунктов:
Выполнить. Особое внимание система уделит таблице config, повреждение которой часто вызывает аномальное потребление памяти при чтении конфигурации.Применяя данные подходы последовательно, мы сможем гарантированно избавиться от ошибки работы с ресурсом, повысить стабильность работы всей корпоративной системы на базе 1С:Предприятие и обеспечить бесперебойную работу пользователей.