При публикации информационных баз 1С:Предприятие на веб-сервере Internet Information Services (IIS) системные администраторы часто сталкиваются с крайне неприятной проблемой. В процессе работы пользователей (даже если их всего три человека, как в рассматриваемом случае) веб-клиент внезапно аварийно завершает работу, выдавая ошибку вида: «Неспецифицированная ошибка работы с ресурсом. Ошибка при выполнении запроса GET к ресурсу /e1cib/cmi/commands: Недостаточно свободной памяти для выполнения операции». При этом физической оперативной памяти на самом сервере может быть более чем достаточно — свободными могут оставаться десятки гигабайт.
В этой статье мы подробно разберем, почему возникает данная ошибка, проанализируем внутренние механизмы распределения памяти в Windows и IIS, а также пошагово рассмотрим все возможные способы решения этой проблемы — от быстрой настройки пулов до кардинального перехода на более современные архитектурные решения.
Главный парадокс этой ошибки заключается в несовпадении физических ресурсов сервера и виртуальных лимитов конкретного процесса. Давайте разберем эту ситуацию по шагам.
Когда вы публикуете базу данных 1С на IIS, запросы от веб-клиентов обрабатываются рабочим процессом веб-сервера, который называется w3wp.exe. Если при установке платформы 1С или настройке IIS была выбрана 32-разрядная (x32/x86) архитектура, рабочий процесс w3wp.exe запускается в 32-битном режиме.
В архитектуре операционных систем Windows для любого 32-разрядного процесса по умолчанию выделяется строго ограниченное виртуальное адресное пространство — не более 2 Гб. Каким бы мощным ни был ваш сервер (пусть на нем будет хоть 128 Гб ОЗУ), процесс w3wp.exe физически не сможет адресовать более 2 Гб памяти. Как только объем данных, необходимых для построения интерфейса (запрос /e1cib/cmi/commands отвечает за формирование командной панели), кэширования метаданных или обработки тяжелых отчетов приближается к этой границе, операционная система отказывает процессу в выделении новых блоков памяти. Веб-сервер падает или выдает пользователю сообщение об ошибке.
Ниже представлены проверенные и эффективные методы борьбы с этой проблемой.
Это самый надежный, правильный и стратегически верный способ навсегда избавиться от лимита в 2 Гб. В 64-битной архитектуре адресное пространство процесса практически не ограничено текущими физическими возможностями оборудования, что полностью исключает подобные сбои памяти.
Выполним переход по шагам:
wsapising.dll из каталога bin 64-битной платформы).DefaultAppPool).Обратите внимание: Переход на x64 может быть временно затруднен, если ваша конфигурация 1С использует старое торговое оборудование (онлайн-кассы, сканеры штрихкодов), чьи драйверы существуют только в 32-битном исполнении. В таком случае рассмотрите следующие варианты настройки.
Если на сервере опубликовано несколько баз (как у автора темы), и все они работают в одном стандартном пуле приложений DefaultAppPool, то все они делят между собой один и тот же процесс w3wp.exe. Соответственно, лимит в 2 Гб тратится одновременно на все базы. Если одна база начинает активно потреблять ресурсы, «страдают» и вылетают пользователи всех остальных баз.
Рассмотрим, как изолировать базы друг от друга:
Pool_Buh_Kassa), выберите версию .NET Framework (обычно «Без управляемого кода») и нажмите ОК. Повторите процедуру для каждой базы.Теперь каждая база будет запускаться в своем собственном изолированном процессе w3wp.exe, и лимит памяти у каждого процесса будет индивидуальным.
Если вам приходится оставаться на 32-битной версии платформы, можно заставить веб-сервер IIS автоматически и незаметно для пользователей очищать занятую память до того, как процесс достигнет критического лимита в 2 Гб и аварийно завершится.
Для этого настроим рециклинг пула приложений:
1300000 КБ (примерно 1.3 Гб).1500000 КБ.Как только объем памяти, занятый процессом, приблизится к указанному порогу, IIS автоматически создаст новый рабочий процесс для обработки новых запросов, а старый процесс плавно закроет после завершения текущих активных запросов. Для пользователей это произойдет практически незаметно, а заблокированная память успешно вернется в систему.
Для 32-битных операционных систем Windows или при работе 32-битных процессов в 64-битной среде Windows Server по умолчанию действует ограничение на 2 Гб пользовательского адресного пространства. Однако мы можем расширить этот лимит до 3 Гб на уровне конфигурации загрузки Windows.
Выполним процедуру изменения настроек загрузчика ОС:
bcdedit /set increaseuserva 3072
Эта директива перераспределяет виртуальную память ядра и пользовательских процессов, выделяя под нужды запущенных программ (включая наш w3wp.exe) до 3 Гб виртуального адресного пространства, что дает солидный запас стабильности.
Иногда ошибка выделения памяти при запросе к /e1cib/cmi/commands вообще не связана с реальными утечками в кодовой базе. В линейках платформы 1С 8.3.16 (с релиза 8.3.16.1791), 8.3.17 (с релиза 8.3.17.1823) и 8.3.18 (с релиза 8.3.18.1201) присутствовал зарегистрированный баг утечки и неверной адресации памяти веб-клиента при обработке метаданных.
Решение: Проверьте версию установленной у вас платформы. Если вы работаете на проблемных релизах, обязательно обновите платформу 1С на сервере до актуальных стабильных релизов (баг был официально исправлен в релизах 8.3.17.2231, 8.3.18.1483 и последующих более современных версиях).
Веб-сервер IIS чувствителен к стабильности передачи сетевых пакетов. Иногда кратковременный сетевой сбой интерпретируется платформой 1С как ошибка памяти из-за невозможности корректно завершить транзакцию данных. Проанализируем сетевые настройки сервера:
Large Send Offload (IPv4). При высокой интенсивности запросов к IIS данная технология может вызывать микросекундные задержки пакетов, приводящие к сбросу сессий 1С.C:\Windows\Temp и кэш IIS.Если на вашем сервере работает всего три компьютера (как у автора вопроса), вам совсем не обязательно разворачивать сложную связку из тяжелого веб-сервера IIS и полноценного сервера 1С:Предприятие, требующих дорогостоящих серверных лицензий.
Начиная с версии платформы 8.3.18, в комплекте поставки доступен Автономный сервер 1С. Он представляет собой легковесную службу, которая умеет самостоятельно запускать файловые базы данных, публиковать их по протоколам HTTP/HTTPS без использования сторонних веб-серверов (таких как IIS или Apache) и поддерживает до трех одновременных подключений совершенно бесплатно без необходимости покупки клиент-серверных лицензий 1С. Использование автономного сервера избавляет администратора от необходимости тонкой настройки пулов IIS и проблем с распределением памяти сторонних рабочих процессов.