1с планировщик заданий висит соединение
В одной внедряемой информационной системе значение регламентных заданий (РЗ) оказалось очень велико. С помощью них осуществляется автоматизированная проверка и загрузка исходных данных в систему. И надо же было такому случиться, РЗ стали иногда подвисать. Несколько раз в месяц, после перезапуска сервера 1С Предприятия, все РЗ переставали выполняться. Выяснилось, что ситуация легко локально лечится перезаписью каждого РЗ. После чего они начинают нормально работать.
Поиск в Инете показал, что мы не одиноки. Подобная проблема встречается давно, но есть нюансы. Один из хорошо известных случаев, когда сервер sql и сервер 1С стоят на одной машине. После физического перезапуска сервера сервис 1С Предприятия стартует раньше сервиса sql, и модуль обработки регламентных заданий не может ещё прочитать их из базы. И считает, что их нет. Есть даже рекомендация Микрософт для данной ситуации, которая предусматривает настройку зависимости сервиса 1С Предприятия от сервиса sql. То есть он всегда буде стартовать после. Решение! Но это был не наш случай, так как физического перезапуска сервера у нас не было. Только остановка и старт сервиса. Были проанализированы и другие аспекты. Сервер sql работает непрерывно. Базы в кластер если и добавляются, то порядком реже, чем сбоят РЗ. Разделителей нет. После перезапуска сервера 1С Предприятия РЗ стартуют независимо.
Dim v82 , base
Set v82 = CreateObject ( "V82.ComConnector" )
ConnString = "Srvr=имя_сервера;Ref=имя_базы"
Set base = v82 . Connect ( ConnString )
base . CheckScheduledTasks
В зависимости от настроек, в строку соединения возможно придется добавить пользователя и пароль: "usr=пользователь;pwd=пароль".
В конфигурацию я добавил процедуру в Модуль внешнего соединения, которая вызывает процедуру из Общего модуля:
Процедура CheckScheduledTasks () Экспорт
РегламентныеЗадания . ПроверитьПерезаписатьРегламентныеЗадания ();
КонецПроцедуры
// Процедура проверяет выполнение и перезаписывает все включенные регламентные задания
Процедура ПроверитьПерезаписатьРегламентныеЗадания () Экспорт
мРЗ = РегламентныеЗадания . ПолучитьРегламентныеЗадания (Новый Структура ( "Использование" , Истина));
Если мРЗ . Количество () = 0 тогда
ЗаписьЖурналаРегистрации ( "Регламентные задания" , УровеньЖурналаРегистрации . Информация . "Отсутствуют Регламентные задания с признаком Использование" );
КонецЕсли;
стрТекущееВремя = "00010101" + Формат ( Час ( ТекущаяДата ()), "ЧЦ=2; ЧН=00; ЧВН color: red;">)+ Формат ( Минута ( ТекущаяДата ()), "ЧЦ=2; ЧН=00; ЧВН color: red;">)+
Формат ( Секунда ( ТекущаяДата ()), "ЧЦ=2; ЧН=00; ЧВН color: red;">);
ТекущееВремя = Дата ( стрТекущееВремя );
мПозже = Новый Массив ;
фПерезаписываем = Ложь;
Для каждого РЗ из мРЗ цикл
Если РЗ . Расписание . ВремяНачала > ТекущееВремя тогда
мПозже . Добавить ( РЗ );
ИначеЕсли РЗ . ПоследнееЗадание = Неопределено тогда
РЗ . Записать ();
фПерезаписываем = Истина;
ЗаписьЖурналаРегистрации ( "Регламентные задания" , УровеньЖурналаРегистрации . Предупреждение , РЗ . Метаданные , РЗ , "Перезаписано - " + РЗ . Метаданные . Имя );
Иначе
ЗаписьЖурналаРегистрации ( "Регламентные задания" , УровеньЖурналаРегистрации . Информация , РЗ . Метаданные , РЗ , "Нормально выполняется - " + РЗ . Метаданные . Имя );
КонецЕсли;
КонецЦикла;
Если фПерезаписываем тогда
Для каждого РЗ из мПозже цикл
РЗ . Записать ();
ЗаписьЖурналаРегистрации ( "Регламентные задания" , УровеньЖурналаРегистрации . Предупреждение , РЗ . Метаданные , РЗ , "Перезаписано - " + РЗ . Метаданные . Имя );
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Последний модуль был доработан. Обрабатываются все используемые РЗ. Если РЗ должно было начать выполняться до момента проверки, но не выполнялось, то перезаписываем его. Если были обновления, то перезаписываем и более поздние РЗ.
Думаю, многим, имеющим дело с клиент-серверным 1С, хотя бы иногда приходилось сталкиваться с зависшими фоновыми заданиями, которые невозможно безболезненно, без перезапуска сервера 1С, прибить ни одним из штатных инструментов (консоль заданий, консоль администрирования серверов 1С и т.п.). В публикации описан один из возможных способов решения проблемы.
Проблема не новая и время от времени обсуждается на всевозможных 1С-ных форумах. Самое простое и популярное решение - это перезагрузка сервера 1С. К сожалению, этот вариант не всегда допустим или крайне нежелателен. На такой случай существуют более деликатные решения.
Вот один из таких способов в виде краткой пошаговой инструкции:
1. С помощью консоли администрирования серверов 1С ищем проблемное ф оновое задание в списке соединений (например, по времени начала его работы, сравнив с временем начала работы регламентированного задания в консоли заданий). Определяем рабочий процесс, в котором находится зависшее соединение.
2. Открываем свойства этого процесса и отмечаем его как неиспользуемый (если используется один единственный процесс, то предварительно необходимо создать новый рабочий процесс - для того, чтобы все активные соединения переподключились к нему). Запоминаем номер PID данного процесса.
3. Дожидаемся когда все текущие соединения переместятся из отключенного процесса в один из используемых. В конечном итоге в нашем процессе должны остаться только проблемные соединения, которые мы и хотим удалить.
4. На компьютере с сервером 1С с помощью диспетчера задач ищем соответствующий ему процесс rphost.exe по PID отключенного рабочего процесса и удаляем его.
5 . На всякий случай можно удалить отключенный нами рабочий процесс 1С с пощью админ. консоли и, при необходимости, создать новый.
6 . Готово. Можно войти в консоль заданий и проверить работоспособность регламентного задания.
Соединения с кластером и регламентный перезапуск рабочих процессов
Раздел поясняет влияние соединений с кластером на управление рабочими процессами.
Соединения кластера
Утилита администрирования кластера серверов позволяет посмотреть список соединений:
- кластера в целом (ветка "Центральные серверы 1С:Предприятия 8.1/ / Кластеры/ / Соединения");
- рабочего процесса (ветка "Центральные серверы 1С:Предприятия 8.1/ / Кластеры/ / Процессы/ / Соединения" или ветка "Центральные серверы 1С:Предприятия 8.1/ / Кластеры/ / Рабочие серверы/ / Процессы/ / Соединения");
- информационной базы (ветка "Центральные серверы 1С:Предприятия 8.1/ / Кластеры/ Информационные базы/ / Соединения").
Среди соединений имеются:
- пользовательские соединения (1С:Предприятие, Конфигуратор, COM-соединения, WS-соединение, Фоновое задание, Консоль кластера, COM-администратор)
- служебные соединения (Планировщик заданий, Отладчик)
Пользовательские соединения относятся к информационной базе и видны в списке соединений:
- своей информационной базы;
- своего рабочего процесса;
- кластера в целом.
Служебные соединения не относятся к конкретной информационной базе и видны в списках соединений:
- своего рабочего процесса;
- кластера в целом.
Служебных соединений "Планировщик заданий" может быть несколько. Они устанавливаются в процессе работы кластера, и их количество зависит от нагрузки на кластер и от выполняемых действий. Эти соединения использует не только планировщик фоновых и регламентных заданий, но и:
Разрыв соединения
- если по инициативе пользовательского соединения на сервере не выполняется никакого действия, то соединение может быть разорвано всегда;
- если в момент разрыва соединения соединение выполняет на сервере код на встроенном языке, то разрыв соединения возможен при переходе выполнения от одной строки кода на встроенном языке к другой;
- если соединение выполняет запрос к базе данных, то для MS SQL Server и IBM DB2 1С:Предприятие предпринимает попытку прервать выполнение запроса сервером баз данных. Соединение будет разорвано, если пользователь базы данных, от имени которого сервер 1С:Предприятия выполняет обращение к базе данных, имеет соответствующие права, и СУБД готово выполнить функцию прекращения исполнения запроса;
- в других случаях попытка принудительного разрыва пользовательского соединения может не привести к фактическому разрыву соединения.
Принудительный разрыв служебных соединений невозможен.
Выключение и остановка рабочего процесса
Каждый рабочий процесс, определенный в кластере, может быть выключен или включен. При запуске кластера запускаются только включенные процессы. В работающем кластере при помощи Утилиты администрирования кластера серверов или средств программного администрирования кластера можно включать и выключать рабочие процессы, а также их создавать и удалять. После включения рабочий процесс запускается, если он до этого не был запущен и был выключен.
После выключения запущенного рабочего процесса он останавливается не сразу, а только тогда, когда с ним не будет установлено ни одного пользовательского соединения. При этом новых пользовательских соединений с данным рабочим процессом устанавливаться не будет. Для обеспечения возможности остановки рабочего процесса даже в том случае, когда с ним еще установлены пользовательские соединения, в Утилите администрирования кластера серверов предусмотрен параметр "Выключенные процессы останавливать через. " в свойствах кластера, а в средствах программного администрирования кластера - свойство ExpirationTimeout объекта "Кластер серверов" (IClusterInfo).
Если в момент выключения рабочего процесса значение этого параметра отлично от 0, то через заданное им количество секунд после выключения рабочий процесс будет остановлен даже в том случае, если не все пользовательские соединения с этим процессом закончили работу. При этом работа всех пользователей, подсоединенных к этому процессу, завершится аварийно.
Чтобы избежать аварийного завершения работы пользователей, можно предусмотреть в конфигурации анализ ситуации, когда рабочий процесс, с которым работает пользователь, оказался выключен. Для этого в глобальном контексте имеется метод "НеобходимостьЗавершенияСоединения". С его помощью конфигурация может отследить выключение рабочего процесса и оценить время, через которое выключенный процесс будет остановлен. В этом случае, например, пользователю может быть предложено перезапустить приложение.
Регламентный перезапуск рабочих процессов
Для минимизации отрицательных последствий фрагментации и утечки памяти в рабочих процессах может быть предусмотрен их автоматический перезапуск. В 1С:Предприятие встроена возможность автоматического перезапуска рабочих процессов через заданные интервалы времени. Для этого в Утилите администрирования кластера серверов предназначен параметр "Рабочие процессы перезапускать через. " в свойствах кластера, а в средствах программного администрирования кластера - свойство LifeTimeLimit объекта "Кластер серверов" (IClusterInfo). Если этот параметр отличен от 0, то для каждого рабочего процесса через заданное количество секунд после его запуска:
- создается и запускается новый процесс;
- текущий процесс выключается.
Это позволяет обеспечить автоматическое ограничение времени жизни рабочих процессов. Рекомендуется время, заданное параметрами LifeTimeLimit и ExpirationTimeout, связывать с длительностью технологического цикла конкретной информационной базы (сутки, неделя и т. д.).
- установить время принудительной остановки рабочих процессов (свойство ExpirationTimeout объекта "Кластер серверов");
- согласно установленным критериям выбрать рабочий процесс, который необходимо перезапустить;
- запустить новый процесс;
- выключить выбранный процесс;
- после того, как выключенный процесс будет остановлен, удалить его из кластера.
Приведенный ниже пример кода позволяет установить время принудительной остановки рабочих процессов:
Следующий фрагмент кода является простым примером регламентного перезапуска рабочих процессов:
Удаляем намертво зависшие фоновые задания без перезагрузки сервера 1С
Проблема не новая и время от времени обсуждается на всевозможных 1С-ных форумах. Самое простое и популярное решение - это перезагрузка сервера 1С. К сожалению, этот вариант не всегда допустим или крайне нежелателен. На такой случай существуют более деликатные решения.
Вот один из таких способов в виде краткой пошаговой инструкции:
1. С помощью консоли администрирования серверов 1С ищем проблемное ф оновое задание в списке соединений (например, по времени начала его работы, сравнив с временем начала работы регламентированного задания в консоли заданий). Определяем рабочий процесс, в котором находится зависшее соединение.
2. Открываем свойства этого процесса и отмечаем его как неиспользуемый (если используется один единственный процесс, то предварительно необходимо создать новый рабочий процесс - для того, чтобы все активные соединения переподключились к нему). Запоминаем номер PID данного процесса.
3. Дожидаемся когда все текущие соединения переместятся из отключенного процесса в один из используемых. В конечном итоге в нашем процессе должны остаться только проблемные соединения, которые мы и хотим удалить.
4. На компьютере с сервером 1С с помощью диспетчера задач ищем соответствующий ему процесс rphost.exe по PID отключенного рабочего процесса и удаляем его.
5 . На всякий случай можно удалить отключенный нами рабочий процесс 1С с пощью админ. консоли и, при необходимости, создать новый.
6 . Готово. Можно войти в консоль заданий и проверить работоспособность регламентного задания.
Раздел поясняет влияние соединений с кластером на управление рабочими процессами.
Соединения кластера
Утилита администрирования кластера серверов позволяет посмотреть список соединений:
- кластера в целом (ветка "Центральные серверы 1С:Предприятия 8.1/ / Кластеры/ / Соединения");
- рабочего процесса (ветка "Центральные серверы 1С:Предприятия 8.1/ / Кластеры/ / Процессы/ / Соединения" или ветка "Центральные серверы 1С:Предприятия 8.1/ / Кластеры/ / Рабочие серверы/ / Процессы/ / Соединения");
- информационной базы (ветка "Центральные серверы 1С:Предприятия 8.1/ / Кластеры/ Информационные базы/ / Соединения").
Среди соединений имеются:
- пользовательские соединения (1С:Предприятие, Конфигуратор, COM-соединения, WS-соединение, Фоновое задание, Консоль кластера, COM-администратор)
- служебные соединения (Планировщик заданий, Отладчик)
Пользовательские соединения относятся к информационной базе и видны в списке соединений:
- своей информационной базы;
- своего рабочего процесса;
- кластера в целом.
Служебные соединения не относятся к конкретной информационной базе и видны в списках соединений:
- своего рабочего процесса;
- кластера в целом.
Служебных соединений "Планировщик заданий" может быть несколько. Они устанавливаются в процессе работы кластера, и их количество зависит от нагрузки на кластер и от выполняемых действий. Эти соединения использует не только планировщик фоновых и регламентных заданий, но и:
Разрыв соединения
- если по инициативе пользовательского соединения на сервере не выполняется никакого действия, то соединение может быть разорвано всегда;
- если в момент разрыва соединения соединение выполняет на сервере код на встроенном языке, то разрыв соединения возможен при переходе выполнения от одной строки кода на встроенном языке к другой;
- если соединение выполняет запрос к базе данных, то для MS SQL Server и IBM DB2 1С:Предприятие предпринимает попытку прервать выполнение запроса сервером баз данных. Соединение будет разорвано, если пользователь базы данных, от имени которого сервер 1С:Предприятия выполняет обращение к базе данных, имеет соответствующие права, и СУБД готово выполнить функцию прекращения исполнения запроса;
- в других случаях попытка принудительного разрыва пользовательского соединения может не привести к фактическому разрыву соединения.
Принудительный разрыв служебных соединений невозможен.
Выключение и остановка рабочего процесса
Каждый рабочий процесс, определенный в кластере, может быть выключен или включен. При запуске кластера запускаются только включенные процессы. В работающем кластере при помощи Утилиты администрирования кластера серверов или средств программного администрирования кластера можно включать и выключать рабочие процессы, а также их создавать и удалять. После включения рабочий процесс запускается, если он до этого не был запущен и был выключен.
После выключения запущенного рабочего процесса он останавливается не сразу, а только тогда, когда с ним не будет установлено ни одного пользовательского соединения. При этом новых пользовательских соединений с данным рабочим процессом устанавливаться не будет. Для обеспечения возможности остановки рабочего процесса даже в том случае, когда с ним еще установлены пользовательские соединения, в Утилите администрирования кластера серверов предусмотрен параметр "Выключенные процессы останавливать через. " в свойствах кластера, а в средствах программного администрирования кластера — свойство ExpirationTimeout объекта "Кластер серверов" (IClusterInfo).
Если в момент выключения рабочего процесса значение этого параметра отлично от 0, то через заданное им количество секунд после выключения рабочий процесс будет остановлен даже в том случае, если не все пользовательские соединения с этим процессом закончили работу. При этом работа всех пользователей, подсоединенных к этому процессу, завершится аварийно.
Чтобы избежать аварийного завершения работы пользователей, можно предусмотреть в конфигурации анализ ситуации, когда рабочий процесс, с которым работает пользователь, оказался выключен. Для этого в глобальном контексте имеется метод "НеобходимостьЗавершенияСоединения". С его помощью конфигурация может отследить выключение рабочего процесса и оценить время, через которое выключенный процесс будет остановлен. В этом случае, например, пользователю может быть предложено перезапустить приложение.
Регламентный перезапуск рабочих процессов
Для минимизации отрицательных последствий фрагментации и утечки памяти в рабочих процессах может быть предусмотрен их автоматический перезапуск. В 1С:Предприятие встроена возможность автоматического перезапуска рабочих процессов через заданные интервалы времени. Для этого в Утилите администрирования кластера серверов предназначен параметр "Рабочие процессы перезапускать через. " в свойствах кластера, а в средствах программного администрирования кластера — свойство LifeTimeLimit объекта "Кластер серверов" (IClusterInfo). Если этот параметр отличен от 0, то для каждого рабочего процесса через заданное количество секунд после его запуска:
- создается и запускается новый процесс;
- текущий процесс выключается.
Это позволяет обеспечить автоматическое ограничение времени жизни рабочих процессов. Рекомендуется время, заданное параметрами LifeTimeLimit и ExpirationTimeout, связывать с длительностью технологического цикла конкретной информационной базы (сутки, неделя и т. д.).
- установить время принудительной остановки рабочих процессов (свойство ExpirationTimeout объекта "Кластер серверов");
- согласно установленным критериям выбрать рабочий процесс, который необходимо перезапустить;
- запустить новый процесс;
- выключить выбранный процесс;
- после того, как выключенный процесс будет остановлен, удалить его из кластера.
Приведенный ниже пример кода позволяет установить время принудительной остановки рабочих процессов:
Следующий фрагмент кода является простым примером регламентного перезапуска рабочих процессов:
Добавление рабочего процесса
Добавление рабочего процесса, в отличие от просмотра, возможно, только для конкретного сервера кластера.
Для добавления нового рабочего процесса сервера кластера следует выбрать в дереве центральных серверов требуемый сервер, выбрать требуемый кластер, выбрать требуемый сервер кластеров выбрать ветку «Процессы» и выполнить команду контекстного меню "Создать — Процесс", галочкой Включить процесс.
По поводу перезапуска рабочих процессов — с какого момента начинается отсчет указанный в настройке кластера?
С момента старта процесса. Например стартовал в 18:00:00. Период перезапуска 86400 секунд, т.е. 24 часа. Соответственно через сутки в 18:00:00 процесс остановится и будет создан новый процесс.
Оптимизация рабочих процессов:
1. Интервал перезапуска: 86400 сек (24 часа). Момент перезапуска не регламентируется, видимо с момента установки параметров, либо запуска сервера приложений.
2. Также можно указать допустимый объем памяти: 3000000 Кб (3 Гб).
3. Интервал превышения допустимого объема памяти — это непрерывный интервал времени превышения допустимого объема памяти, после которого сервер перезапустит процесс. Если указано 0 сек — будет ждать вечно.
Известный факт, что при длительном функционировании сервера 1С:Предприятия 8, с течением времени увеличивается размер занимаемой рабочим процессом (rphost.exe) оперативной памяти. Так же при выполнении не оптимального кода или допущении ошибки в запросе, в этот момент рабочий процесс может занять всю оперативную память, что неминуемо приведет к замедлению работы пользователей вплоть до полной потери контроля над сервером.
Чтобы избежать этих проблем необходимо задать настройки кластера 1С:Предприятия 8 и создать необходимое количество рабочих процессов. По моему опыту +1 рабочий процесс на каждые 25-35 пользователей. Рисунок настроек кластера 1С:
Интервал перезапуска — это время по прошествии которого, рабочий процесс автоматически будет перезапущен. Перед завершением работы старого рабочего процесса, запускается новый экземпляр rphost.exe на который передаются соединения со старого рабочего процесса.
Допустимый объем памяти — это размер памяти при превышении которого, запускается таймер отсчета в секундах.
Интервал превышения допустимого объема памяти — в том случае, когда таймер отсчета в секундах превысил значение заданого в этом параметре, запускается новый рабочий процесс на который передаются соединения от старого рабочего процесса. Старый рабочий процесс помечается как не активный.
Выключенные процессы останавливать через — этот параметр означает, когда пройдет 30 секунд, после того как рабочий процесс помечен не активен, он будет завершен операционной системой. Если значение будет равно "0" — процессы автоматически завершаться не будут.
Данная настройка работает безотказно почти год. Необходимость перезапуска службы 1С:Предприятия 8 исчезла, зависания сервера уже не наблюдалось больше полугода. Даже при выполнении некоректных запросов с огромными выборками, механизм отрабатывает на ура, отключая только пользователя от базы, который запустил этот отчет, остальные пользователи, которые работали на текущем рабочем процессе плавно (без отключения от базы) будут перенесены на новый рабочий процесс.
Читайте также: