Соединения с кластером и регламентный перезапуск рабочих процессов

Обновлено: 20.03.2008

Раздел поясняет влияние соединений с кластером на управление рабочими процессами.

Соединения кластера

Утилита администрирования кластера серверов позволяет посмотреть список соединений:

Среди соединений имеются:

Пользовательские соединения относятся к информационной базе и видны в списке соединений:

Служебные соединения не относятся к конкретной информационной базе и видны в списках соединений:

Служебных соединений "Планировщик заданий" может быть несколько. Они устанавливаются в процессе работы кластера, и их количество зависит от нагрузки на кластер и от выполняемых действий. Эти соединения использует не только планировщик фоновых и регламентных заданий, но и:

Разрыв соединения

Утилита администрирования кластера серверов и средства программного администрирования кластера (объект V81.COMConnector) позволяют выполнять принудительный разрыв соединений с кластером. Принудительно могут быть разорваны только пользовательские соединения. Возможность принудительного разрыва пользовательского соединения может зависеть от действия, которое в данный момент выполняется на сервере по инициативе данного соединения:

Принудительный разрыв служебных соединений невозможен.

Выключение и остановка рабочего процесса

Каждый рабочий процесс, определенный в кластере, может быть выключен или включен. При запуске кластера запускаются только включенные процессы. В работающем кластере при помощи Утилиты администрирования кластера серверов или средств программного администрирования кластера можно включать и выключать рабочие процессы, а также их создавать и удалять. После включения рабочий процесс запускается, если он до этого не был запущен и был выключен.

После выключения запущенного рабочего процесса он останавливается не сразу, а только тогда, когда с ним не будет установлено ни одного пользовательского соединения. При этом новых пользовательских соединений с данным рабочим процессом устанавливаться не будет. Для обеспечения возможности остановки рабочего процесса даже в том случае, когда с ним еще установлены пользовательские соединения, в Утилите администрирования кластера серверов предусмотрен параметр "Выключенные процессы останавливать через..." в свойствах кластера, а в средствах программного администрирования кластера - свойство ExpirationTimeout объекта "Кластер серверов" (IClusterInfo).

Если в момент выключения рабочего процесса значение этого параметра отлично от 0, то через заданное им количество секунд после выключения рабочий процесс будет остановлен даже в том случае, если не все пользовательские соединения с этим процессом закончили работу. При этом работа всех пользователей, подсоединенных к этому процессу, завершится аварийно.

Чтобы избежать аварийного завершения работы пользователей, можно предусмотреть в конфигурации анализ ситуации, когда рабочий процесс, с которым работает пользователь, оказался выключен. Для этого в глобальном контексте имеется метод "НеобходимостьЗавершенияСоединения". С его помощью конфигурация может отследить выключение рабочего процесса и оценить время, через которое выключенный процесс будет остановлен. В этом случае, например, пользователю может быть предложено перезапустить приложение.

Регламентный перезапуск рабочих процессов

Для минимизации отрицательных последствий фрагментации и утечки памяти в рабочих процессах может быть предусмотрен их автоматический перезапуск. В 1С:Предприятие встроена возможность автоматического перезапуска рабочих процессов через заданные интервалы времени. Для этого в Утилите администрирования кластера серверов предназначен параметр "Рабочие процессы перезапускать через..." в свойствах кластера, а в средствах программного администрирования кластера - свойство LifeTimeLimit объекта "Кластер серверов" (IClusterInfo). Если этот параметр отличен от 0, то для каждого рабочего процесса через заданное количество секунд после его запуска:

Это позволяет обеспечить автоматическое ограничение времени жизни рабочих процессов. Рекомендуется время, заданное параметрами LifeTimeLimit и ExpirationTimeout, связывать с длительностью технологического цикла конкретной информационной базы (сутки, неделя и т. д.).

Если автоматический перезапуск рабочих процессов при окончании заданного времени жизни не решает проблему, то возможна организация программного перезапуска по каким-нибудь другим критериям (объем памяти, занимаемые ресурсы, ...). Для этого при помощи средств программного администрирования кластера объекта V81.COMConnector необходимо:

Приведенный ниже пример кода позволяет установить время принудительной остановки рабочих процессов:

Копировать в буфер обмена
Соединитель = Новый COMОбъект("V81.COMConnector");
СоединениеСАгентом = Соединитель.ConnectAgent("server");
СоединениеСАгентом.AuthenticateAgent("","");
Кластеры = СоединениеСАгентом.GetClusters();
Кластер = Кластеры.GetValue(0);
СоединениеСАгентом.Authenticate(Кластер, "", "");
СоединениеСАгентом.SetClusterRecycling(Кластер, Кластер.LifeTimeLimit, 60 * 60 * 24);

Следующий фрагмент кода является простым примером регламентного перезапуска рабочих процессов:

Копировать в буфер обмена
Соединитель = Новый COMОбъект("V81.COMConnector");
СоединениеСАгентом = Соединитель.ConnectAgent("server");
СоединениеСАгентом.AuthenticateAgent("","");
Кластеры = СоединениеСАгентом.GetClusters();
Кластер = Кластеры.GetValue(0);
СоединениеСАгентом.Authenticate(Кластер, "", "");
// Удалить выключенные и остановленные процессы.
РабочиеПроцессы = СоединениеСАгентом.GetWorkingProcesses(Кластер);
НижнийИндекс = РабочиеПроцессы.GetLowerBound();
ВерхнийИндекс = РабочиеПроцессы.GetUpperBound();
Для НомерПроцесса = НижнийИндекс По ВерхнийИндекс Цикл
	РабочийПроцесс = РабочиеПроцессы.GetValue(НомерПроцесса);
	Если РабочийПроцесс.Enable = 0 И РабочийПроцесс.Running = 0 Тогда
		СоединениеСАгентом.UnregWorkingProcess(Кластер, РабочийПроцесс, Ложь);
	КонецЕсли;
КонецЦикла;
// Запустить новый процесс.
НовыйПроцесс = СоединениеСАгентом.CreateWorkingProcessInfo();
НовыйПроцесс.Capacity = 1000;
НовыйПроцесс.Enable = 1;
НовыйПроцесс.HostName = "server";
СоединениеСАгентом.RegWorkingProcess(Кластер, НовыйПроцесс);
// Выключить выбранный процесс.
НомерВыбранногоПроцесса = 0;
РабочиеПроцессы = СоединениеСАгентом.GetWorkingProcesses(Кластер);
РабочийПроцесс = РабочиеПроцессы.GetValue(НомерВыбранногоПроцесса);
СоединениеСАгентом.StopWorkingProcess(Кластер, РабочийПроцесс);