Почему в списке предметов отладки отображаются фантомные веб-сеансы и как их очистить?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием IT и автоматизация бизнеса
← На главную

При активной разработке или поддержке решений на базе 1С:Предприятие 8.3, использующих HTTP-сервисы или Web-сервисы, специалисты часто сталкиваются со странным поведением конфигуратора. В окне «Доступные предметы отладки» может отображаться огромное количество (иногда сотни или тысячи) сеансов веб-сервиса, в то время как консоль администрирования сервера 1С показывает, что активных соединений значительно меньше или их нет вовсе. Это создает неудобства при поиске нужного сеанса для подключения и вызывает вопросы о потреблении ресурсов сервера.

Разберем детально причины возникновения этой ситуации, проанализируем механизмы работы платформы и рассмотрим способы решения проблемы, от радикальных до тонкой настройки системы.

Анализ причины: механизм Session Pooling

Выясним, почему сеансы «зависают» именно в отладке. Основная причина кроется в механизме пула соединений (Session Pooling), который реализован на стороне веб-сервера (IIS или Apache) с помощью модуля расширения 1С. Когда внешний потребитель обращается к веб-сервису, платформа создает сеанс. После того как ответ сформирован и передан клиенту, сеанс не завершается немедленно, если в настройках публикации указано разрешение на повторное использование.

Проанализируем логику работы системы в этот момент:

  1. Сеанс помечается как свободный и помещается в пул.
  2. В консоли сервера 1С такой сеанс может пропасть из списка активных (или перейти в состояние сна), так как он больше не исполняет программный код.
  3. Однако менеджер отладки продолжает видеть это соединение. Поскольку сеанс физически не убит (он ждет нового запроса в пуле), он остается в списке предметов отладки как потенциальный объект для подключения отладчика.

Рассмотрим ситуацию с параметром reuseSessions. Если он установлен в значение autouse, платформа старается максимально эффективно использовать созданные ранее сеансы, чтобы не тратить время на авторизацию и инициализацию параметров при каждом запросе. Именно это и приводит к «раздуванию» списка предметов отладки.

Способ 1: Отключение повторного использования сеансов

Рассмотрим самый быстрый способ избавиться от фантомных сеансов, который упоминается в обсуждении коллегами. Этот метод заключается в изменении конфигурационного файла публикации 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 в высоконагруженных системах (HighLoad) может привести к снижению производительности, так как накладные расходы на создание сеанса (чтение модуля сеанса, проверка прав) будут возникать при каждом вызове.

Способ 2: Тонкая настройка пула соединений

Если мы не хотим полностью отключать пул сеансов, чтобы не терять в производительности, нам следует ограничить время жизни «спящих» сеансов. Это делается через настройки параметров пула в том же файле default.vrd. Разберем, как добавить параметры управления временем жизни сеансов.

Добавим в структуру файла элемент pool с соответствующими атрибутами:


<point ... >
    <pool size="10" 
          sessionMaxIdleTime="60" 
          sessionMaxAge="300" />
    <httpService ... />
</point>

Проанализируем эти параметры подробнее:

  1. size — ограничивает максимальное количество удерживаемых в пуле сеансов. Если мы установим небольшое значение, список в отладке не будет разрастаться бесконечно.
  2. sessionMaxIdleTime — это время (в секундах), по истечении которого неиспользуемый сеанс будет окончательно закрыт. Установив значение 60, мы добьемся того, что через минуту после последнего обращения «лишние» предметы отладки исчезнут сами.
  3. sessionMaxAge — предельное время жизни сеанса с момента создания. Помогает принудительно обновлять сеансы, предотвращая возможные утечки памяти в глобальных переменных модулей.

Способ 3: Настройка параметров засыпания на сервере 1С

Посмотрим на настройки самой информационной базы через консоль администрирования серверов 1С. Хотя коллеги в обсуждении отмечали, что это не всегда помогает мгновенно, эти параметры важны для общей гигиены сервера.

Рассмотрим параметры информационной базы:

Для целей отладки веб-сервисов рекомендуется устанавливать эти значения в разумных пределах (например, 300–600 секунд), чтобы сервер не хранил «мусорные» сеансы часами. Для оперативного ручного мониторинга и сброса зависших подключений можно использовать веб-приложение для управления сеансами сервера 1С.

Способ 4: Управление режимом отладки на веб-сервере

Выясним еще одну важную деталь. Список предметов отладки заполняется только в том случае, если в публикации default.vrd включен режим отладки. Если на конкретном инстансе веб-сервера (например, на рабочем сервере) отладка в данный момент не требуется, ее стоит выключить.

Проверим наличие строки:

<debug enable="true" ... />

Если изменить enable="true" на enable="false", веб-сервер перестанет регистрировать сеансы в менеджере отладки, и список предметов отладки всегда будет чистым. Это лучшее решение для продуктовых сред, где отладка «на лету» не требуется.

Итоги и рекомендации

Мы проанализировали проблему зависших веб-сеансов и нашли несколько путей решения. Подведем итоги нашей совместной работы:

После внесения любых изменений в файл default.vrd не забывайте перезапускать веб-сервер (IIS или Apache), чтобы новые настройки вступили в силу.

← На главную