редства анализа времени отклика
Определение времени отклика, данное Международной организацией по стандартизации ISO, несмотря на простоту, достаточно полезно:
Время отклика - это полное время, прошедшее с момента завершения запроса или команды компьютерной системе до начала ответа; например, период времени между событием окончания запроса и появлением первого символа ответа на терминале пользователя (взято на http://searchnetwork-ing.techtarget.com/sDefinition/0,,sid7_gci212896,00.htmr).
Время отклика представляет собой объективную меру взаимодействия между поставщиком и потребителем. Потребители компьютерных услуг хотят получать правильный ответ за наименьшее время и с наименьшими затратами. Цель аналитика по производительности Oracle заключается в минимизации времени отклика в рамках экономических ограничений, наложенных владельцем системы. Если разложить время отклика на компоненты, то станет понятнее, каким путем этого достичь.
Диаграмма последовательности - это удобный способ изображения составляющих времени отклика для действий пользователя. Диаграмма показывает передачу управления между уровнями технологического стека в процессе выполнения пользовательской операции. Технологический стек служит для представления многоуровневой архитектуры, образованной всеми элементами системы: пользователями, сетью, прикладными программами, ядром базы данных и оборудованием. Все элементы стека получают услуги от элементов нижележащего уровня и предоставляют услуги элементам, расположенным уровнем выше. На рис. 1.1 показана диаграмма последовательности для многоуровневой Oracle-системы.
Рис. 1.1 иллюстрирует приведенную ниже последовательность действий, наглядно показывая вклад каждого из уровней технологического стека в общее время отклика:
Пользователь, решив, что он хочет получить от системы, инициирует запрос на получение данных, нажимая в броузере кнопку «OK». Практически мгновенно броузер принимает этот запрос. Ожидание пользователем ответа начинается с нажатия кнопки «OK».
Броузер, затратив несколько мгновений на формирование изображения кнопки в прежнем, не нажатом состоянии, посылает HTTP-пакет в глобальную сеть (WAN). Некоторое время спустя запрос, пройдя по глобальной сети, достигает сервера приложений.
Сервер приложений, выполнив некоторые прикладные операции промежуточного уровня, формирует запрос к базе данных и отправляет его по протоколу SQL*Net в локальную сеть (LAN). Запрос за некоторое время (быстрее, чем в глобальной сети) проходит по локальной сети и поступает на сервер базы данных.
Процессор сервера БД выполняет ряд вычислений, и ядро Oracle формирует системный вызов с запросом на чтение с диска.
Через некоторое время системный вызов заканчивает чтение и возвращает управление процессу сервера БД.
Выполнив еще ряд вычислений на сервере, ядро Oracle формирует еще один вызов на чтение.
Затратив еще некоторое время на выполнение дисковых операций, системный вызов снова возвращает управление процессу сервера БД.
Ядро Oracle, затратив немного процессорного времени на завершающую обработку, формирует ответ на запрос сервера приложений и отправляет его по протоколу SQL*Net в локальную сеть.
Сервер приложений преобразует полученные из базы данных результаты в формат HTML и отправляет их по глобальной сети броузеру по протоколу HTTP.
10. После отображения результатов на дисплее пользователя броузер возвращает управление пользователю. Получив запрошенную информацию, пользователь заканчивает ожидание, длившееся в течение времени отклика.
Хорошая диаграмма последовательности имеет детализацию, соответствующую решаемой задаче. Например, на рис. 1.1 в целях упрощения не показаны задержки, возникающие в броузере, сервере приложений и сервере БД, когда их операционные системы выполняют переключение процессов из состояния выполняется в состояние готов к выполнению и обратно. В некоторых задачах анализа производительности такой уровень детализации был бы необходим. Влияние таких переключений на производительность рассматривается в главе 7.
На мой взгляд, идеальное средство анализа производительности Oracle еще не создано. Такой идеальный инструмент анализа должен иметь графический интерфейс для представления диаграммы последовательности, с точностью до микросекунды показывающей распределение составляющих времени отклика для любого действия пользователя. Большой объем данных, обрабатываемых таким приложением, потребует наличия развитых средств для обобщения и детализации, чтобы представить информацию именно так, как это требуется.
Вероятно, такое приложение скоро появится. Как вы увидите из этой книги, ядро Oracle уже может предоставить значительную часть данных, необходимых для создания такой программы. Основными проблемами на нынешний момент являются:
Отсутствие в большинстве узлов многоуровневой системы средств представления данных о времени отклика, аналогичных тем, которые предоставляет ядро Oracle. О каких данных идет речь, уточняется в главе 7.
В некоторых архитектурах трудность сбора диагностических данных, относящихся к конкретным пользовательским операциям. В главе 3 рассматриваются требования к представлению диагностических данных, а в главе 6 объясняется, как обойти трудности сбора данных, возникающие в различных прикладных архитектурах.
Однако многое из того, что нам необходимо, уже существует. Начиная с версии Oracle 7.0.12, в ядро включена и развивается поддержка средств измерения времени отклика. Эта книга поможет вам разобраться в том, как преимущества данного инструментария могут быть использованы в деле повышения производительности систем Oracle.
Полная диаграмма последовательности для любого мало-мальски сложного пользовательского действия содержит так много данных, что это заметно осложняет работу с ними. Следовательно, соображения удобства диктуют необходимость каким-то образом обобщить эту информацию. В примере 1.2 в качестве такого обобщения показан профиль ресурсов. Профиль ресурсов - это просто таблица, содержащая удобное представление структуры времени отклика. Обычно профиль ресурсов содержит, как минимум, следующие атрибуты:
Категория операций
Суммарное время выполнения операций данной категории
Количество обращений к операциям данной категории
Профиль ресурсов особенно полезен, когда он содержит список категорий в порядке убывания потраченного на них времени. Такое представление профиля очень удобно для анализа производительности, т. к. фокусирует внимание на задачах, требующих решения в первую очередь. Профиль ресурсов - главный инструмент в моем наборе средств диагностики производительности.
Идея применения профилей ресурсов далеко не нова. Наша компания вдохновилась ей благодаря статье о программах-профилировщиках, опубликованной в 1980-х годах [Bentley (1988) 3-13] и основанной, в свою очередь, на работе Дональда Кнута, вышедшей в начале 1970-х [Knuth (1971)]. Идея разложения времени отклика на составляющие настолько практична, что вы наверняка эксплуатировали ее, даже не сознавая того. Вспомните, как вы оптимизируете маршрут в свое любимое место. Представьте себе тот «райский уголок», в котором вы всегда чувствуете прилив сил. Для меня это ближайший магазин «Wood-craft Supply» (http://www.woodcraft.com), где продаются не только всевозможные инструменты, способные отрезать пальцы и ломать ребра, но и книги и журналы, объясняющие, как этого избежать.
Вот как может выглядеть профиль ресурсов для путешествия по городу с оживленным движением в час пик (время выражено в минутах):
Если, предположим, до магазина всего пятнадцать миль, вам, вероятно, не очень понравится перспектива полуторачасового стояния в пробках. Независимо от того, мыслите вы категориями профилей ресурсов или нет, вы скорее всего придете к тому же способу оптимизации, что и я: пожалуй, лучше отправиться в магазин, когда движение станет менее интенсивным.
Профили ресурсов помогают однозначно поставить задачу для проекта повышения производительности Oracle. В примере 1.3 представлен профиль ресурсов программы формирования платежной ведомости, рассмотренной ранее в разделе «Концентрация на пользовательских операциях». Не имея такого профиля, администраторы БД три месяца бились над известной им проблемой конкуренции за защелки. Придя в отчаяние, они потратили несколько тысяч долларов на новый процессорный блок, что привело к замедлению выполнения операции, которую они пытались ускорить. Получив в свое распоряжение профиль ресурсов, администратор в течение десяти минут нашел решение, сокращающее время отклика примерно на 50%. Более подробно эта проблема и ее решение рассмотрены в третьей части книги.
Пример 1.3. Профиль ресурсов для случая неправильной конфигурации сети. Первоначально предполагалось, что дело в конкуренции за защелки и недостаточной производительности ЦПУ
Response Time Component
|
Duration
|
# Calls
|
Dur/Call
|
|
SQL*Net message from client
|
984.0s
|
49.6%
|
95,161
|
0.010340s
|
SQL*Net more data from client
|
418.8s
|
21.1%
|
3,345
|
0.125208s
|
db file sequential read
|
279.3s
|
14.1%
|
45,084
|
0.006196s
|
CPU service
|
248.7s
|
12.5%
|
222,760
|
0.001116s
|
unaccounted-for
|
27.9s
|
1.4%
|
||
latch free
|
23.7s
|
1.2%
|
34,695
|
0.000683s
|
log file sync
|
1.1s
|
0.1%
|
506
|
0.002154s
|
SQL*Net more data to client
|
0.8s
|
0.0%
|
15,982
|
0.000052s
|
log file switch completion
|
0.3s
|
0.0%
|
3
|
0.093333s
|
enqueue
|
0.3s
|
0.0%
|
106
|
0.002358s
|
SQL*Net message to client
|
0.2s
|
0.0%
|
95,161
|
0.000003s
|
buffer busy waits
|
0.2s
|
0.0%
|
67
|
0.003284s
|
db file scattered read
|
0.0s
|
0.0%
|
2
|
0.005000s
|
SQL*Net break/reset to client
|
0.0s
|
0.0%
|
2
|
0.000000s
|
Total
|
1,985.4s
|
100.0%
|
Пример 1.4 демонстрирует еще один профиль ресурсов, спасший проект от обескураживающего и дорогостоящего провала. До появления этого профиля предполагаемое решение проблемы формирования отчета заключалось в увеличении объема памяти или модернизации подсистемы ввода/вывода. Профиль ресурсов однозначно показал, что данные мероприятия если и улучшат время отклика, то не более чем на 2%. Практически все время уходило на выполнение единственной команды SQL, вызывавшей около миллиарда обращений к блокам буферного кэша БД.
Глядя на профиль ресурсов из примера 1.4, невозможно сделать вывод о том, что процессорное время было затрачено на миллиард операций чтения. Каждый из 192072 «вызовов» ресурса CPU service представляет собой обращение к БД Oracle (например, разбор, выполнение, выборку). С помощью детальной трассировки SQL для всех этих вызовов мне удалось определить, что они породили около миллиарда операций чтения. О том, как это сделать, подробно рассказано в главе 5.
Подобные проблемы обычно бывают вызваны ошибками в обслуживании, например, случайным удалением статистики, используемой оптимизатором по стоимости (Cost-Based Optimizer - CBO).
Пример 1.4. Профиль ресурсов для случая неэффективной команды SQL. Первоначально предполагалось, что проблема заключается в подсистеме ввода/вывода
Время отклика Component
|
Duration
|
# Calls
|
Dur/Call
|
|
CPU service
|
48,946.7s
|
98.0%
|
192,072
|
0.254835s
|
db file sequential read
|
940.1s
|
2.0%
|
507,385
|
0.001853s
|
SQL*Net message from client
|
60.9s
|
0.0%
|
191,609
|
0.000318s
|
latch free
|
2.2s
|
0.0%
|
171
|
0.012690s
|
other
|
1.4s
|
0.0%
|
||
Total
|
49,951.3s
|
100.0%
|
П
р
имер 1.4 ясно показывает, как профиль ресурсов помогает не стать жертвой мифов. Здесь в качестве расхожего заблуждения, дезориентировавшего аналитика относительно причин задержек в сеансе, выступает утверждение о том, что высокий коэффициент попаданий в кэш буферов базы данных свидетельствует об эффективности выполнения команд SQL. Команда, вызывавшая замедление работы, показывала исключительно высокий коэффициент попаданий в кэш буферов. Причину легко понять, взглянув на формулу вычисления коэффициента попадания CHR (cache hit ratio) для данного случая:
В
этой формуле логический ввод/вывод LIO (logical I/O)- это количество блоков, считанных из памяти Oracle (кэша буферов БД); физический ввод/вывод PIO (physical I/O) - количество блоков, считанных вызовами операционной системы.1
Эта формула порождает и другие проблемы, помимо показанной в данном примере. Многие авторы, включая Адамса (Adams), Льюиса (Lewis), Кайта (Kyte) и меня самого, указывают на многочисленные и серьезные изъяны такого способа представления коэффициента попаданий в кэш буферов. Наиболее подробно это вопрос рассмотрен в работе [Lewis (2003)].
ния (LIO - PIO) равно количеству чтений блоков из кэша, не потребовавших обращений к операционной системе.1
Несмотря на то, что многие специалисты сочли бы значение коэффициента 0,9995 «хорошим», оно все же не может считаться «идеальным». В отсутствие данных, представленных в примере 1.4, большинство известных мне аналитиков предположили бы, что низкая производительность вызвана неидеальностью коэффициента попаданий в кэш. Но профиль ресурсов ясно показывает, что даже если бы все 507385 операций физического чтения были обслужены кэшем буферов, экономия времени составила бы только 940,1 секунды. Максимально возможное улучшение от решения этой «проблемы» составило бы лишь 16 минут при общей продолжительности выполнения 14 часов.
Применение профилей ресурсов для анализа пользовательских операций радикально повысило эффективность работы специалистов по производительности. Прежде всего это превосходный инструмент для определения наиболее важной точки приложения усилий - в соответствии с провозглашенной нами целью:
Если вы где-то слышали, что добавление памяти решает все проблемы производительности
Пример 1.4 заставляет меня вспомнить первый пройденный мной курс по «настройке». Это было в 1989 г., когда я только пришел на работу в корпорацию Oracle. Наш преподаватель предложил простой способ оптимизации запросов к базе данных Oracle: просто исключить операции физического ввода/вывода. Я задал вопрос: «А как насчет доступа к памяти?», имея в виду большое значение в столбце query выходных данных tkprof, которые мы в этот момент изучали. Инструктор ответил, что выборка из памяти выполняется настолько быстро, что ее влиянием на производительность можно пренебречь. Такой ответ меня разочаровал - до того, как начать карьеру в Oracle, я много занимался оптимизацией кода на C. Одним из наиболее важных моментов в этой работе было исключение избыточных обращений к памяти [Dowd (1993)].
Из примера 1.4 видно, почему и для вас устранение излишних обращений к памяти должно стать приоритетным. Лишние обращения к памяти увеличивают время отклика. Если таких обращений много, то расходуется много времени. При частоте процессора 2 ГГц выполнение кода, реализующего операцию логического ввода/вывода Oracle (LIO), занимает, как правило, несколько десятков микросекунд процессорного времени в пользовательском режиме. Следовательно, миллион операций LIO увеличат время отклика на несколько десятков секунд. Чрезмерная интенсивность операций LIO, в силу ряда причин, затрудняет масштабируемость системы; причины рассмотрены во второй и третьей частях книги. Дополнительная информация имеется в работе [Millsap (2001c)].
В первую очередь стремиться к уменьшению самой значимой составляющей времени отклика в наиболее критичных для бизнеса операциях.
Другое важное преимущество использования профилей ресурсов заключается в том, что от них не может укрыться практически ни одна проблема производительности. Неформальное доказательство этой гипотезы состоит из двух утверждений:
Доказательство: Если нечто представляет собой проблему со временем отклика, это проявляется в профиле ресурсов. Если это не проблема со временем отклика, то это и не проблема производительности. ЧТД
О создании таких профилей ресурсов, от которых не укроется ни одна проблема производительности, рассказывается во второй части книги.
< Предыдущая | Следующая > |
---|