IBM AIX with Oracle Database performance: a beginner’s guide

Пока я тут с трудом раз в неделю пишу по 1 посту про Oracle Database on AIX коллеги успевают написать целую статью: IBM AIX with Oracle Database performance: a beginner’s guide. Кстати, и вовсе у не такой и beginner's как скромничает автор - там тебе и примеры с OSWatcher, и Nmon, и Responce Time формула. Главное - это наличие разобранных примеров.
Наверно, можно найти в этом документе какие-то шероховатости, но в целом я очень доволен и рекомендую к изучению.

В качестве демонстрации шероховатостей я захотел придраться вот к этой формуле (стр 3):
"
On Power 7 system performance is degraded when Number of Active Sessions  >  4 x Number of Cores x 3. 
"
4 - это максимально возможное число одновременных потоков для Power 7.
3 - это магическая константа, которую я также долго использовал для определения загруженности процессоров на старых Sun машинах - если на каждый поток приходится больше 3 ожидающих процессов  - значит  процессоры не справляются. Ну по порядку:

0. К сожалению, нет точной цифры сколько пользовательских задач (мы понимаем, что задачи это сессии Oracle)  на thread приводят к его 100% утилизации. Скорее, можно было бы говорить сколько потоков на ядро, но и таких оценок официально нет.  Представляется вероятным, что скорее всего это будет где то между 4 и  8. Другими словами, 4 ядра в режиме SMT OFF у меня выдерживали 32 одновременно работающие задачи (коэфф 8),  и эти же 4 ядра в режиме SMT 4 справлялись с 64 потоками (кoэф 4). Процессор Power 7 вообще потрясающе устойчив к большим загрузкам. 256 ядерная машина может работать в 100% загрузке затрачивая  на ядро порядка 7% (и это при некоторых отягощяющих обстоятельствах)

Есть еще одно обстоятельство: правду о загрузке LPAR дает только команда

lparstat

System configuration: type=Dedicated mode=Capped smt=Off lcpu=256 mem=2020352MB 

%user  %sys  %wait  %idle
----- ----- ------ ------
  0.5   0.7    0.3   98.5 


А правду о загрузке фического ядра дает специальный регистр PURR. Если вы задумаетесь, то поймете, что можно вполне увидеть 4 потока одного ядра загруженные на 100%, это же не значит, что ядро загружено на 400%, так ли  ?


1. Теперь  необходимо убедиться, а сколько действительно  работает потоков - режим smt может быть как выключен, так и включен в 2 и 4.  В AWR на AIX число потоков показывается в колонке CPUs, число ядер - в колонке  Cores -)


Однако, это самый простой случай в мире, когда у нас в нашу LPAR выделены физические ядра и наша LPAR - dedicated. Это значит, что другие задачи в других LPAR не могут претендовать на ресурсы наших ядер (Cores).

Однако весьма распространены ситуации, когда LPAR сделаны как shared , или dedicated donation. Надо быть тут очень внимательным чтобы не попасться в ловушку -)


2.   Average Active Sessions определятся как DB Time/Elapsed Time. Прекрасные ссылки (первая, вторая) из которых можно найти, что в DB Time входят не только время on CPU, но и I/O wait, и время на прочие ожидания.


Если рассмотреть как вырожденный случай, систему в которой сессии постоянно ждут ввода-вывода (db file sequencial read/db file scattered read) DB Time получится высокий и мы сможем прийти к заключению что проблемы с загрузкой процессоров, в то время как они с вводом-выводом.

Повторю - статья мне понравилась, рекомендую. Нормальный баланс между объемом информации и детальностью изложения. 

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

  1. Анонимный1/8/12 5:39 PM

    These queries should be reviewed with the developer’s team to get a better design for the query.
    Looking at the first query; we would estimate that it is a query with a high cost of 3032, as shown in
    the following report. Experience shows a heavy query has a cost above 1000.
    -----------------

    Examining the SQL for the query shows that there are some possible improvements that could be
    made, for this query they would be:

    Replace the count(*) by count(1).
    Avoid full table scans.
    --------------
    Страница 19-20, манипуляции с индексом это уже ни в какие ворота.
    ---------------

    Зачотная статья. Рекомендую не позориться и стереть.

    ОтветитьУдалить
    Ответы
    1. Анонимный2/8/12 10:15 AM

      нет-нет, просьба не стирать - этот перл должен остаться в веках для потомков!

      Удалить
  2. Анонимный2/8/12 4:08 AM

    Дмитрий, попросите отрецензировать эту статью тем, кто знает английский и оракл. Идея написать статью хорошая, примеры хорошие, но само содержание и язык за гранью добра и зла.

    ОтветитьУдалить
  3. Дмитрий Алергант9/8/12 4:15 AM

    Дмитрий, здравствуйте. Раз уж вы написали на эту тему, можете дополнительно поделиться опытом?)

    Чем вообще может быть обусловлена большая разница между DB Time и суммой всех foreground wait events (включая CPU Time)? Грубо говоря, в разделе AWR Foreground Wait Class вижу строку "Captured Time accounts for 56% of Total DB time" (в разные часы/дни от 50 до 60%).

    Похожая ситуация видна и на скриншоте в приведенной вами статье в первом кейсе: там нет полного списка wait events (только Top5), сумма по top5 дает 70%, и поскольку пятый дает всего 0.6%, то оставшийся хвост уже врядли сможет добить целых 30%.


    Одно объяснение удалось нагуглить - якобы так должна вести себя система, перегруженая по CPU (большой runqueue, ось вытесняет процессы). Но это не наш случай, согласно NMON система недогружена:

    LPAR Dedicated Capped (10 ядер), SMT=4. CPU_ALL нигде (почти нигде) не достигает 100%. RunQueue по тому же Nmon - плавает вместе с нагрузкой на CPU, но нигде не достигает 40шт.

    В приведенной вами статье в третьем кейсе предложено объяснение что расхождение могут вызвать незавершенные/неуспешные запросы не попавшие в репозитарий, но в нашем случае это не подтверждается логами приложения

    Где еще искать пропавшие 40% перформанса?


    В аналогичной по назначению базе (то же приложение, правда другая нагрузка и другое окружение) на Intel проблемы нет, CPU Time + foreground events суммируются в 100% DB Time (даже 100.5%)

    Спасибо!

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

      Вряд ли это по адресу вопрос. Судя по этому:

      256 ядерная машина может работать в 100% загрузке затрачивая на ядро порядка 7% (и это при некоторых отягощяющих обстоятельствах)

      и про магическую цифру 3, Дмитрий вряд ли хорошо понимает работу процессов и CPU.
      ...
      >> В приведенной вами статье...
      Не читайте эту статью.
      ...
      >> RunQueue по тому же Nmon - плавает вместе с нагрузкой на CPU, но нигде не достигает 40шт.
      У вас 40 процессов постоянно сидят в очереди ? Так чего же вы удивляетесь?

      Удалить
    2. Анонимный11/8/12 1:01 PM

      Покажи секцию OS Statistics из своего AWR

      Удалить
  4. >Чем вообще может быть обусловлена большая разница между DB Time и суммой всех foreground wait events
    Это интересно. Опубликуйте пожалуйста nmon и AWR, я посмотрю.

    ОтветитьУдалить
  5. >Дмитрий вряд ли хорошо понимает работу процессов и CPU.

    Это верно подмечено. Мне с большим трудом дается понимание работы процессов. Например: в чем смысл жизни процессов, зачем они вообще работают, эти процессы ? -)

    >У вас 40 процессов постоянно сидят в очереди? Так чего же вы удивляетесь?

    Вам нужно открыть для себя AIX. vmstat в AIX показывает run queue не только процессы, ожидающие процессора, но и те, которые исполняются. Таким образом у Дмитрий Алерганта всегда есть свободное CPU.

    ОтветитьУдалить
  6. Анонимный13/8/12 9:19 PM

    >Вам нужно открыть для себя AIX. vmstat в AIX показывает run queue не только процессы,
    >ожидающие процессора, но и те, которые исполняются.
    Дмитрий, полагаю вы хотели сказать, что vmstat в AIX показывает количество runnable тредов как сумму ожидающих (run queue) выполнения и уже выполняющихся.
    Если AIX выдает это значение везде, где у него запрашивают длину run queue (что несколько забавно, написано "очередь" а там... дрова лежат), а конкретно у Дмитрий Алергант Nmon, то я бы ему порекомендовал еще и vmstat приложить к OS Statistics из его AWR.

    ОтветитьУдалить