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, что явно не лучший способ в наше время!
После публикации первого поста о возможности анализа данных 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.6 sec, минимум 4.6 ms. Понятно, что одна операция ввода-вывода не может длиться 1 sec - у меня локальные ssd диски. С другой стороны, если это было чтение индекса, операций было много, время которое было затрачено, проставлено только в последней - тогда вроде бы все встает на свои места. Число операций, которые в сумме дали нам 1.6 остается нам неизвестным, посколько были очень короткие, и sample на них просто не попали.
Вот еще картинка из dba_hist_event_histogram. Oracle считает что да, были события по 2 ms.
Пусть очень мало, но все таки было. Хотя мне кажется, что это что то с аккуратностью сбора статистики.
PS
Я разговаривал с одним DBA, который занимается исключительно performance tuning в своей компании. Так вот, вся команда PT не имеет доступа к production systems. Они могут только запрашивать данные, на основании которых давать свое заключение. Честно говоря, первый раз о таком услышал, что внутри компании такие ограничения. Но вот эта группа не очень чувствует чем им может помочь ASH - они больше ориентируются на AWR, что явно не лучший способ в наше время!
У AWR и ASH разная периодичность сбора и, так сказать, уровень гранулированности.
ОтветитьУдалитьAWR хорошо получать за прошлый час, день, неделю (при возможности, конечно).
ASH хорошо берет короткие периоды.
В AWR есть чудесная штука awrddrpt/awrgdrpt.
В ASH можно задать при отчете модули/сервисы/экшены.
Мне приходится пользоваться и тем и другим.
Через AWR хорошо искать грубые ошибки: неоптимальные запросы которые долго выполняются и т.д.
В ASH хорошо искать более тонкие вещи, после AWR или если AWR не дал искомого результата.
ИМХО, каждое для своего.
> этой презентацией/формулой по крайней мере с 2012
ОтветитьУдалитьПрезентация не абсолютно новая, много слайдов показывают уже давно, вот пример http://www.oracle.com/technetwork/database/manageability/con9577-ash-deep-dive-oow2013-2031468.pdf
Но формулу я нашел только сейчас. Возможно мешал бан в ggole.
> по причине непопадания большой доли коротких миллисекундных ожиданий
Да, тут соглашусь полностью. У меня еще ошибка по тексту - сейчас поправлю
>John Beresniewicz
Формула работает! Верните парня обратно!
формула неидеальна, подходит только для коротких и частых ожиданий - парня не вернуть)))
ОтветитьУдалитьA как можно объяснить 1.6 seс на db file sequential read? Я почти уверен, поскольку мониторил диск, что это не может быть временем одного события. Получается это сумма ожиданий всех событий с момента времени когда данная сессия последний раз была активна? Бррр….
Удалитьинтересно было бы помониторить V$EVENT_HISTOGRAM - там попадаются интересные вещи,
Удалитьв то время как iostat показывает средние значения
О, супер комментарий - я мониторил dba_hist_event_histogram, сейчас . Там действительно есть ожидания ввода-вывода по несколько секунд. Я не могу понять как это получается. Да, iostat показывает средние значения, но поскольку моя база данных лежит на локальном диске, вся на одном и том же, никак не могу понять откуда могут взяться секунды
Удалить> хо-хо - база данных считает, что она читала быстрее чем отдавал диск
ОтветитьУдалитьДмитрий, Вы неправильно рассчитываете среднее время:
1. svctm - усредненное по всем типам обращений к диску, т.е. и read и write
2. усредняете данные iostat неверно: если в одной строке среднее для тысячи обращений 2ms, а во второй 4ms для сотни, то среднее по двум строкам - 2.18ms, а не 3ms как у Вас.
>1. svctm - усредненное по всем типам обращений к диску, т.е. и read и write
УдалитьЭто верное замечание. Отдельно к сожалению iostat не дает. Можно только заметить сколько было каких операций ввода вывода и попробовать сделать вывод что операций записи было мало по сравнению с числом операций чтения
>2. усредняете данные iostat неверно: среднее по двум строкам - 2.18ms,
Как вы получили 2.18?
> Как вы получили 2.18?
Удалитькак в институте учили: (2 * 1000 + 4 * 100) / (1000 + 100), у Вас же в awk считается матожидание измерения без привязки к сути измерения, т.е. (2+4)/2
Спасибо - я попробую посчитать этим способом. По поводу получения service time только операций чтения я открыл для себя https://www.kernel.org/doc/Documentation/iostats.txt
Удалить