Обновлено: 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(Кластер, РабочийПроцесс);