LGWR priority

Как я обещал, ниже первый пост из серии "как я провел лето".

В нашей системе,  достаточно жесткой  OLTP, 256 core, AIX 7, Power 7, сессии испытавали проблемы с событием ожидания log file sync. Сразу скажу, что на 99,99% проблему тут стоит искать в вводе-выводе. Так оно в конце концов и оказалось конечно же.

А пока мы ломали голову над  записями  в файле _lgwr_PID.trc

Warning: log write elapsed time 888ms, size 252KB

*** 2011-11-18 01:55:57.286
Warning: log write elapsed time 535ms, size 2529KB

*** 2011-11-18 01:55:57.924
Warning: log write elapsed time 560ms, size 99KB

*** 2011-11-18 01:56:00.852
Warning: log write elapsed time 541ms, size 3688KB

Оказалось, что при превышении timeout одной операции (?) LGWR более чем на 500 ms (есть скрытый параметр определяющий порог, но я не смог его найти во время написания этого поста) Oracle начиная с версии 10.2.0.4 (MOS 601316.1) начинает фиксировать  данные события.

Горячие головы на различных форумах предлагают установить событие 10468 чтобы исключить появления этих записей, но на мой взгляд, появления записей однозначно говорит о наличии проблемы и ее необходимо найти.

Не скрою, первое подозрение пало на дисковый массив. Однако проблему удалось найти не в самом дисковом массиве, но в I/O path. Система очень комплексная, очень большое количество вендоров задействовано, и конечно проблемы на стыке были более,  чем ожидаемые. Если вы увидите на AIX подобную проблему, свяжитесь со мной,  и я смогу понять та же у Вас проблема или нет. Пока не могу рассказать больше деталей.

Но пока мы разбирались с этой проблемой появилась идея, что неплохо бы и помочь LGWR в работе. Процессоров огромное количество в машине, процессов еще больше, и получается, что хотя все сессии ждут LGRW приоритет у него совершенно такой же как у всех остальных процессов.  Вы видите на рисунке слева (Tanel Poder, Understanding LGWR, Log File Sync Waits and Commit Performance) что ожидание в очереди процессов LGWR  вполне себе входит во время ожидания log file sync.


Оказалось, что в AIX по умолчанию все процессы получают приоритет 60 (на самом деле base priority 40 и nice 20 = 60).

#ps -ef -o pid,pri,sched,nice,args |egrep 'lgwr' |grep -v grep
PID     PRI SCH NI COMMAND
2432232  60   0 20 ora_lgwr_cardway

Казалось бы необходимо воспользоваться nice/renice чтобы получить требуемое. Но на самом деле не все так просто, и, простыми словами, nice = "nice to have", а вовсе не жесткое указание приоритета. К тому же пришлось бы так делать каждый раз после старта БД руками. Оказывается, что в AIX можно выставить фиксированный приоритет  < 40 с помощью системного вызова setpri(). Я уже почти запускал компилятор, когда оказалось, что у Oracle есть скрытый параметр _high_priority_processes с помощью которого можно указать каким процессам мы хотим повысить приоритет:

alter system set "_high_priority_processes"='LGWR|PMON' scope=spfile;

При этом убедитесь пожалуйста что данный запрос также возвращает 1

select a.ksppinm "Parameter",
 b.ksppstvl "Session Value",
 c.ksppstvl "Instance Value"
 from x$ksppi a, x$ksppcv b, x$ksppsv c
 where a.indx = b.indx and a.indx = c.indx
 and a.ksppinm like '%os_sched%'


И даже это еще  не все. У меня все заработало только после того,  как я добавил capability CAP_NUMA_ATTACH пользователю Oracle. Хотя возможно,  это и не обязательно. 


Вот как выглядит теперь правильная картинка: PRI=39, NI="--"

#ps -ef -o pid,pri,sched,nice,args |egrep 'lgwr' |grep -v grep
PID     PRI SCH NI COMMAND
3544740  39   2 -- ora_lgwr_cardway


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

Является ли данный метод действенным способом уменьшить событие log file sync во всех случаях ? Если проблема заключается в вводе-выводе в redo logs,  то скорее нет. Но после исключения проблем ввода вывода, и если у Вас OLTP, и если у Вас много процессоров  - почему бы и не попробовать ?

Поскольку требуется выставлять скрытый параметр, то вам лучше перед его использованием проконсультироваться с Oracle Support. Но они не будут очень возражать, поскольку, как мне кажется, тот же самый механизм используется для выставления приоритета процессу LMS в RAC.

PS Над проектом работала большая команда, поэтому все обнаруженные улучшения/настройки являются коллективным трудом.

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

  1. Анонимный13/12/11 12:15 AM

    рассказал бы лучше об использовании SMT4 в проекте :) а то "досужие размышления" про LFS - это неконструктивно.

    ranger.

    ОтветитьУдалить
  2. Анонимный13/12/11 11:43 AM

    Так в итоге записей в трейсе то меньше стало?

    ОтветитьУдалить
  3. >рассказал бы лучше об использовании SMT4 в проекте
    Никаких проблем. Один из следующих постов напишу про это. Вижу что никак тебе это не дает покоя -)

    >а то "досужие размышления" про LFS
    Не понял ничего из того что ты написал.

    >Так в итоге записей в трейсе то меньше стало?

    CPU scheduler не может (как я теперь думаю) приводить в задержкам более ~ms ни при каких обстоятельствах. Таким образом настройки приоритета это гораздо более тонкий тюнинг чем тот, который требуется для "убирания" записей c сотнями ms из лога

    ОтветитьУдалить
  4. Анонимный13/12/11 2:24 PM

    Там еще делали настройки операционки и файловых систем. Об этом, к сожалению, ни слова. Пост в результате получился несколько однобоким.

    ОтветитьУдалить
  5. >Там еще делали настройки
    Там еще делали много чего. Поэтому в самом верху написано "первый пост из серии"

    >Пост в результате получился несколько однобоким.
    Они все буду несколько однобокими - с той стороны как это вижу я -)))

    ОтветитьУдалить
  6. Роберт Олийниченко13/12/11 8:43 PM

    Посмотрел, что по умолчанию в 11.2 значение _high_priority_processes = 'LMS*|VKTM' . Не мешает этот факт учесть и задавать новое значение как 'LMS*|VKTM|LGWR|PMON'

    ОтветитьУдалить
  7. Анонимный14/12/11 12:51 AM

    не стоит никогда ничего задавать "просто так". особенно - для таких процессов как lgwr/pmon. чревато.

    ranger.

    ОтветитьУдалить
  8. Похожую проблему аналогичным образом лечили на M8000.

    Вообще решение старо, ему как минимум 15 лет. Во времена медленных процессоров привязывали критичные процессы (dbw\lgwr) к группе процессоров, тогда процессор=ядро было.

    ОтветитьУдалить
  9. >не стоит никогда ничего задавать "просто так".

    Кэп, ты хоть пост прочитал ?

    >Вообще решение старо, ему как минимум 15 лет

    _high_priority_processes появился в 10.2 (я так думаю)

    >привязывали критичные процессы (dbw\lgwr) к группе процессоров

    вот этому решению 15 лет, но оно до сих пор работает -)

    Но это другое решение нежели приоритет

    ОтветитьУдалить
  10. > Но это другое решение нежели приоритет

    метод другой, смысл тот же самый. Дать больше CPU ресурсов критичным процессам, а достигается это приоритетом или жесткой привязкой к процессору не важно.
    Не понятно, почему оракл этого сам по умолчанию не делает. Допилят к 14ой версии :)

    ОтветитьУдалить
  11. Анонимный31/1/12 1:25 PM

    >есть скрытый параметр определяющий порог, но я не смог его найти во время написания этого поста

    _lgwr_ns_nl_min

    ОтветитьУдалить
  12. Анонимный31/1/12 1:26 PM

    > есть скрытый параметр определяющий порог, но я не смог его найти во время написания этого поста


    _lgwr_ns_nl_min ?

    ОтветитьУдалить
  13. Анонимный6/3/12 2:53 PM

    Статья интересная. Сейчас идет война (правда на system x и Sless с Oracle 10.2.0.5) с I/O path. Очень интересны наработки. Просто скорость и LGWR и DBWR в разы ниже возможностей storage, да и операционка загружена не более чем на 20-30% при том, что оракл считает, что задержки по вводу\выводу перешли все разумные границы...

    ОтветитьУдалить
  14. Анонимный7/8/12 5:20 PM

    Дмитрий, не так давно обнаружил у себя эти события. В принципе они достаточно редкие и по awr проблем c log_file_sync нет, но академический интерес есть ) Система AIX6.1(Power 750) + DS5300

    ОтветитьУдалить
  15. Анонимный3/11/14 2:51 PM

    Hello Dmitry! We have AIX6.1 (Power 750), GPFS 3.1 with EMC , Oracle 11.2.0.4 .
    We have those lgwr trace file where it complaints about log write elapsed time.
    Do you remember what exactly was the problem with IO path ? :)
    thanks,Linda

    ОтветитьУдалить
    Ответы
    1. Hi Linda, pls fell free to contact me dsvolk at gmail dot com from your working email address. Please also attach alert.log. Thank you.

      Удалить