При активной разработке или поддержке решений на базе 1С:Предприятие 8.3, использующих HTTP-сервисы или Web-сервисы, специалисты часто сталкиваются со странным поведением конфигуратора. В окне «Доступные предметы отладки» может отображаться огромное количество (иногда сотни или тысячи) сеансов веб-сервиса, в то время как консоль администрирования сервера 1С показывает, что активных соединений значительно меньше или их нет вовсе. Это создает неудобства при поиске нужного сеанса для подключения и вызывает вопросы о потреблении ресурсов сервера.
Разберем детально причины возникновения этой ситуации, проанализируем механизмы работы платформы и рассмотрим способы решения проблемы, от радикальных до тонкой настройки системы.
Выясним, почему сеансы «зависают» именно в отладке. Основная причина кроется в механизме пула соединений (Session Pooling), который реализован на стороне веб-сервера (IIS или Apache) с помощью модуля расширения 1С. Когда внешний потребитель обращается к веб-сервису, платформа создает сеанс. После того как ответ сформирован и передан клиенту, сеанс не завершается немедленно, если в настройках публикации указано разрешение на повторное использование.
Проанализируем логику работы системы в этот момент:
Рассмотрим ситуацию с параметром reuseSessions. Если он установлен в значение autouse, платформа старается максимально эффективно использовать созданные ранее сеансы, чтобы не тратить время на авторизацию и инициализацию параметров при каждом запросе. Именно это и приводит к «раздуванию» списка предметов отладки.
Рассмотрим самый быстрый способ избавиться от фантомных сеансов, который упоминается в обсуждении коллегами. Этот метод заключается в изменении конфигурационного файла публикации default.vrd.
Найдем в каталоге публикации вашего веб-сервиса файл default.vrd и отредактируем его. Нам необходимо найти атрибут reuseSessions и изменить его значение. Посмотрим на пример конфигурации:
<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="/MyService"
ib="Srvr="MyServer";Ref="MyBase";">
<httpService name="Exchange" base="exchange" reuseSessions="dontuse" />
</point>
В данном примере мы изменили reuseSessions="autouse" на reuseSessions="dontuse". Разберем, что это дает:
dontuse каждый входящий HTTP-запрос будет создавать новый сеанс и гарантированно завершать его после выполнения кода.Важное замечание: Мы должны понимать, что использование dontuse в высоконагруженных системах (HighLoad) может привести к снижению производительности, так как накладные расходы на создание сеанса (чтение модуля сеанса, проверка прав) будут возникать при каждом вызове.
Если мы не хотим полностью отключать пул сеансов, чтобы не терять в производительности, нам следует ограничить время жизни «спящих» сеансов. Это делается через настройки параметров пула в том же файле default.vrd. Разберем, как добавить параметры управления временем жизни сеансов.
Добавим в структуру файла элемент pool с соответствующими атрибутами:
<point ... >
<pool size="10"
sessionMaxIdleTime="60"
sessionMaxAge="300" />
<httpService ... />
</point>
Проанализируем эти параметры подробнее:
size — ограничивает максимальное количество удерживаемых в пуле сеансов. Если мы установим небольшое значение, список в отладке не будет разрастаться бесконечно.sessionMaxIdleTime — это время (в секундах), по истечении которого неиспользуемый сеанс будет окончательно закрыт. Установив значение 60, мы добьемся того, что через минуту после последнего обращения «лишние» предметы отладки исчезнут сами.sessionMaxAge — предельное время жизни сеанса с момента создания. Помогает принудительно обновлять сеансы, предотвращая возможные утечки памяти в глобальных переменных модулей.Посмотрим на настройки самой информационной базы через консоль администрирования серверов 1С. Хотя коллеги в обсуждении отмечали, что это не всегда помогает мгновенно, эти параметры важны для общей гигиены сервера.
Рассмотрим параметры информационной базы:
Для целей отладки веб-сервисов рекомендуется устанавливать эти значения в разумных пределах (например, 300–600 секунд), чтобы сервер не хранил «мусорные» сеансы часами. Для оперативного ручного мониторинга и сброса зависших подключений можно использовать веб-приложение для управления сеансами сервера 1С.
Выясним еще одну важную деталь. Список предметов отладки заполняется только в том случае, если в публикации default.vrd включен режим отладки. Если на конкретном инстансе веб-сервера (например, на рабочем сервере) отладка в данный момент не требуется, ее стоит выключить.
Проверим наличие строки:
<debug enable="true" ... />
Если изменить enable="true" на enable="false", веб-сервер перестанет регистрировать сеансы в менеджере отладки, и список предметов отладки всегда будет чистым. Это лучшее решение для продуктовых сред, где отладка «на лету» не требуется.
Мы проанализировали проблему зависших веб-сеансов и нашли несколько путей решения. Подведем итоги нашей совместной работы:
reuseSessions="dontuse" или установка короткого sessionMaxIdleTime (например, 30 секунд) в файле default.vrd. Это обеспечит актуальность списка предметов отладки.autouse, но жестко лимитировать размер пула (параметр size) и время жизни сеансов, чтобы избежать дефицита лицензий и перерасхода памяти.8.3.20+, механизмы очистки пула работают более стабильно, и проблема «вечного залипания» сеансов встречается реже.После внесения любых изменений в файл default.vrd не забывайте перезапускать веб-сервер (IIS или Apache), чтобы новые настройки вступили в силу.