Oracle mechanics

12.07.2014

Дочерние процессы LGWR 12c

Filed under: Диагностика системы (instance),Oracle,Oracle new features — Игорь Усольцев @ 12:32
Tags:

Лог процесса LGWR, начиная с версии 12c, указывает:

Created 2 redo writer workers (2 groups of 1 each)
...
Adaptive scalable LGWR disabling workers
...
Adaptive scalable LGWR enabling workers

— на вновь реализованную идею использовать множество процессов для записи логов, в последний раз наблюдавшуюся в версиях до 8i через ныне неиспользуемый (depricated) параметр _lgwr_io_slaves

В новой версии Oracle 12c это называется Adaptive scalable LGWR workers и грубо регулируется параметром скрытым _use_single_log_writer:

12.1.0.1.ORCL1201@SYS SQL> @param_ _use_single_log_writer

NAME                    VALUE     IS_DEF   DSC
----------------------- --------- -------- -----------------------------------------
_use_single_log_writer  ADAPTIVE  TRUE     Use a single process for redo log writing

SQL> -- с доступными значениями
SQL> @pvalid_ _use_single_log_writer

PARAMETER                VALUE      DEFAULT
------------------------ ---------- -------
_use_single_log_writer   TRUE
                         FALSE
                         ADAPTIVE   DEFAULT

и при настройках по умолчанию на моём ноутбуке порождает следующие системные процессы с соответствующими ожиданиями и параметрами в «состоянии покоя»:

SQL> select program, process, event, p1text, p1 from v$session where program like '%(LG%';

PROGRAM             PROCESS  EVENT                   P1TEXT     P1
------------------- -------- ----------------------- ---------- ---
ORACLE.EXE (LG00)   2540     LGWR worker group idle  group_id     0
ORACLE.EXE (LG01)   1372     LGWR worker group idle  group_id     1
ORACLE.EXE (LGWR)   2572     rdbms ipc message       timeout    300

со следующими ожиданиями/активностями:

SQL> select s.program, e.event, e.wait_class, e.total_waits
  2    from v$session_event e
  3    join v$session s
  4   using (sid)
  5   where program like '%(LG%'
  6     and e.wait_class not in ('Idle', 'Other')
  7  /

PROGRAM            EVENT                         WAIT_CLASS  TOTAL_WAITS
------------------ ----------------------------- ----------- -----------
ORACLE.EXE (LG00)  Disk file operations I/O      User I/O              1
ORACLE.EXE (LG00)  log file parallel write       System I/O          481
ORACLE.EXE (LG01)  Disk file operations I/O      User I/O              1
ORACLE.EXE (LG01)  log file parallel write       System I/O           30
ORACLE.EXE (LGWR)  Disk file operations I/O      User I/O             15
ORACLE.EXE (LGWR)  control file sequential read  System I/O           27
ORACLE.EXE (LGWR)  control file parallel write   System I/O           26
ORACLE.EXE (LGWR)  log file sequential read      System I/O            6
ORACLE.EXE (LGWR)  log file single write         System I/O            6
ORACLE.EXE (LGWR)  log file parallel write       System I/O          651

— заметно, что рабочие процессы выполняют только операции записи логов совместно с «головным» LGWR при _use_single_log_writer = ADAPTIVE по причине «адаптивного» включения/отключения

При отключении «адаптивности» параметром:

SQL> @param_ _use_single_log_writer
 
NAME                                                     VALUE
-------------------------------------------------------- -----
_use_single_log_writer                                   FALSE

SQL> select s.program, e.event, e.wait_class, e.total_waits
  2    from v$session_event e
  3    join v$session s
  4   using (sid)
  5   where program like '%(LG%'
  6     and e.wait_class not in ('Idle', 'Other')
  7  /
 
PROGRAM            EVENT                          WAIT_CLASS  TOTAL_WAITS
------------------ ------------------------------ ----------- -----------
ORACLE.EXE (LG00)  Disk file operations I/O       User I/O              1
ORACLE.EXE (LG00)  log file parallel write        System I/O         1180 -- *
ORACLE.EXE (LG01)  Disk file operations I/O       User I/O              1
ORACLE.EXE (LG01)  log file parallel write        System I/O           38
ORACLE.EXE (LGWR)  Disk file operations I/O       User I/O             18
ORACLE.EXE (LGWR)  control file sequential read   System I/O           27
ORACLE.EXE (LGWR)  control file parallel write    System I/O           26
ORACLE.EXE (LGWR)  log file sequential read       System I/O            6
ORACLE.EXE (LGWR)  log file single write          System I/O            6

— основная операция log file parallel write ожидаемо выполняется в основном worker-ами

Факт появления дополнительных процессов LGWR может быть обусловлен 12c Multitenant DB:

The many pluggable databases in a single multitenant container database share its memory and background processes

— как предположил Леонид Борчук, однако прямой зависимости кол-ва рабочих процессов LGWR от кол-ва pluggable db мне обнаружить не удалось

Напрямую количество LGWR workers определяется параметром:

SQL> -- по умолчанию на моей тестовой системе
SQL> @param_ _max_outstanding_log_writes

NAME                         VALUE  IS_DEF  DSC
---------------------------- ------ ------- ---------------------------------------------
_max_outstanding_log_writes  2      TRUE    Maximum number of outstanding redo log writes

SQL> alter system set "_max_outstanding_log_writes"=4 scope=spfile;

System altered.

SQL> startup force

SQL> select program from v$session where program like '%(LG%';

PROGRAM
-----------------
ORACLE.EXE (LG01)
ORACLE.EXE (LG03)
ORACLE.EXE (LG00)
ORACLE.EXE (LG02)
ORACLE.EXE (LGWR)

В свою очередь параметр _max_outstanding_log_writes является вычисляемым на основе, в частности, общего зарегистрированного в системе (не физического) количества ЦПУ (что логично с распостранением многоядерных систем) приблизительно как cpu_count/2

Например, на том же ноутбуке с 2-х ядерным процессором + Hyper-Threading:

SQL> show parameter cpu_count

NAME                                 TYPE        VALUE
------------------------------------ ----------- -----
cpu_count                            integer     4

SQL> -- увеличить кол-во ЦПУ я не могу, могу уменьшить
SQL> alter system set cpu_count=1 scope=spfile;

System altered.

SQL> startup force

SQL> -- после чего вместе с cpu_count уменьшается и значение
SQL> @param_ _max_outstanding_log_writes

NAME                                                     VALUE
-------------------------------------------------------- -----
_max_outstanding_log_writes                              1    

SQL> -- , соответственно, меняется кол-во LGWR процессов
SQL> select program from v$session where program like '%(LG%';

PROGRAM
----------------------------------------------------------------
ORACLE.EXE (LGWR)

Деятельность вспомогательных процессов LGWR регулируется появившимися в 12c параметрами:

SQL> @param_ worker
 
NAME                                                     VALUE  IS_DEF   DSC
-------------------------------------------------------- ------ -------- -----------------------------------------------------------------
_adaptive_scalable_log_writer_disable_worker_threshold   90     TRUE     Percentage of overlap across multiple outstanding writes
_adaptive_scalable_log_writer_enable_worker_threshold    200    TRUE     Increase in redo generation rate as a percentage
_log_writer_worker_dlm_hearbeat_update_freq              5000   TRUE     LGWR worker DLM health-monitoring heartbeat update frequency (ms)
_serial_log_write_worker_io                              FALSE  TRUE     Serialize log write slave I/O

и отражается выделенными (пока для 8-ми групп worker-ов) статистиками:

SQL> select name from v$sysstat where name like 'redo%group%' or name like 'redo%adaptive%'
  2  /
 
NAME
----------------------------------------------------------------
redo writes (group 0)
...
redo writes (group 7)
redo writes adaptive all
redo writes adaptive worker
redo blocks written (group 0)
...
redo blocks written (group 7)

При этом на *nix системах установка параметра threaded_execution = true может привести к выполнению LGWR вместе с рабочими процессами одним процессом ОС, что, видимо, совсем неинтересно в плане выигрыша скорости записи логов — см. Update в Jonathan Lewis.12c

Добавить комментарий »

Комментариев нет.

RSS feed for comments on this post. TrackBack URI

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

Блог на WordPress.com.

%d такие блоггеры, как: