ASH - it is a time to rethink what is inside

Пост обновлен  18.07.2014

После публикации первого поста о возможности анализа данных ASH с помощью Tableao, я получил весьма смешной комментарий, что я открыл для себя ASH. Помимо того, что это правда, такое же открытие в этом году сделали и некоторые весьма уважаемые сотрудники Oracle.

Убедительно прошу вас просмотреть одну из лучших презентаций на тему ASH, сделанную в этом году на RMOUG. (на секундочку, это rocky montains oracle users group, и вообще то материалы доступны только участникам. Но поскольку именно эта презентация сделана сотрудниками Oracle, ее выложили. Кстати, если посмотреть на сайт rmoug сразу понятно как должна выглядеть Users Group).

В презентации много интересного, но самое вкусное начинается после слайда "The ASH Fix-up Mechanism". Там рассказывается, как посчитать правильно latency. Большинство людей предполагало, что это avg (time_waited) where time_waited > 0 и можно найти даже книги по Oracle performance с такой формулой.


Все очень просто - запускаем SwingBench, где soe tablespace находится на отдельном устройстве и попробуем определить latency для db file sequential read.

Для контроля, будем использовать несколько источников данных, AWR, и операционную систему.

>iostat -xkd 1 | awk '{ if ($1 != "" &&  $1!="Device:" && $1!="Linux") print strftime("%d/%m/%y %H:%M:%S",systime()),$1,$11 | "tee  iostat.dat" ;}'
и после окончания нагрузки 
>grep sde iostat.dat  | awk '{sum+=$4} END { print "Average = ",sum/NR}'


Результат - 2.6 ms

Теперь AWR - 2 ms. хо-хо - база данных считает, что она читала быстрее чем отдавал диск. Есть несколько объяснений, почему может быть такое, но в целом данные сходятся.






 Тестируем магическую формулу из презентации


Точнее, чем AWR - что не удивительно, поскольку в ASH просто больше данных.

Ну и наконец, посмотрим что нам дает нерекомендованный способ:

Update 1. Это конечно же 5.4 ms. - у меня плохо с операциями деления.


Фантастические данные, но к сожалению не имеющие отношения к реальности.

Мне сложно прямо сходу назвать причину, но если рассмотреть сырые данные, то можно увидеть, что только 1 из многих записей имеет реальное значение порядка 1.6 ms.






В комментариях Игорь обратил внимание что максимум -  1.6 sec, минимум 4.6 ms. Понятно, что одна операция ввода-вывода не может длиться 1 sec - у меня локальные ssd диски. С другой стороны, если это было чтение индекса, операций было много, время которое было затрачено, проставлено только в последней - тогда вроде бы все встает на свои места. Число операций, которые в сумме дали нам 1.6 остается нам неизвестным, посколько были очень короткие, и sample на них просто не попали.



Согласно описанию, по крайне мере как я его понимаю, поскольку все чтения диска длятся очевидно меньше 1 s, time_waited отражает просто момент времени на который пришелся sample. Фактически, мы получим все возможные распределения от 0 до 2.6 ms (которое,  по видимому, отражает реальность).


Вот еще картинка из dba_hist_event_histogram. Oracle считает что да, были события по 2 ms.

Пусть очень мало, но все таки было. Хотя мне кажется, что это что то с аккуратностью сбора  статистики.












PS
Я  разговаривал с одним DBA, который занимается исключительно performance tuning в своей  компании. Так вот, вся команда PT не имеет доступа к production systems. Они могут только запрашивать данные, на основании которых давать свое заключение. Честно говоря, первый раз о таком услышал, что внутри компании такие ограничения. Но вот эта группа не очень чувствует чем им может помочь ASH - они больше ориентируются на AWR, что явно не лучший способ в наше время!

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

  1. У AWR и ASH разная периодичность сбора и, так сказать, уровень гранулированности.
    AWR хорошо получать за прошлый час, день, неделю (при возможности, конечно).
    ASH хорошо берет короткие периоды.
    В AWR есть чудесная штука awrddrpt/awrgdrpt.
    В ASH можно задать при отчете модули/сервисы/экшены.

    Мне приходится пользоваться и тем и другим.
    Через AWR хорошо искать грубые ошибки: неоптимальные запросы которые долго выполняются и т.д.
    В ASH хорошо искать более тонкие вещи, после AWR или если AWR не дал искомого результата.

    ИМХО, каждое для своего.

    ОтветитьУдалить
  2. > этой презентацией/формулой по крайней мере с 2012
    Презентация не абсолютно новая, много слайдов показывают уже давно, вот пример http://www.oracle.com/technetwork/database/manageability/con9577-ash-deep-dive-oow2013-2031468.pdf
    Но формулу я нашел только сейчас. Возможно мешал бан в ggole.

    > по причине непопадания большой доли коротких миллисекундных ожиданий
    Да, тут соглашусь полностью. У меня еще ошибка по тексту - сейчас поправлю

    >John Beresniewicz
    Формула работает! Верните парня обратно!

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

    формула неидеальна, подходит только для коротких и частых ожиданий - парня не вернуть)))

    ОтветитьУдалить
    Ответы
    1. A как можно объяснить 1.6 seс на db file sequential read? Я почти уверен, поскольку мониторил диск, что это не может быть временем одного события. Получается это сумма ожиданий всех событий с момента времени когда данная сессия последний раз была активна? Бррр….

      Удалить
    2. Анонимный18/7/14 2:07 AM

      интересно было бы помониторить V$EVENT_HISTOGRAM - там попадаются интересные вещи,
      в то время как iostat показывает средние значения

      Удалить
    3. О, супер комментарий - я мониторил dba_hist_event_histogram, сейчас . Там действительно есть ожидания ввода-вывода по несколько секунд. Я не могу понять как это получается. Да, iostat показывает средние значения, но поскольку моя база данных лежит на локальном диске, вся на одном и том же, никак не могу понять откуда могут взяться секунды

      Удалить
  4. > хо-хо - база данных считает, что она читала быстрее чем отдавал диск

    Дмитрий, Вы неправильно рассчитываете среднее время:
    1. svctm - усредненное по всем типам обращений к диску, т.е. и read и write
    2. усредняете данные iostat неверно: если в одной строке среднее для тысячи обращений 2ms, а во второй 4ms для сотни, то среднее по двум строкам - 2.18ms, а не 3ms как у Вас.

    ОтветитьУдалить
    Ответы
    1. >1. svctm - усредненное по всем типам обращений к диску, т.е. и read и write
      Это верное замечание. Отдельно к сожалению iostat не дает. Можно только заметить сколько было каких операций ввода вывода и попробовать сделать вывод что операций записи было мало по сравнению с числом операций чтения


      >2. усредняете данные iostat неверно: среднее по двум строкам - 2.18ms,

      Как вы получили 2.18?

      Удалить
    2. > Как вы получили 2.18?

      как в институте учили: (2 * 1000 + 4 * 100) / (1000 + 100), у Вас же в awk считается матожидание измерения без привязки к сути измерения, т.е. (2+4)/2

      Удалить
    3. Спасибо - я попробую посчитать этим способом. По поводу получения service time только операций чтения я открыл для себя https://www.kernel.org/doc/Documentation/iostats.txt

      Удалить