адежность спецификации
Спецификация проекта может считаться «надежной», только если любой проект, который в точности последовал «букве» спецификации, достиг и той цели, которая ставилась перед началом проекта. К несчастью, большинство спецификаций проектов по повышению производительности ненадежны. Спецификация может содержать такие требования:
Максимально равномерно распределить дисковый ввод/вывод по нескольким дисковым устройствам.
Обеспечить не менее x% незанятых ресурсов ЦПУ в часы пиковой нагрузки.
Увеличить коэффициент попаданий в кэш буферов базы данных как минимум до x%.
Исключить все полные просмотры таблиц в системе.
Каждое из этих требований ненадежно в том смысле, что их выполнение может не привести к желаемому изменению в поведении системы. Определить, надежна ли спецификация, вам поможет простая игра:
Для того чтобы выяснить, надежна ли спецификация проекта по повышению производительности, задайте себе вопрос: «Можно ли выполнить требования спецификации, не повысив при этом производительность системы?».
Вот хороший способ сыграть в такую игру: представить себе злого джинна. Может ли злой джинн, следуя букве вашего желания (спецификации проекта), привести проект к результату, противоречащему вашей очевидной цели? Если злому джинну удастся, выполнив условия спецификации проекта, создать систему с неудовлетворительной производительностью, то это и будет доказательством ненадежности такой спецификации.
Прием с игрой в злого джинна применял в своих мысленных экспериментах Рене Декарт (Rene Descartes) в 1600-х годах, и, сравнительно недавно, героиня Элизабет Херли (Elizabeth Hurley) в фильме «Bedazz-led» (в российском прокате - «Ослепленный желаниями»). Вот как злой джинн мог бы сыграть по приведенным выше правилам:
Максимально равномерно распределить дисковый ввод/вывод по нескольким дисковым устройствам
Такое требование вполне оправданно, если вы пытаетесь предотвратить ухудшение производительности при конфигурировании новой системы, но с точки зрения проекта по повышению производительности оно представляется ненадежным. Во многих системах ощутимое повышение производительности дискового ввода/вывода сказывается на общей производительности незначительно или даже отрицательно.
Представьте, например, систему, в которой каждый из наиболее важных бизнес-процессов, требующих ускорения, расходует на операции дискового ввода/вывода менее 5% от общего времени отклика. (На сайте hotsos.com есть сотни трассировочных файлов с такими данными.) В этой системе никакая «настройка» ввода/вывода не приведет к ускорению работы более чем на 5%. Поскольку равномерное распределение ввода/вывода по нескольким устройствам может и не привести к сколько-нибудь значимому приросту производительности, это требование ненадежно.
Обеспечить не менее x% свободных ресурсов ЦПУ в часы пиковой нагрузки
У злого джинна есть несколько способов выполнить такое требование, не затронув производительность системы. Один из них - создать узкое место в дисковом вводе/выводе, например, поместив всю базу данных на один гигантский накопитель с низкой пропускной способностью. По мере роста очереди пользовательских процессов на ввод/вывод будет увеличиваться и неиспользуемая часть мощности процессора. Выполнение этого требования может привести к снижению производительности, следовательно, это требование ненадежно.
Увеличить коэффициент попаданий в кэш буферов БД минимум до x%
И это просто: воспользуйтесь новой демонстрационной программой Коннора МакДональда (Connor McDonald), приведенной в приложении C. Вы узнаете, как увеличить коэффициент попаданий в кэш буферов до любого количества девяток, загружая процессор ненужной работой. Такая дополнительная нагрузка, разумеется, снизит производительность системы, зато «улучшит» коэффициент попаданий. Конечно, программа Коннора - это трюк, демонстрирующий ошибочность представления о коэффициенте попадания, как о критерии качества системы. (Мне достоверно известно, что Коннор -не злой, хотя и был однажды замечен в поведении, отчасти присущем джинну .)
Есть и более изощренные способы снижения производительности системы при одновременном «улучшении» коэффициента попаданий в кэш. Например, так часто поступают «настройщики» SQL, привлекаемые в проект для исключения операций полного просмотра TABLE SCAN FULL (обсуждаемых в следующей спецификации). Еще один способ, которым злой джинн может увеличить коэффициент попаданий в кэш, снизив при этом производительность, заключается в уменьшении размера буфера для выборки массивом1 до одной строки [Millsap (2001b)]. В силу того, что можно так просто увеличить коэффициент попаданий в кэш буферов, снизив при этом производительность системы, данное требование следует признать исключительно ненадежным.
Исключить все полные просмотры таблиц в системе
К сожалению, многие из тех, кто изучает оптимизацию производительности SQL, очень рано усваивают ошибочное эмпирическое правило, утверждающее, что «полные просмотры таблиц всегда вредны». Злой джинн легко состряпает сотни команд SQL, производительность которых будет падать при исключении операции TABLE
SCAN FULL [Millsap (2001b); (2002)]. Из-за того, что исключение полного просмотра таблиц способно реально снизить производительность, такое требование не может служить надежной основой для спецификации проекта по повышению производительности.
Избежать ненадежности спецификации проекта очень легко. Просто говорите, что думаете. Хотя, конечно, по такой логике играть в гольф несложно: достаточно забивать мяч в лунку каждым ударом. Трудность борьбы с ненадежностью спецификаций в том, чтобы сформулировать действительные требования таким способом, который не приведет впоследствии к ошибкам. Например, спецификация, более точно отражающая фактическое намерение, может выглядеть так:
Ускорить работу системы.
Однако даже такая спецификация ненадежна. Я встречал десятки проектов, выполненных по такой спецификации, формально успешных, но неудачных по существу. Например, консультант, исследуя V$SQL, находит пакетное задание, выполняющееся четыре часа. Он «настраивает» его так, что оно выполняется за 30 минут. Проект реализован успешно - выданное консультантами заключение подтверждает это. Однако достижение лишено смысла. Пакетное задание и так выполнялось с достаточной скоростью, поскольку запускалось во время свободного от других работ восьмичасового перерыва. Средства, вложенные в повышение производительности (оплата консультантов), не принесли выгоды бизнесу.
Хуже того, я знаю аналитиков, ускорявших некую программу A ценой замедления другой, гораздо более важной, программы B. Во многих системах существуют взаимные зависимости между процессами, способные привести к такому результату. В таких системах «настройка» второстепенной программы не только отнимает время и деньги на выполнение этих работ, она фактически снижает ценность системы для бизнеса (см. раздел «Пример 1: Заблуждения, вызванные общесистемными данными» в главе 12).
Спецификация «ускорить работу системы» слишком расплывчата, чтобы быть полезной. Работая в отделе обслуживания корпорации Oracle, я неоднократно участвовал в дискуссиях, посвященных спецификациям проектов, - внедрение сервисных пакетов невозможно без спецификации целей проекта на уровне контракта. Большинство участников этих совещаний очень быстро понимали, что требование «ускорить работу системы» звучит слишком неопределенно. Что меня поражает сейчас - это то, что многие из них видели неопределенность совершенно не там, где надо.
Большинство людей видят суть проблемы в той части спецификации, которая предписывает ускорить работу системы. Они считают это требование неполным, т. к. в нем отсутствует указание, насколько ускорить. На упоминавшихся мною совещаниях в Oracle попытки конкретизировать такую спецификацию обычно выливались в обсуждение различных методик измерения фактической и субъективной скорости, способов введения «эквивалентных» метрик, основанных на счетчиках событий (аналогично коэффициенту попаданий), и т. д. Конечно, поиски «эквивалентных метрик» заканчивались ничем, потому что (если вы правильно выполните тест на злого джинна) такие метрики, основанные на предположениях, обычно оказываются ненадежными.
Выясняя, насколько «должна ускориться» система, зачастую удается лишь без пользы растратить ресурсы проекта. (Исключение составляет случай, когда аналитик находит максимально допустимое время выполнения операции путем моделирования с применением теории массового обслуживания, как показано в главе 9.) Сегодня, когда наши слушатели обсуждают требование по ускорению системы, их почти не приходится подталкивать к правильному решению о том, что суть проблемы скрывается в слове система. Рассмотрим, например, такие часто предлагаемые «улучшения» исходной спецификации «ускорить работу системы»:
Ускорить работу системы на 10%.
Заставить систему выполнять все бизнес-функции менее чем за 1
секунду.
Прежде всего, подобные требования так же беззащитны перед трюками злого джинна, как и исходная спецификация. Но в действительности, добавив детали, мы ослабили первоначальное утверждение. Например:
Ускорить работу системы на 10%
Вы действительно уверены в том, что каждая бизнес-транзакция в системе может выполняться на 10% быстрее? Даже та, которая требует лишь пары обращений к логическому вводу/выводу (LIO) Oracle? С другой стороны, действительно ли достаточно ускорения на 10% для онлайнового запроса, если его время отклика составляет 17 минут?
Заставить систему выполнять все бизнес-функции менее чем за 1 секунду
Что хорошего в том, что время выполнения выборки единственной строки по первичному ключу составит 0,99 секунды? С другой стороны, разумно ли ожидать, что приложение Oracle сможет построить 72-страничный отчет менее чем за одну секунду?
Привели ли эти два дополнения к улучшению исходного требования «ускорить работу системы»? Нет. Гораздо более серьезная проблема связана с недостаточно четко определенным понятием «система».
Система
Что такое система? Большинство администраторов систем и баз данных интерпретируют этот термин иначе, чем все остальные участники бизнеса. Для большинства администраторов система - это сложная совокупность процессов, областей разделяемой памяти, файлов, блокировок и защелок, а также разных технических штучек, доступных через «V$-таблицы», утилиты операционной системы и, возможно, графические средства системного мониторинга. Однако никто, кроме администраторов, не видит систему с этой стороны. Для пользователя система - это набор экранных форм и пакетных заданий, соответствующих его области деятельности. Для менеджера система - это инструмент повышения эффективности бизнеса. И пользователям, и менеджерам красные, желтые и зеленые индикаторы на вашей панели мониторинга абсолютно безразличны.
Вот простой тест, который поможет вам убедиться, что я говорю правду. Попробуйте представить себя на месте пользователя, ожидающего завершения отчета, который должен был быть сдан два часа назад сегодня утром, - и все из-за того, что на создание «пятнадцатиминутного отчета» требуется полных три часа. Подумайте, что вы ответите администратору базы данных, который на совещании в присутствии ваших коллег заявит примерно следующее: «Во время выполнения вашего отчета система работала совершенно нормально, все наши индикаторы находились в зеленой зоне в течение этих трех часов».
Пожалуйста, помните об этом, когда выступаете в роли аналитика по производительности: система - это набор пользовательских программ. Конечные пользователи относятся к ним очень внимательно. (Если на какую-то программу никто не обращает внимания, это означает, что ее надо запускать в нерабочее время или, возможно, не запускать вовсе.) Период времени, который требуется программе для выработки очередной порции данных для бизнеса, - это ее время отклика. Время отклика отдельной пользовательской операции - это единственный показатель производительности, который представляет интерес для бизнеса. Следствие:
В первую очередь вас должно интересовать время отклика операций конечного пользователя.
Экономические ограничения
Избавившись от неоднозначного толкования слова «система», мы значительно приблизились к правильному формулированию цели:
В интересах бизнеса необходимо увеличить производительность программы A в рабочие дни с 14:00 до 15:00. В этот период производительность программы A должна быть увеличена настолько, насколько это возможно.
Но является ли эта спецификация «джинноустойчивой»? Еще нет. Допустим, среднее время выполнения программы A составляет две минуты. Предположим, злой джинн мог бы сократить время отклика с двух минут до 0,25 секунды. Великолепно... Но это обойдется в $1 000 000 000. Увы. Возможно, достаточно будет уменьшить время отклика до 0,5 секунды, затратив на это всего $2000. В приведенной спецификации не упоминаются никакие экономические ограничения.
И все же существует спецификация проекта, которая, я уверен, может устоять перед происками джинна. Это цель оптимизации, сформулированная Эли Голдратом (Eli Goldratt) в [Goldratt (1992), 49]:
Делать деньги, одновременно увеличивая чистую прибыль, возврат инвестиций и усиливая движение денежных потоков.
Эта спецификация задает обязательные условия, которым должны соответствовать все прочие спецификации проектов. Однако она тоже страдает излишней обобщенностью, как и уже упоминавшееся правило «забивать мяч в лунку каждым ударом».
< Предыдущая | Следующая > |
---|