LGWR priority
Как я обещал, ниже первый пост из серии "как я провел лето".
В нашей системе, достаточно жесткой OLTP, 256 core, AIX 7, Power 7, сессии испытавали проблемы с событием ожидания log file sync. Сразу скажу, что на 99,99% проблему тут стоит искать в вводе-выводе. Так оно в конце концов и оказалось конечно же.
А пока мы ломали голову над записями в файле_lgwr_PID.trc
Оказалось, что при превышении 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).
Казалось бы необходимо воспользоваться nice/renice чтобы получить требуемое. Но на самом деле не все так просто, и, простыми словами, nice = "nice to have", а вовсе не жесткое указание приоритета. К тому же пришлось бы так делать каждый раз после старта БД руками. Оказывается, что в AIX можно выставить фиксированный приоритет < 40 с помощью системного вызова setpri(). Я уже почти запускал компилятор, когда оказалось, что у Oracle есть скрытый параметр _high_priority_processes с помощью которого можно указать каким процессам мы хотим повысить приоритет:
При этом убедитесь пожалуйста что данный запрос также возвращает 1
И даже это еще не все. У меня все заработало только после того, как я добавил capability CAP_NUMA_ATTACH пользователю Oracle. Хотя возможно, это и не обязательно.
Вот как выглядит теперь правильная картинка: PRI=39, NI="--"
Коллеги со стороны приложения подтвердили, что видят положительный эффект после данного изменения.
Является ли данный метод действенным способом уменьшить событие log file sync во всех случаях ? Если проблема заключается в вводе-выводе в redo logs, то скорее нет. Но после исключения проблем ввода вывода, и если у Вас OLTP, и если у Вас много процессоров - почему бы и не попробовать ?
Поскольку требуется выставлять скрытый параметр, то вам лучше перед его использованием проконсультироваться с Oracle Support. Но они не будут очень возражать, поскольку, как мне кажется, тот же самый механизм используется для выставления приоритета процессу LMS в RAC.
PS Над проектом работала большая команда, поэтому все обнаруженные улучшения/настройки являются коллективным трудом.
В нашей системе, достаточно жесткой OLTP, 256 core, AIX 7, Power 7, сессии испытавали проблемы с событием ожидания log file sync. Сразу скажу, что на 99,99% проблему тут стоит искать в вводе-выводе. Так оно в конце концов и оказалось конечно же.
А пока мы ломали голову над записями в файле
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 Над проектом работала большая команда, поэтому все обнаруженные улучшения/настройки являются коллективным трудом.
рассказал бы лучше об использовании SMT4 в проекте :) а то "досужие размышления" про LFS - это неконструктивно.
ОтветитьУдалитьranger.
Так в итоге записей в трейсе то меньше стало?
ОтветитьУдалить>рассказал бы лучше об использовании SMT4 в проекте
ОтветитьУдалитьНикаких проблем. Один из следующих постов напишу про это. Вижу что никак тебе это не дает покоя -)
>а то "досужие размышления" про LFS
Не понял ничего из того что ты написал.
>Так в итоге записей в трейсе то меньше стало?
CPU scheduler не может (как я теперь думаю) приводить в задержкам более ~ms ни при каких обстоятельствах. Таким образом настройки приоритета это гораздо более тонкий тюнинг чем тот, который требуется для "убирания" записей c сотнями ms из лога
Там еще делали настройки операционки и файловых систем. Об этом, к сожалению, ни слова. Пост в результате получился несколько однобоким.
ОтветитьУдалить>Там еще делали настройки
ОтветитьУдалитьТам еще делали много чего. Поэтому в самом верху написано "первый пост из серии"
>Пост в результате получился несколько однобоким.
Они все буду несколько однобокими - с той стороны как это вижу я -)))
Посмотрел, что по умолчанию в 11.2 значение _high_priority_processes = 'LMS*|VKTM' . Не мешает этот факт учесть и задавать новое значение как 'LMS*|VKTM|LGWR|PMON'
ОтветитьУдалитьне стоит никогда ничего задавать "просто так". особенно - для таких процессов как lgwr/pmon. чревато.
ОтветитьУдалитьranger.
Похожую проблему аналогичным образом лечили на M8000.
ОтветитьУдалитьВообще решение старо, ему как минимум 15 лет. Во времена медленных процессоров привязывали критичные процессы (dbw\lgwr) к группе процессоров, тогда процессор=ядро было.
>не стоит никогда ничего задавать "просто так".
ОтветитьУдалитьКэп, ты хоть пост прочитал ?
>Вообще решение старо, ему как минимум 15 лет
_high_priority_processes появился в 10.2 (я так думаю)
>привязывали критичные процессы (dbw\lgwr) к группе процессоров
вот этому решению 15 лет, но оно до сих пор работает -)
Но это другое решение нежели приоритет
> Но это другое решение нежели приоритет
ОтветитьУдалитьметод другой, смысл тот же самый. Дать больше CPU ресурсов критичным процессам, а достигается это приоритетом или жесткой привязкой к процессору не важно.
Не понятно, почему оракл этого сам по умолчанию не делает. Допилят к 14ой версии :)
>есть скрытый параметр определяющий порог, но я не смог его найти во время написания этого поста
ОтветитьУдалить_lgwr_ns_nl_min
> есть скрытый параметр определяющий порог, но я не смог его найти во время написания этого поста
ОтветитьУдалить_lgwr_ns_nl_min ?
>_lgwr_ns_nl_min ?
ОтветитьУдалитьне похоже -(
Статья интересная. Сейчас идет война (правда на system x и Sless с Oracle 10.2.0.5) с I/O path. Очень интересны наработки. Просто скорость и LGWR и DBWR в разы ниже возможностей storage, да и операционка загружена не более чем на 20-30% при том, что оракл считает, что задержки по вводу\выводу перешли все разумные границы...
ОтветитьУдалитьДмитрий, не так давно обнаружил у себя эти события. В принципе они достаточно редкие и по awr проблем c log_file_sync нет, но академический интерес есть ) Система AIX6.1(Power 750) + DS5300
ОтветитьУдалить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
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.
Удалить