21 апреля 2020 г.

Фоновые задания в SAP системе - I

Сегодня я хотел бы поговорить про фоновую обработку в SAP системе. 

Как вы уже знаете (например, из этого поста), работа пользователей в ABAP-части SAP системы возможна в двух режимах - диалоговом и фоновом. 

Фоновый (background) режим работы используется для запуска долгих тяжелых отчетов или стандартных периодических заданий для обслуживания SAP системы (задания, собирающие различную статистику, проводящие чистку и тому подобное). Для работы ABAP-программы в фоновом режиме используются фоновые задания. Особенностью фоновых заданий является то, что они не требуют постоянного коннекта пользователя с системой посредством SAP GUI. То есть пользователь планирует задание после чего может выйти из системы, а программа запустится и отработает без него. Этот факт некоторым образом ограничивает тип запускаемой программы - не работают функции связанные с рабочей станцией пользователя. Например, Frontend печать или загрузка данных с компьютера пользователя. Но в остальных случаях фоновая обработка это удобно. 

Сразу отмечу тот момент, что в целом ABAP-программа в фоне работает не быстрее и  не медленнее, чем в диалоговом режиме. Но благодаря особенностям фоновой обработки мы можем запланировать выполнение программы без нашего участия в тот момент, когда нагрузка на систему минимальна. И в этом сила фоновой обработки. Есть ещё небольшие особенности в выделении памяти рабочему процессу и в фиксировании/откате изменений в базе данных. Но они не значительны.

Планирование фоновых заданий производится в транзакции SM36 (рис. 1). 

Рис. 1.Транзакция SM36: пример планирования фонового задания.

Данная транзакция обладает широкими возможностями по планированию. 

Сначала необходимо определить имя фонового задания. Указать его класс и цель выполнения (рис. 1: поля области 1). 

Цель выполнения это конкретная инстанция данной системы, у которой есть хотя бы один фоновый процесс. 

Ведь вы помните, что за обработку фоновых заданий в системе отвечают рабочие процессы специального типа - фоновые (тип BTC). Количество рабочих процессов данного типа настраивается через SAP параметр rdisp/wp_no_btc.

Заполнять поле "Цель выполнения" не обязательно. Можно оставить его пустым, тогда система сама выберет на какой инстанции выполнить обработку, используя механизмы балансировки нагрузки.

А ещё в качестве цели выполнения можно указать группу серверов фоновой обработки. Управление группами серверов для фоновой обработки осуществляется в  транзакции SM61. Ситуация аналогичная Logon Group для диалоговой обработки (транзакция SMLG). Создаёте группу и включаете в неё инстанции. Причём, для исключения какого-то сервера из обработки можно создать группу с именем SAP_DEFAULT_BTC. После этого включаете в неё все инстанции кроме той (тех), что хотите исключить. В результате, если при планировании поле "Цель выполнения" оставить пустым, то планировщик выберет инстанцию из тех, что включены в группу SAP_DEFAULT_BTC. Подробности можно найти в SAP note 786412 - Determining execution server of jobs w/o target server

Теперь про классы. Классов заданий в системе 3: A, B и C. Классы имеют разный приоритет. A - самый высокий, C - самый низкий. Имейте в виду, что приоритеты используются только при запуске задания. Если при выборе очередного задания для старта в очереди окажется несколько заданий, которые уже можно запустить, то планировщик будет выбирать и запускать задания основываясь на приоритете (рис. 2).

Рис. 2. Приоритет фоновых заданий, используемый при планировании запуска.

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

Дополнительно существует возможность выделить часть фоновых рабочих процессов инстанции для выполнения только заданий класса A. Сделать это можно при активации и настройки режимов работы инстанции (транзакция RZ04). В этом случае при планировании фоновых заданий данные рабочие процессы не будут участвовать в обработке фоновых заданий классов B и С. Но злоупотреблять этой возможностью не рекомендуется, так как можно получить обратный эффект и снизить общее время выполнения всех фоновых заданий в системе. Потому что большинство заданий в системе (70% и более) имеют приоритет C. Даже стандартные фоновые задания или системные задания, планируемые в календаре транзакции DB13.

Далее при создании фонового задания необходимо задать шаги задания (рис. 1: кнопка 3). Шагов может быть несколько. В качестве шага задания может выступать ABAP-программа, внешняя команда или внешняя программа. Если ABAP-программа имеет экран выбора, то предварительно необходимо создать вариант с заполненными полями экрана. Этот вариант экрана указывается вместе с ABAP-программой при планировании. Про внешние команды операционной системы у меня был отдельный пост.

После указания шагов задания необходимо зафиксировать условия запуска задания (рис. 1: кнопка 2). Выбор достаточно широкий (рис. 3).

Рис. 3. Условия запуска фонового задания.

Можно запустить задание сразу же после окончания процесса создания (кнопка "Немедл-но"). А можно задать точные дату и время запуска (кнопка "Дата/Время"). 

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

Также в качестве условия запуска задания можно указать время окончания другого фонового задания (кнопка "ПослеЗдн"). Таким образом, можно выстроить цепочку фоновых заданий, которые будут выполняться друг за другом. Причём, можно анализировать статус (указывается дополнительно), с которым выполнилось предыдущее задание. В этом случае последующее задание запустится лишь в том случае, если предыдущее выполнилось успешно (с кодом 0).

Кому и этого мало, то можно указать в качестве условия запуска - системное событие или смену режима работы системы (настройка в транзакции RZ04).

Ещё один нюанс в планировании заданий - можно создавать периодические задания, нажав на кнопку "Значения периодов" и выбрав нужный период (рис. 3).

Ну и последний нюанс при создании фонового задания. Просмотреть результаты работы фонового задания можно после его окончания через систему спула. Причем, если вы хотите чтобы другой пользователь системы получил вывод работы задания в свой запрос спула, то это можно отдельно указать (рис. 1: кнопка 4).


Создать фоновое задание можно так, как я только что описал, а можно вызвать Ассистента по заданиям (кнопка на панели начального экрана транзакции SM36) и пройти все шаги с его помощью.

Еще есть возможность запуска транзакции в фоновом режиме прямо из самой транзакции. Это можно сделать только в том случае, если на начальном экране транзакции есть пункт меню "Программа -> Фоновое выполнение" (рис. 4). Выбрав этот пункт, вы запланируете фоновое задание, в котором 
автоматически с текущей программой будет добавлен вариант экрана с уже введёнными значениями в полях.

Рис. 4. Пример фонового выполнения диалоговой программы.

На сегодня это всё. Продолжение можно прочитать тут.




14 комментариев:

  1. Анонимный05.10.2023, 11:25

    Добрый день. Столкнулся с проблемой: в какой-то момент фоновые программы, обновляющие данные во внешней БД, стали слать устаревшие данные, "залипшие"на определенный день, в то время, как ручной запуск отсылает актуальные данные. Причем, это касается не одной программы, а множества. С чем это может быть связано ?

    ОтветитьУдалить
    Ответы
    1. Добрый день.
      Тут вопрос в том, как формируется дата выборки данных. Что у вас используется? Вариант экрана с динамической датой? Посмотрите у текущего задания какие даты он подставляет в вариант. Может быть кто-то вариант "поломал".

      Удалить
    2. Анонимный05.10.2023, 12:18

      нет, выборка идет в коде программы по типу сравнения с системной датой. С самой системной датой все ок. Ну и вручную тот же код отрабатывает адекватно.

      Удалить
    3. Выполнение программы в фоне выполняется из-под того же пользователя? Инстанция, на которой запускается фоновый процесс та же, что и для диалогового запуска?

      Удалить
    4. Анонимный05.10.2023, 12:22

      да, юзер тот же, инстанс тот же. Работало адекватно до этого сбоя длительное время.

      Удалить
    5. Анонимный05.10.2023, 12:28

      пользователь тот же, инстанс тот же. Программа на дату лишь пример, есть программы без выборки даты и никак не связанные с ней, но тоже неадекватно ведущие себя именно в фоновом режиме.

      Удалить
    6. Ни разу с таким не сталкивался. Проанализируйте, что было в момент "сбоя". Давно это было? Дампы? Специфические сообщения в логах? Были ли изменения в системе? Например, каких-то параметров? Версия системы какая? Кроме некорректной даты, какие ещё "глюки"?
      Перепланировать задание пробовали? Запланировать новое в другое время?

      Удалить
    7. Анонимный05.10.2023, 12:57

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

      Удалить
    8. А перепланировать фоновые задания пробовали? Не помогает отлипнуть?

      Удалить
    9. Анонимный05.10.2023, 13:07

      таких заданий очень много. Останавливали все, запускали заново. Прям, чтобы заработало все, нет произошло. Часть программ глючило примерно неделю, потом стало работать нормально. Часть так и не пришла в себя, руками запускаются пока. Но даже если все придет само в норму, как избежать такого в будущем - это же заложенная бомба.

      Удалить
    10. А какая всё таки версия системы? Может быть в нотах что-то есть?

      Удалить
    11. Анонимный05.10.2023, 13:29

      SAP ECC 6.0 релиз 702.

      Удалить
    12. Анонимный10.10.2023, 10:24

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

      Удалить
    13. Рад, что решилось. То есть проблема была в запускаемых процессах, а не в базисе системы.

      Удалить