Я начал предисловие так:
Задача оптимизации времени отклика в Oracle, по большей части, решена.
Это утверждение полностью противоречит мрачной картине, нарисованной мною в начале этой главы: «Производительность Oracle для многих представляет серьезную проблему». Такое противоречие требует логичного объяснения. Вот оно:
Ряд технических усовершенствований позволил повысить действенность, эффективность, измеримость, прогнозируемость, достоверность, детерминизм, конечность и практичность в деле оптимизации производительности Oracle.
В частности, я уверен, что нынешний прогресс обязан трем важным достижениям. Любопытно, что, хотя эти достижения лишь недавно вошли в практику работающих с Oracle профессионалов, ни одно из них не является действительно новым. Все они применяются специалистами по оптимизации в несвязанных с Oracle областях, и некоторым из них уже больше века.
Первое важное правило оптимизации Oracle следует из элементарного правила математики:
По агрегированным данным нельзя восстановить составляющие.
Поясню это на таком примере. Предположим, я говорю вам, что среди 1000 камней 999 серых и один особенный, покрашенный в красный цвет. Все камни весят 1000 фунтов. Теперь скажите, сколько весит красный камень? Сказав, что знаете, что красный камень весит один фунт», вы, осознавая это или нет, не дадите правильный ответ. Неизвестно, весит ли красный камень один фунт. Основываясь на предоставленной информации, нельзя это знать. Ответив: «Я предполагаю, что красный камень весит один фунт», вы сделаете слишком самонадеянное предположение, рискуя придти к ошибочным, возможно, катастрофически ошибочным выводам.
Правильный ответ гласит, что красный камень может иметь практически любой вес - от 0 до 1000 фунтов. Единственное ограничение снизу определяется минимальным количеством атомов, которое еще может называться камнем. Определив, насколько малым может быть камень, мы получим и верхнюю границу искомого ответа. Она составит 1000 фунтов за вычетом веса 999 камней минимально возможного размера. Таким образом, вес красного камня может находиться в пределах практически от нуля до тысячи фунтов. Любой ответ с большей точностью будет ошибочным, если только вам не повезет. Но искусству выигрывать в подобных играх нельзя ни научиться, ни научить других, и его нельзя воспроизвести с достаточной достоверностью.
Это одна из причин, по которым специалисты по Oracle так не любят диагностировать проблемы производительности, основываясь на данных общесистемной статистики, вроде той, что предоставляет Stats-pack (или его ближайшие родственники, произошедшие от старых SQL-сценариев bstat и estat). Два аналитика, глядя на одни и те же результаты работы Statspack, могут сделать совершенно разные выводы, причем ни один из них полностью не подтверждается и не опровергается представленными данными. Это не ошибка Statspack. Это принципиальный недостаток метода, отправной точкой в котором служат данные по системе в целом (V$SYSSTAT, V$SYSTEM_EVENT и т. д.). На самом деле с помощью Statspack можно собрать данные с достаточной степенью детализации, но нигде в документации я не встретил ни малейшей попытки объяснить, зачем это может быть необходимо.
Отличной иллюстрацией к сказанному будет случай с Oracle-систе-мой, в которой роль красного камня исполняла проблема формирования платежной ведомости. Руководство компании обрисовало проблему медленного создания платежной ведомости, создающую сложности в ведении бизнеса. Администраторы базы данных обнаружили проблему с защелками, конкретно - с защелками цепочек буферов кэша. Обе точки зрения были хорошо аргументированы. Бизнес действительно страдал из-за медленной обработки ведомостей. Это было очевидно: система выводила чеки с большой задержкой. Сервер тоже страдал вследствие конкуренции за защелки. И это было очевидно: запросы к V$SYSTEM_EVENT ясно показывали, что система тратит массу времени на события ожидания освобождения защелки (latch free).
Системные администраторы и администраторы БД этой компании потратили три месяца на отчаянную борьбу с конкуренцией за защелки, но это нисколько не улучшило ситуацию с платежной ведомостью. Причина оказалась проста: ведомость не ожидала освобождения защелок. Как мы это узнали? Мы получили данные о распределении времени выполнения программы формирования ведомости. Результаты нас удивили. Да, множество других программ действительно проводили время в ожидании защелок цепочек буферов кэша. Но медленная программа формирования ведомости из 1985,40 секунд общего времени выполнения потратила на ожидание защелок лишь 23,69. Это составляет 1,2% от общего времени. Если бы компания полностью исключила ожидания освобождения защелок в своей системе, скорость формирования платежной ведомости возросла бы всего на 1,2%.
Почему же общесистемная статистика может так вводить в заблуждение? Да, множество других программ простаивало из-за проблем с освобождением защелок. Но было большой ошибкой предполагать, что проблема данной программы и проблема системы в целом - это одно и то же. Ложная предпосылка о наличии причинно-следственной связи между ожиданием освобождения защелок и медленным формированием ведомости стоила компании трех месяцев потраченного времени, разочарования и нескольких тысяч долларов на оплату работ и модернизацию оборудования. В противоположность этому, определение истинной причины низкой производительности заняло около десяти минут с того момента, как компания получила корректные диагностические данные.
Я и мои коллеги регулярно сталкиваемся с подобными проблемами. Для аналитика по производительности решение заключается в том, чтобы сосредоточиться на пользовательских операциях, требующих оптимизации. Бизнес может определить, какие операции самые важные, система - нет. Если определены процедуры, требующие оптимизации, то главной задачей становится сбор данных о выполнении именно этих процедур - не больше и не меньше.
Последние пару десятилетий специалисты по производительности Oracle исходили из предположения, что объективное измерение времени отклика Oracle невозможно [Ault and Brinson (2000), 27]. В отсутствие путей достоверного измерения времени отклика они взяли следующий по важности показатель: счетчики событий (event counts). За счетчиками, естественно, последовали коэффициенты. А за коэффициентами -разного рода доводы о том, какие действия по «настройке» важны, акакие - нет.
Однако пользователей не заботят счетчики, коэффициенты и аргументы за и против; их интересует время отклика - продолжительность ожидания от того момента, когда они сделали запрос, до получения ответа. Неважно, насколько изощренно обрабатываются данные, основанные на счетчиках событий и не содержащие сведений о времени. Тщетность усилий обусловлена неизбежным фактом, лежащим в основе второго важного правила:
Нельзя судить о длительности события по количеству его возникновений.
Пользователей волнует только время отклика. Занимаясь счетчиками событий, вы измеряете не то, что их действительно интересует. Если вам понравилась задача про красный камень, вот вам еще одна: что мешает выполняться программе, порождающей приведенные ниже данные?
Пример 1.1. Составляющие времени отклика в порядке убывания количества
В примере 1.2 показаны результаты того же прогона программы, но здесь они дополнены данными о распределении времени (в секундах) и отсортированы по убыванию своего вклада в общее время ответа. Ваш ответ изменился?
Разумеется, ответ изменился - время отклика имеет решающее значение, по сравнению с ним счетчики событий малоинтересны. Для рассматриваемой программы критичной является составляющая SQL*Net
message from client, а вовсе не CPU service.
Те, у кого есть опыт анализа производительности Oracle, наверняка слышали, что событие SQL*Net message from client - это co-бытие простоя и может быть проигнорировано. Такие события нельзя игнорировать, если диагностика выполняется способом, описанным в главе 3.
Если бы дело происходило в 1991 г., у нас возникли бы серьезные затруднения, т. к. в то время ядро Oracle не могло предоставить данные, показанные во второй таблице. Но если обновить Oracle хотя бы до версии 7, то счетчики событий перестанут быть «следующими по важности» после времени отклика показателями. Начиная с Oracle 7.0.12 основополагающий тезис, утверждающий, что невозможно судить о времени выполнения операций ядром Oracle, больше не действует.
Последнее из упоминавшихся мною «великих достижений» в оптимизации производительности Oracle основано на опубликованном в 1967 г. Джином Амдалом (Gene Amdahl) наблюдении, названном впоследствии законом Амдала [Amdahl (1967)]:
Увеличение производительности, достигаемое некоторым усовершенствованием, ограничено потребляемой усовершенствованным компонентом долей общего времени выполнения.
Другими словами, повышение производительности пропорционально доле, занимаемой улучшаемым компонентом в процессе выполнения программы. Закон Амдала объясняет, почему составляющие времени отклика следует рассматривать в порядке убывания. Именно поэтому в примере 1.2 не следует заниматься «проблемой» CPU service, не разобравшись предварительно с проблемой SQL*Net message from client. Если потребление процессорного времени уменьшится на 50%, то время отклика улучшится всего на 2%. Но если удастся уменьшить на те же 50% составляющую SQL*Net message from client, то общее время отклика уменьшится на 46%. В примере 1.2 каждый процент уменьшения SQL*Net message from client дает эффект приблизительно в двадцать раз больший, чем один процент уменьшения CPU service.
Закон Амдала формализует здравый смысл применительно к оптимизации. Он поясняет, как достичь наибольшей отдачи от вложенных в повышение производительности усилий.
Собираем воедино
Объединив три рассмотренных принципа технологии оптимизации Oracle в одном предложении, получим следующее простое правило:
В первую очередь следует стремиться к уменьшению самой значимой составляющей времени отклика в наиболее критичных для бизнеса операциях.
Казалось бы, просто, не так ли? Тем не менее я почти полностью уверен, что вы не придерживаетесь этого правила при оптимизации своих Oracle-систем. Этому правилу не следуют ваши консультанты и применяемые вами инструменты. Такой способ настройки не имеет ничего общего с рекомендациями, данными в книгах и в большинстве материалов семинаров и конференций по Oracle, начиная с 1980 г. В чем же дело?
А в том, что этот простой метод оптимизации Oracle-систем недоступен тому, кто не умеете измерять время отклика и интерпретировать полученные результаты. Как раз этой теме и посвящена основная часть этой книги.
Я надеюсь, что когда вы прочитаете эту книгу, мое утверждение «сейчас вы делаете это не так» уже потеряет актуальность. Сейчас, когда я пишу эту главу, имеются свидетельства того, что описываемый мной способ оптимизации набирает популярность среди пользователей Oracle. Хорошо, если книга, которую вы держите в руках, способствовала этой эволюции.
< Предыдущая | Следующая > |
---|