8 октября 2015 г.

Рабочие процессы в PRIV режиме

Как я описывал во второй части моего рассказа об организации памяти в SAP AS ABAP, последовательность выделения памяти диалоговому рабочему процессу следующая:
  1. Сначала для пользователя выделяется небольшой объем Roll area, который задается параметром ztta/roll_first (100-200 Кб).
  2. Если размер контекста пользователя растет, то используется память Extended memory через указатели (pointers). 
  3. Если контекст пользователя использует весь объем Extended memory, определенный в квоте на один шаг диалога (параметр ztta/roll_extension), то рабочий процесс начинает использовать локальную память в Roll area, до размера квоты, определенной параметром ztta/roll_area.
  4. Если рабочему процессу необходимо больше памяти, то она выделяется в области SAP Heap memory (локальная память). С данного момента рабочий процесс переходит в PRIV режим (private mode). 
  5. Если рабочему процессу необходимо SAP Heap memory больше, чем сконфигурировано в квоте, определенной параметром abap/heap_area_dia, то программа прерывается с дампом, сообщающем о нехватке памяти.

Таким образом, после того, как рабочий процесс использовал всю память, разрешенную квотами, в Roll area + Extended memory, ему выделяется память из области SAP Heap memory. С этого момента данный рабочий процесс переходит в привилегированный режим работы (PRIV mode) (рис. 1). Это означает, что данный диалоговый рабочий процесс будет закреплен за данным пользователем, то есть не будет выгружать его контекст (roll-out) до тех пор, пока пользователь не выполнит все шаги текущей транзакции.

Рис. 1. Рабочий процесс в PRIV режиме.

Рабочий процесс в PRIV режиме работает хорошо, но скорость работы других пользователей, а, следовательно, и производительность всей системы в целом, снижается, так как мультиплексирование рабочих процессов для данного рабочего процесса не работает. Снижение производительности будет тем больше, чем больше рабочих процессов находится в PRIV режиме.

В SAP системе такие процессы отслеживаются в транзакции SM50 (рис. 2).

Рис. 2. Рабочий процесс в PRIV режиме в транзакции SM50.

Выполнив в транзакции SM04 пункт меню "Goto -> Memory", можно также обнаружить данного пользователя, который использует SAP Heap Memory (рис. 3).

Рис. 3. Транзакция SM04: мониторинг использования SAP Heap memory пользователями.

Войдя в транзакцию ST02, на основном экране можно наблюдать текущее использование SAP Heap memory (рис. 4).

Рис. 4. Текущее использование SAP Heap memory.

Нажав комбинацию кнопок "Detail analysis menu -> SAP memory -> Mode list", можно обнаружить режим данного пользователя и информацию об использовании им памяти. Отсутствие пометки "X" в поле "Attchd" означает, что рабочий процесс в данный момент не выполняет никакой задачи от пользователя, но содержит его контекст и простаивает в PRIV режиме (рис. 5).

Рис. 5. Список режимов пользователей с информацией об использовании памяти.

При выделении рабочему процессу SAP Heap memory больше чем задано квотой (параметр abap/heaplimit), рабочий процесс отмечается для будущего рестарта на уровне операционной системы. В данном случае после окончания транзакции рабочий процесс выполняет рестарт. Данный процесс необходим для полного и корректного освобождения локальной памяти, занимаемой рабочим процессом (рис. 6). Особенно это актуально для Unix-like операционных систем.

Рис. 6. Рестарт рабочего процесса после PRIV режима.

Рабочие процессы, выполнившие рестарт по данной причине, не отмечаются флагом "Err" в транзакции SM50, но оставляют запись об этом в журналах рабочих процессов (dev_wX).

В системе необходимо избегать ситуаций перехода рабочих процессов в PRIV режим, прежде всего, выделяя достаточное количество Extended memory.

Так же есть дополнительные параметры, позволяющие контролировать ситуацию:

  • rdisp/wppriv_max_no (по-умолчанию, "(количество диалоговых рабочих процессов)-5" или "1") - определяет максимальное количество процессов в PRIV режиме, 
  • rdisp/max_priv_time (по-умолчанию, "600") - устанавливает ограничение по времени работы рабочего процесса в PRIV режиме. 

Если количество рабочих процессов, работающих в PRIV режиме, превышает количество, указанное в параметре rdisp/wppriv_max_no, и время работы рабочего процесса в PRIV режиме превышает значение, указанное в параметре rdisp/max_priv_time, то происходит сброс самой долго-работающей транзакции в рабочем процессе в PRIV режиме.

Подробности в SAP Note 79435: Automatic resetting from PRIV mode.

Данный механизм не действует на не-диалоговые рабочие процессы. Хотя, как я уже и описывал, они в первую очередь используют Heap memory, оставляя Extended memory для диалоговых рабочих процессов.



Автор: Шиболов Вячеслав Анатольевич


2 комментария:

  1. Добрый день, если позволите, пару вопросов. Первое, не совсем понятно, Heap Memory в виде параметров abap/heap_area_* (dia, nondia,total) определяется как общее количество для всех процессов, или каждому процессу выделяется по указанному значению в этих параметрах?
    Тогда тут также не понятен смысл параметра abap/heaplimit.

    И второй вопрос, из ваших слов получается, что пока количество процессов в PRIV статусе не достигнет rdisp/wppriv_max_no, механизм автосброса процессов происходить не будет. Например, в системе часто получается следующая ситуация, несколько процессов бесконечно висят в PRIV, при этом память в системе закончилась, идут соответствующие дампы об этом. Ситауция может длиться бесконечно, вплоть до перезагрузки системы.

    ОтветитьУдалить
    Ответы
    1. Добрый день, Игорь.
      Параметры для Heap Memory, abap/heap_area_* (dia, nondia), ограничивают выделение памяти для одного процесса того или иного вида (диалоговый, не-диалоговый). Параметр abap/heap_area_total задает ограничение по памяти данного типа (Heap memory) для всех процессов. То есть, суммарно может быть выделено не больше, чем указано в нём. Таким образом, при попытке превысить эти параметры - процесс выпадает в дамп с сообщением о нехватке памяти.

      abap/heaplimit это некое триггерное значение, при достижении которого рабочий процесс на уровне ОС будет перезапущен для полного освобождения занимаемой им памяти, но только после выполнения данного шага диалога. То есть это некий порог важности памяти для нас. И работает этот механизм только в UNIX подобных ОС. Смотрите рис. 6.

      Да, вы все верно поняли про механизм сброса. Выставьте значение параметра в 1, если у вас бывают такие ситуации. Вообще процесс уходит из PRIV режима при выходе пользователя из системы, или завершения им транзакции. То есть висеть процессы не должны. Можно принудительно выкинуть пользователя в транзакции SM04. Можно перезапустить процесс в SM50. Перезапуск системы не нужен. "Память в системе закончилась" - может быть у вас некорректно настроена память в SAP? Или просто пришла пора подумать про апгрейд аппаратного обеспечения.

      Удалить