Каждый системный администратор и разработчик 1С рано или поздно сталкивается с классической проблемой: пользователь запустил «тяжелый» или неоптимизированный отчет, который намертво заблокировал базу данных и утилизировал ресурсы процессора на сервере СУБД. При этом сам пользователь уже мог закрыть клиентское приложение (через Диспетчер задач или просто выдернув сетевой кабель), но на сервере продолжает висеть активное соединение, которое отказывается закрываться штатными средствами консоли администрирования 1С.
В этой статье мы подробно проанализируем, почему возникает подобная ситуация, и рассмотрим эффективные методы точечного решения проблемы без полной перезагрузки сервера 1С или СУБД, чтобы не прерывать работу остальных пользователей системы.
Для начала выясним причину, почему стандартное нажатие кнопки «Удалить сеанс» в консоли кластера 1С часто оказывается неэффективным. В платформе 1С:Предприятие 8.3 архитектурно разделены понятия логического сеанса пользователя и физического соединения с базой данных:
rphost.exe) и сервером СУБД (MS SQL, PostgreSQL и др.).Когда выполняется сложный и объемный запрос, рабочий процесс rphost.exe передает его СУБД и переходит в режим ожидания ответа. Если в этот момент администратор удаляет сеанс пользователя через консоль 1С, менеджер кластера помечает сеанс как закрытый. Однако само физическое соединение с базой данных остается активным до тех пор, пока СУБД не завершит обработку тяжелого SQL-запроса и не вернет результат рабочему процессу. Именно поэтому удаленное соединение снова «возрождается» и продолжает потреблять ресурсы процессора.
Ниже мы подробно разберем по шагам безопасные и надежные способы устранения этой проблемы.
Самый правильный и безболезненный способ остановить зависший отчет — принудительно прервать выполнение запроса непосредственно на сервере СУБД. Это мгновенно освободит процессорное время и ресурсы памяти, не затронув других работающих пользователей.
Рассмотрим по шагам, как связать зависший процесс в 1С с конкретным потоком базы данных:
SPID, а в PostgreSQL — PID) нам и понадобится.После того как идентификатор получен, выполните операцию прерывания на стороне вашей СУБД.
Запустите среду SQL Server Management Studio (SSMS), откройте окно создания нового запроса и выполните команду принудительной остановки процесса:
-- Замените 123 на полученный из консоли 1С Идентификатор соединения СУБД (SPID)
KILL 123;
Эта команда дает указание MS SQL Server немедленно остановить выполнение транзакции, запустить процесс отката изменений (если они были) и закрыть поток. Спустя несколько секунд фантомное соединение пропадет и в консоли 1С.
Если вы используете PostgreSQL, подключитесь к СУБД через утилиту pgAdmin или консольный клиент psql и выполните следующую команду:
-- Замените 4567 на PID процесса, полученный в консоли 1С
SELECT pg_terminate_backend(4567);
Функция pg_terminate_backend отправляет сигнал завершения операционной системе СУБД, что гарантирует быстрое освобождение ресурсов.
Что делать, если у вас нет прямого административного доступа к СУБД, а зависший рабочий процесс rphost.exe продолжает грузить сервер приложений 1С? В платформе 1С 8.3 реализован отличный механизм отказоустойчивости, который позволяет изолировать проблемный рабочий процесс.
Проанализируем этот алгоритм совместных действий:
rphost, на котором запущено зависшее соединение (ориентируйтесь по показателям загрузки процессора и памяти). Также запишите его системный идентификатор PID (указан в свойствах процесса).rphost, начнут постепенно и бесшовно для себя мигрировать на другие, работающие процессы кластера.rphost.exe. Для этого откройте Диспетчер задач на сервере приложений 1С (или используйте командную строку), найдите процесс по ранее записанному PID и нажмите «Снять задачу».После этого кластер автоматически перезапустит новый чистый рабочий процесс взамен уничтоженного, а пользователи даже не заметят кратковременного сбоя.
Иногда возникают ситуации, когда зависший отчет намертво заблокировал таблицы базы данных (вызвал дедлок), из-за чего невозможно провести обновление конфигурации или запустить критически важные регламентные операции, а точечный KILL по какой-то причине не срабатывает. В таком случае поможет принудительный сброс всех подключений к конкретной базе данных через перевод её в Single User Mode.
Разберем этот сценарий на примере MS SQL Server. Выполните в SSMS следующий скрипт:
USE master;
ALTER DATABASE [Имя_Вашей_Базы_1С]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [Имя_Вашей_Базы_1С]
SET MULTI_USER;
Параметр ROLLBACK IMMEDIATE указывает серверу баз данных немедленно откатить все незавершенные транзакции (включая наш злополучный зависший отчет) и разорвать все активные соединения. Вторая команда сразу же возвращает базу данных в стандартный многопользовательский режим работы, позволяя пользователям снова войти в систему.
Чтобы минимизировать появление подобных проблем в будущем, рекомендуем выполнить базовые настройки кластера 1С:
Допустимый объем памяти и Интервал превышения допустимого объема памяти. Это позволит серверу автоматически заменять «раздувшиеся» процессы rphost без участия администратора.