Почему резко растет количество соединений к SQL-серверу при работе через веб-сервер и как это исправить?

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

Ситуация, когда количество соединений с базой данных MSSQL начинает кратно превышать количество активных пользователей, является классической проблемой при использовании тонкого клиента через веб-сервер (IIS или Apache). В нормальных условиях на одного пользователя приходится 1–1.5 соединения, но в моменты сбоев это число может вырастать до 5 и более. Это приводит к деградации производительности, «подвисанию» консоли администрирования 1С и жалобам пользователей на «тупизну» системы. Рассмотрим подробно, почему это происходит и как стабилизировать работу сервера.

Проанализируем природу соединений модуля расширения веб-сервера

Когда пользователи подключаются к 1С через веб-публикацию, между клиентским приложением и SQL-сервером появляется посредник — модуль расширения веб-сервера. В консоли кластера 1С такие соединения помечаются соответствующей строкой. Особенность заключается в том, что веб-сервер использует пул соединений. Это механизм, при котором соединения с СУБД не разрываются сразу после завершения запроса пользователя, а сохраняются «про запас», чтобы следующий запрос не тратил время на установку новой сессии с SQL.

Проблема возникает, когда этот пул начинает бесконтрольно раздуваться. Выясним основные причины этого поведения:

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

Шаг 1: Настройка параметров информационной базы

Первым делом разберем настройки самой информационной базы. Часто стандартные значения не подходят для высоконагруженных систем. Перейдем в раздел Администрирование — Параметры информационной базы (в режиме «1С:Предприятие») или в свойства базы в консоли администрирования кластера.

Обратим внимание на следующие параметры:

Если эти значения слишком велики (например, по умолчанию может стоять час или более), сервер будет копить «мертвые» соединения от пользователей, которые просто закрыли ноутбук или ушли на обед, не выйдя из системы.

Шаг 2: Оптимизация файла публикации default.vrd

Файл default.vrd находится в каталоге публикации на веб-сервере (обычно это C:\inetpub\wwwroot\ИмяВашейБазы\). Именно в нем хранятся настройки взаимодействия модуля 1С с пулом соединений. Разберем, какие параметры нужно добавить или изменить внутри тега <point>.

Найдем или создадим секцию настроек пула. Пример структуры кода в default.vrd:


<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="/MyBase"
       ib="Srvr=&quot;MyServer&quot;;Ref=&quot;MyBase&quot;;">
    <httpServices>
        <service name="Mobile" rootUrl="mobile" enable="true" reuseSessions="autouse"/>
    </httpServices>
    <standardOdata enable="false" reuseSessions="autouse" />
    <pool size="10" timeout="60" lastAge="120" />
</point>

Проанализируем атрибуты тега pool:

Важно: После внесения изменений в default.vrd необходимо выполнить команду iisreset в командной строке от имени администратора, чтобы настройки вступили в силу.

Шаг 3: Настройка пула приложений в IIS

Ситуация, когда «консоль виснет намертво», часто указывает на то, что рабочий процесс IIS (w3wp.exe) потребляет слишком много ресурсов или блокирует потоки. Посмотрим на настройки Application Pool (Пула приложений), в котором работает ваша публикация.

Рассмотрим ключевые настройки в диспетчере служб IIS:

  1. Idle Time-out (Тайм-аут бездействия): По умолчанию стоит 20 минут. Если в это время никто не заходит в базу, процесс завершается. При появлении первого же пользователя процесс запускается снова, что может вызвать кратковременный всплеск соединений. На высоконагруженных серверах лучше установить это значение в 0 (бесконечность).
  2. Recycling (Рециклирование): Проверьте расписание перезапуска процесса. Если настроено рециклирование «по достижению объема виртуальной памяти», то при утечках в платформе процесс будет постоянно перезапускаться. В момент перезапуска старый процесс еще не закрыл SQL-соединения, а новый уже открывает свои — количество соединений удваивается.
  3. Specific Time (Конкретное время): Рекомендуется настроить рециклирование один раз в сутки, в период минимальной активности (например, в 04:00 утра).

Шаг 4: Диагностика на стороне SQL Server

Если мы видим рост соединений, нам нужно понять, что они делают. Выясним это с помощью системного представления MSSQL. Выполним следующий запрос в SQL Management Studio:


SELECT 
    des.session_id,
    des.status,
    des.last_request_start_time,
    des.last_request_end_time,
    des.program_name,
    dec.client_net_address
FROM sys.dm_exec_sessions AS des
JOIN sys.dm_exec_connections AS dec ON des.session_id = dec.session_id
WHERE des.program_name LIKE '%1C%'
ORDER BY des.last_request_start_time DESC;

Проанализируем результат. Если мы видим множество сессий со статусом sleeping и временем last_request_end_time, которое было более 15–20 минут назад, значит, механизм очистки пула на стороне 1С или веб-сервера не срабатывает. Это прямое подтверждение того, что нужно уменьшать параметры poolTimeout в default.vrd или время завершения спящих сеансов в 1С.

Шаг 5: Борьба с сетевыми разрывами (Keep-Alive)

Поскольку пользователи работают удаленно по всей стране, критическим фактором становится стабильность TCP-сессий. При микроразрывах связи тонкий клиент «отваливается», но сервер 1С об этом узнает не сразу. Соединение с SQL остается висеть в статусе ESTABLISHED.

Для решения этой проблемы на уровне операционной системы сервера можно сократить интервалы проверки «живучести» TCP-пакетов. Это делается в реестре Windows по адресу: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters. Рассмотрим параметры (их может потребоваться создать вручную типа DWORD):

Это заставит ОС быстрее закрывать «брошенные» сокеты, что в свою очередь позволит кластеру 1С быстрее корректно завершать сеансы и освобождать SQL-соединения.

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

Подведем итог. Резкий рост соединений — это почти всегда следствие того, что новые соединения создаются быстрее, чем старые успевают закрываться по тайм-ауту.

Для стабилизации системы рекомендуем выполнить следующие действия:

Следуя этим шагам, мы минимизируем избыточную нагрузку на СУБД и обеспечим стабильную работу пользователей даже при нестабильных каналах связи.

← На главную