При использовании сервиса 1С:Линк для удаленного доступа к информационным базам системные администраторы часто сталкиваются с ситуацией, когда процесс веб-сервера httpd.exe (Apache) потребляет значительный объем оперативной памяти. Самое неприятное в этой ситуации — память не высвобождается мгновенно после того, как пользователь закрывает окно браузера или тонкий клиент. В этой статье мы подробно разберем, почему это происходит, как работают механизмы управления сессиями в 1С и какие настройки помогут оптимизировать использование ресурсов сервера.
Первым делом проанализируем поведение системы. Проблема «раздувания» процесса Apache часто связана не с утечкой памяти в чистом виде, а со спецификой работы платформы 1С:Предприятие. Когда пользователь подключается к базе через веб-сервер, платформа создает сеанс. Даже если связь обрывается или пользователь закрывает вкладку, сервер не может мгновенно «убить» этот сеанс, так как он должен зарезервировать время на случай кратковременных сбоев сети или случайного закрытия программы.
Рассмотрим стандартные временные интервалы. По умолчанию в платформе 1С установлен таймаут сессии около 20–25 минут. В течение этого времени процесс httpd.exe будет удерживать в оперативной памяти все объекты, кэши и метаданные, которые были загружены для работы конкретного пользователя. Как только это время истекает, система автоматически закрывает «спящий» сеанс, и только тогда httpd.exe получает команду на освобождение ресурсов.
Если мы хотим, чтобы память высвобождалась быстрее, нам необходимо отредактировать параметры публикации информационной базы. Разберем по шагам, как это сделать через файл default.vrd.
Файл default.vrd находится в каталоге, куда была выполнена публикация (обычно это подпапка внутри C:\inetpub\wwwroot\ или аналогичная папка в каталоге Apache). Нам необходимо найти и изменить параметр sessionTimeout. Этот параметр определяет время бездействия в секундах, по истечении которого сеанс считается завершенным.
Рассмотрим пример структуры файла default.vrd с установленным коротким таймаутом:
<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/YourBaseName"
ib="Srvr="ServerName";Ref="BaseName";">
<standardOdata enable="false"
publishRootReadOnly="false"
setFullTextSearchIndex="false"/>
<!-- Устанавливаем таймаут в 300 секунд (5 минут) -->
<point sessionTimeout="300"/>
</point>
Установив значение sessionTimeout, например, в 300 (5 минут), мы заставим сервер быстрее закрывать неактивные подключения. Однако будьте осторожны: если пользователь отвлечется на телефонный звонок более чем на 5 минут, его сессия будет прервана, и ему придется авторизоваться заново.
Проанализируем работу самого веб-сервера. Apache спроектирован так, чтобы максимально быстро обрабатывать входящие запросы. Для этого он использует пул рабочих процессов. Когда оперативная память выделяется рабочему процессу под нужды 1С, менеджер памяти Apache может не возвращать её операционной системе даже после завершения сессии, оставляя её «про запас» для будущих запросов. Это нормальное поведение для высоконагруженных систем, но на клиентских машинах с ограниченным объемом ОЗУ это создает проблемы.
Чтобы заставить Apache периодически «обнулять» свою память, мы можем воспользоваться директивой MaxConnectionsPerChild в конфигурационном файле httpd.conf. Эта настройка ограничивает количество запросов, которое может обработать один дочерний процесс, прежде чем он будет принудительно перезапущен.
Выясним, как это настроить:
httpd.conf).<IfModule mpm_winnt_module>).MaxConnectionsPerChild. Например, значение 1000 заставит процесс перезагрузиться после обработки тысячи запросов, что полностью очистит занятую им память.Пример настройки:
<IfModule mpm_winnt_module>
ThreadsPerChild 150
MaxConnectionsPerChild 1000
</IfModule>
Важно обратить внимание на разрядность используемого ПО. В исходных данных указано использование версии 1С 8.3.14.1854 x86. Использование 32-битной (x86) версии на 64-битной операционной системе Windows 10 накладывает серьезные ограничения. Один процесс httpd.exe в 32-битном режиме не может адресовать более 2–4 ГБ оперативной памяти.
В условиях фрагментации памяти, которая неизбежна при работе веб-сервисов 1С, процесс может начать выдавать ошибки «Нехватка памяти» задолго до того, как физическая память на сервере закончится. Настоятельно рекомендуем рассмотреть переход на 64-битную версию платформы 1С и соответствующую сборку Apache. Это позволит серверу работать с гораздо большими объемами данных и более эффективно управлять адресным пространством.
Рассмотрим ситуацию с точки зрения версий ПО. Релиз платформы 8.3.14 на сегодняшний день является устаревшим. В истории развития 1С были зафиксированы случаи, когда модуль расширения веб-сервера (файл wsap24.dll) некорректно очищал кэш метаданных. Это приводило к тому, что при каждом новом подключении объем занимаемой памяти неуклонно рос.
В более новых ветках платформы (например, 8.3.17, 8.3.22 и выше) разработчики 1С внесли множество исправлений в механизмы работы веб-клиента. В частности, была оптимизирована очистка временных хранилищ и работа с COM-объектами внутри сессии веб-сервера.
Подведем итоги нашего исследования. Если вы столкнулись с «зависанием» памяти в 1С:Линк, выполните следующие действия:
sessionTimeout в файле default.vrd.Таким образом, комбинирование правильной настройки таймаутов в default.vrd и периодического обновления рабочих процессов Apache позволит поддерживать потребление ресурсов сервера в разумных пределах.