шибка квантования
Несколько лет назад один приятель убеждал меня в том, что расширенная трассировка SQL в Oracle бесперспективна для диагностики производительности. Он аргументировал это тем, что в эпоху гигагерцевых процессоров разрешающая способность в одну сантисекунду тогдашнего ядра Oracle8i практически бесполезна. Однако во многих сотнях проектов в этой области расширенная трассировка SQL работала практически безупречно (даже эта идея с сантисекундами из Oracle8i себя оправдывала). Достоверность расширенной трассировки SQL трудно оценить, не понимая, что такое разрешающая способность измерений и ошибка квантования.
Во времена моего детства одним из преимуществ жизни в эпоху прогресса было изобретение электронного будильника. Цифровые часы чрезвычайно просты для восприятия, даже для маленького мальчика, который еще не умеет определять время по стрелочным часам. Тяжело ошибиться, когда видишь перед собой большие красные цифры «7:29». Имея дело с аналоговыми часами, ребенок может перепутать пять и семь часов, но отличие цифры 5 от 7 очевидно.
Но и у электронных часов есть свои проблемы. Как, посмотрев на электронные часы, показывающие «7:29», определить, сколько осталось до 7:30? Проблема именно в том, что никак. Глядя на электронные часы, нельзя сказать, сколько сейчас времени: 7:29:00, 7:29:59 или где-то посередине. Что касается стрелочных часов, то даже если на них нет секундной стрелки, всегда можно определить доли минуты по тому, насколько минутная стрелка близка к следующему делению на циферблате.
Все значения времени, измеряемые цифровыми компьютерами, получены от интервальных таймеров, которые ведут себя как старые электронные часы у нашего изголовья. Интервальный таймер - это устройство, которое тикает через определенные интервалы времени. Значения времени, полученные от интервального таймера, могут обладать интересными особенностями. Для того чтобы осознанно принимать решения на основе данных, полученных от интервальных таймеров Oracle, необходимо осознавать ограниченность их возможностей.
Разрешающая способность интервального таймера - это период времени между двумя последовательными тиками. Разрешающая способность таймера - это величина, обратная частоте таймера. То есть таймер, тикающий с частотой 1 ГГц (приблизительно 109 тиков в секунду), имеет разрешающую способность приблизительно 1/109 секунд, или около 1 наносекунды. Чем больше значение разрешающей способности таймера, тем менее точную информацию о продолжительности измеряемого события он может сообщить. Но для некоторых таймеров (в особенности реализованных программно) значительное уменьшение разрешающей способности может настолько увеличить накладные расходы системы, что это повлияет на характеристики производительности измеряемого события.
Принцип неопределенности Гейзенберга и анализ компьютерной производительности
Проблема измерения продолжительности компьютерных событий посредством дискретных часов аналогична знаменитому принципу неопределенности квантовой физики. Сформулированный Вернером Гейзен-бергом в 1926 году принцип неопределенности утверждает, что произведение неопределенности местоположения частицы на неопределенность скорости ее движения и на массу частицы не может быть меньше определенной величины, называемой постоянной Планка [Hawking (1988) 55]. Следовательно, для очень маленьких частиц невозможно одновременно точно знать и где находится частица, и с какой скоростью она перемещается.
Аналогично, некоторые вещи в вычислительной системе тяжело измерить очень точно, особенно при помощи программных часов. Уменьшение разрешающей способности приводит к более точным измерениям, но применение такого разрешения для программных часов может вызвать значительное ухудшение производительности исследуемого приложения. Далее в главе будет рассмотрен такой пример (при обсуждении разрешающей способности системной функции getrusage).
В дополнение к тому влиянию, которое разрешающая способность оказывает на результат измерения временных характеристик приложения, на время исполнения пользовательской программы также воздействует и эффект влияния измерителя. Совокупное влияние такого незапланированного поведения измерительных средств на производительность приложения создает то, что аналитики по производительности Oracle могут назвать аналогом эффекта Гейзенберга.
По мере передачи временной статистики от оборудования через различные уровни прикладного программного обеспечения каждый из таких уровней может как оставить ее точность неизменной, так и ухудшить ее. Например:
• Разрешение результата системного вызова gettimeofday по стандарту POSIX равно одной микросекунде. Однако многие процессоры Intel Pentium содержат аппаратный счетчик временных меток, который обеспечивает разрешение в одну наносекунду. Например, в Linux вызов gettimeofday преобразует значение из наносекунд (10-9 секунды) в микросекунды (10-6 секунды), выполняя целочисленное деление значения в наносекундах на 1000, что означает потерю трех последних разрядов.
• Статистика e в Oracle8i обладает разрешающей способностью в одну сантисекунду. Однако большинство современных операционных систем предоставляют информацию gettimeofday с точностью до микросекунды. Ядро Oracle8i преобразует значение из микросекунд (10-6 секунды) в сантисекунды (10-2 секунды), выполняя целочисленное деление значения в микросекундах на 10 000, что означает потерю четырех последних разрядов значения [Wood (2003)].
То есть фактически каждая величина e и ela, выведенная ядром Orac-le8i, представляет собой системную характеристику, значение которой точно определить невозможно, известно лишь, что оно находится в определенном диапазоне. Такой диапазон значений представлен в табл. 7.1. Например, про величину e=2 в Oracle8i можно сказать, что на самом деле она может представлять любую длительность ea в следующем диапазоне:
2,0000 сантисекунд < ea < 2,9999 сантисекунд
Таблица 7.1. Одно значение статистики e или ela в Oracle8i соответствует диапазону фактических значений времени
Статистика e, ela (сантисекунд)
|
Минимально возможное значение gettimeofday (сантисекунд)
|
Максимально возможное значение gettimeofday (сантисекунд)
|
0
1
2
3
|
0,000 000 1,000 000 2,000 000
3,000 000
|
0,999 999 1,999 999 2,999 999 3,999 999
|
< Предыдущая | Следующая > |
---|