омпоненты времени отклика
Начиная работу над этой главой, я предполагал подробно описать около двадцати событий ожидания Oracle, которые с наибольшей вероятностью могут встретиться в вашей работе. Однако за последние несколько лет корпорация Oracle так хорошо потрудилась над совершенствованием документации по событиям ожидания, что повторение здесь этой информации стало бы пустой тратой времени. Документация по настройке производительности Oracle9i release 2 [Oracle (2002)] написана достаточно хорошо. Вместо того чтобы пересказывать то, что вы можете свободно найти в других источниках, я в этой книге сосредоточил усилия на трех направлениях, не освещенных в стандартной документации Oracle:
Рассмотрение двух псевдособытий («событий», в действительности таковыми не являющихся), длительность которых может быть определена по данным файла расширенной трассировки SQL: CPU service и unaccounted-for.
Более полное описание нескольких так называемых событий простоя, которое другие авторы опускают, не считая их заслуживающими внимания. Эти события приобретают исключительную важность в свете дополнительных возможностей диагностики, которые дают правильный выбор области сбора диагностических данных.
Акцент на исключении бесполезной нагрузки при возникновении различных событий ожидания.
Данный раздел посвящен псевдособытиям и так называемым событиям простоя. Ниже в этой главе будет рассказано об исключении нагрузки.
Вы, наверное, уже заметили, что там, где можно было бы ожидать термина «событие ожидания» Oracle, употребляется термин «компонент времени отклика». Причина проста. То, что называется компонентами времени отклика, состоит из двух разных вещей: настоящих событий ожидания Oracle, описанных в V$EVENT_NAME, и двух других важных компонентов, отсутствующих в этом представлении:
CPU service unaccounted-for
Несмотря на то, что ни один из этих компонентов формально не относится к «событиям ожидания Oracle», оба они представляют собой измеримые (и часто существенные) составляющие времени отклика любой пользовательской операции. Они рассматриваются здесь наравне с событиями ожидания, потому что каждая микросекунда, затраченная ядром Oracle на «работу», добавляет ко времени отклика пользовательской операции ровно столько же, сколько и микросекунда, потраченная на «ожидание». Последние версии Statspack также включают процессорное время в число пяти основных «событий ожидания».
Практически каждый профиль ресурсов Oracle будет содержать компонент CPU service, показывающий затраты процессорного времени. Часто он вносит основной вклад в значение времени отклика как для эффективно реализованных пользовательских операций, так и для совершенно неэффективных. Вопрос в том, насколько оправдана такая потребность в процессорном времени (см. главу 5).
При диагностике причин чрезмерных затрат процессорного времени прежде всего надо установить, какие вызовы базы данных ответственны за это в наибольшей степени. Для этого необязательно применять опережающее атрибутирование, т. к. статистики c, характеризующие затраты процессорного времени, находятся непосредственно в тех строках файла трассировки, которые соответствуют вызовам базы данных. Отыскав вызовы, потребляющие основную часть процессорного времени, нетрудно найти и соответствующие секции PARSING IN CURSOR, содержащие исходный код (на SQL или PL/SQL), породивший эти вызовы.
В первую очередь следует обратить внимание на вызовы базы данных, имеющие наибольшие значения c без учета своих потомков. Если большие значения c для вызова базы данных возникают вследствие суммирования затрат времени их рекурсивным потомством, то затраты процессорного времени без учета потомства определяются способом, описанным в разделе «Двойной учет рекурсивного SQL» главы 5. Вспомните, статистики потребления процессорного времени и операций LIO для вызова базы данных (c, cr и cu) относятся к тем, которые включают в себя затраты, сделанные их потомством.
Если вызовы, в наибольшей степени ответственные за продолжительность компонента CPU service вашей пользовательской операции, найдены, то дальнейшие действия (в зависимости от типа вызова базы данных) таковы:
Большое значение «c» для вызова FETCH, EXEC, UNMAP или SORT UNMAP
Если много небольших значений c распределено среди значительного количества вызовов FETCH или EXEC, исключите лишние вызовы базы данных везде, где это возможно, и объедините оставшиеся вызовы в наименьшее возможное количество вызовов (например, обрабатывайте строки массивами, а не по одной).
Если большое значение c принадлежит отдельному вызову базы данных FETCH или EXEC, то сначала выясните, не связана ли загрузка процессора с операциями логического ввода/вывода (LIO):
Большое количество операций LIO (ориентировочно больше 10 вызовов LIO на каждую неагрегированную строку каждой таблицы, указанной во фразе FROM)
При большом количестве операций LIO в вызове оптимизируйте SQL, как описано ниже в разделе «Оптимизация логического ввода/вывода» этой главы.
Малое количество операций LIO
Если количество операций LIO невелико, то возможно, что серверный процесс Oracle тратит много процессорного времени на операции сортировки или хеширования. События 10032 и 10033 предоставляют подробную информацию об операциях сортировки, а событие 10104 - о хеш-соединениях.
Возможно также, что большие затраты времени вызваны операциями приведения типов. Например, просмотр таблицы со сравнением дат в каждой строке может очень сильно загрузить процессор.
Наконец, время может расходоваться на выполнение излишне усложненного кода PL/SQL. Понятно, что выполнение инструкций PL/SQL требует работы процессора, даже если они не содержат обращений к базе данных. Большие значения c в строках файла трассировки EXEC для PL/SQL-блоков при малом количестве LIO (без учета потомков) часто означают, что время расходуется на выполнение ветвления, присваивания и других инструкций языка. Для детальной диагностики выполнения кода PL/SQL можно воспользоваться имеющимся в Oracle пакетом DBMS_PROFILER [Kyte (2001)].
Большое значение «с» для вызова PARSE
Если много небольших значений c распределено среди большого количества вызовов PARSE, исключите как можно больше таких вызовов, следуя методике, изложенной ниже в разделе «Оптимизация разбора» этой главы.
Если большое значение c принадлежит отдельному вызову PARSE, то выясните, нельзя ли упростить команду SQL. Рассмотрите также возможность уменьшения значения параметра OPTIMIZERMAXPERMU-TATIONS (дополнительная информация доступна по адресу http:// www.ixora.com.au/q+a/0010/19140 702.htm).
Как рассказывалось в главе 7, существуют пять источников неучтенного времени в файле трассировки, соответствующего ненулевому значению Д в уравнении e = с + ~Lela + Д:
Эффект влияния измерителя
Двойной учет использования процессора
Ошибка квантования
Время, в течение которого процесс не выполняется
Неизмеряемое время
Наличие такого количества неопределенностей в одном уравнении может вызвать сомнения в возможности определения вклада каждой из составляющих в Д. На самом деле работать с неучтенным временем unaccounted-for достаточно просто. Три из пяти его составляющих имеют ограничения, позволяющие считать их влияние на время отклика пренебрежимо малым. Если неучтенное время дает наибольший вклад в профиль ресурсов пользовательской операции и данные получены в корректно определенной области, то оно практически всегда вызвано наличием неизмеряемого времени или времени «невыполнения». Если источником неучтенного времени является отсутствие средств измерения в коде ядра Oracle, то, возможно, установка очередного обновления сократит количество реальных источников неопределенности до одного.
На практике большие значения неучтенного времени, как правило, вызваны ошибками сбора данных, подобными тем, что описаны в главах 3 и 6. При аккуратном и точном выборе данных в процессе сбора диагностической информации можно полностью использовать те преимущества, которые дает обладание сведениями о продолжительности компонента unaccounted-for.
Подробно об этих пяти составляющих компонента времени отклика unaccounted-for рассказывалось в главе 7. Резюмируем сказанное там:
Эффект влияния измерителя
Эффект влияния измерителя незначителен (порядка нескольких микросекунд на вызов gettimeofday или getrusage), поэтому в целом им обычно можно пренебречь. Если влияние измерителя вас беспокоит, то можно измерить его при помощи методики, изложенной в главе 7. Этот эффект вызывает небольшое увеличение Д.
Двойной учет использования процессора в статистиках c и ela
Эффект двойного учета в большинстве событий невелик. Наибольшее влияние этого эффекта, виденное мной, проявлялось в событиях db file scattered read, перемещавших большие объемы данных (порядка 100 Кбайт и больше). В таких ситуациях наблюдался двойной учет примерно десяти миллисекунд на одно событие чтения. Двойной учет процессорного времени немного уменьшает значение Д.
Ошибка квантования
Совокупный эффект, вызванный ошибкой квантования, также мал. В силу того, что вероятности возникновения положительных и отрицательных ошибок квантования одинаковы, эти ошибки компенсируют друг друга, в результате чего их совокупное влияние на Д близко к нулю.
Время, в течение которого процесс не выполняется
Если в профиле ресурсов длительность компонента unaccounted-for велика, то почти наверняка вы столкнулись либо со временем «невыполнения», либо с неизмеряемым временем. В табл. 11.2 приведено хорошее эмпирическое правило. Время, в течение которого процесс не выполняется, всегда увеличивает Д.
Неизмеряемое время
Если приложение выполняет значительный объем кода ядра Oracle, в котором отсутствуют средства измерения, то эффект неотличим от того, который вызван временем невыполнения процесса. В главе 7 рассказывалось, как обнаружить наличие неизмеряемых участков кода. Если даже в системе, не обремененной многочисленными переключениями контекста или подкачкой страниц, во времени отклика преобладает неучтенное время, то следует обновить ядро Oracle, чтобы добавить измерительные средства в участки кода, выполняемые пользовательской операцией. Неизмеряемый код всегда вызывает изменение Д в сторону увеличения.
< Предыдущая | Следующая > |
---|