Для того чтобы понять информацию об измерительных средствах ядра, представленную в этой книге и впервые опубликованную в 1992 г., потребовалось много лет. Ранняя документация по Oracle, посвященная этой новой возможности, не всегда способствовала прояснению ситуации. Например, в документе «Oracle7 Server Tuning guide» (Руководство по настройке сервера Oracle7) приводился такой результат запроса к V$SESSION_WAIT [Oracle (1996)]:
SQL>
|
SELECT sid, event, wait_time
|
|
2
|
FROM v$session_wait
|
|
3
|
ORDER BY wait_time,
|
event;
|
SID
|
EVENT
|
WAIT_TIME
|
205
|
latch free
|
4294967295
|
207
|
latch free
|
4294967295
|
209
|
latch free
|
4294967295
|
215
|
latch free
|
4294967295
|
293
|
latch free
|
4294967295
|
294
|
latch free
|
4294967295
|
117
|
log file sync
|
4294967295
|
129
|
log file sync
|
4294967295
|
22
|
virtual circuit status
|
4294967295
|
Далее следовал совет: «Необычно большие значения времени ожидания для нескольких последних событий означают, что сеансы в данный момент находятся в состоянии ожидания этого события [sic]. Как видите, в настоящий момент несколько сеансов ожидают освобождения защелок и синхронизации журнальных файлов». Если бы эти выводы были верны, то показанные в данном примере события находились бы в состоянии ожидания уже 1,36193 года. Тут что-то не так. Проблема возникла из-за отсутствия столбца STATE в списке выбора запроса. Дело в том, что десятичное целое -1, представленное в виде 32-битного шестнадцатеричного числа, выглядит так: ffffffff. Запишите его как 32-битное беззнаковое целое и получите 232 - 1 или 4 294 967 295. На самом деле показанные значения WAITTIME представляют собой -1. Это значение соответствует значению WAITED SHORT TIME (табл. 8.2) встолбце STATE. Каждое «необычно большое время ожидания» на самом деле представляет завершившееся событие, причем завершившееся настолько быстро, что измерения показали нулевую продолжительность в сотых долях секунды.
На раннем этапе множество авторов совершало подобные ошибки, пытаясь объяснить, как следует интерпретировать новые данные о «событиях» и «ожиданиях». Их оправдывает то, что они были пионерами, привлекшими множество сторонников новой технологии. Но безусловно, ошибки, подобные описанной здесь, особенно в официальной документации Oracle, затормозили распространение замечательных диагностических возможностей Oracle.
пока не наступит следующее измеряемое событие ожидания, и сеанс не установит снова значение в ноль. Приблизительно раз в три секунды процесс записи в журнал (LGWR) увеличивает значение SECONDS_IN_WAIT на 3. Учтите, что единицей измерения служат секунды, а не санти- и микросекунды.
События, вызывающие тайм-аут, несколько усложняют дело. Например, для события ожидания enqueue тайм-аут возникает через каждые две секунды даже для тех блокировок, которые длятся значительно больше. При каждом тайм-ауте ядро Oracle увеличивает SEQ#, но не переустанавливает значение SECONDS_IN_WAIT.
STATE
В начале измеряемого события ожидания STATE принимает значение WAITING. Это значение сохраняется вплоть до завершения события, после чего ядро устанавливает одно из значений, перечисленных в табл. 8.2.
Таблица 8.2. Описание значений столбцов STATE и WAIT_TIME представления V$SESSION_WAIT
STATE
|
WAIT_TIME
|
Описание
|
WAITED
UNKNOWN TIME
|
-2
|
Параметр сеанса TIMED_STATISTICS имел при завершении события значение FALSE, поэтому фактическая продолжительность неизвестна.
|
WAITED SHORT TIME
|
-1
|
Событие ожидания завершено, но оно началось и закончилось в течение одного такта gettimeofday.
|
WAITING
|
0
|
Событие ожидания обрабатывается и пока не завершено.
|
WAITED KNOWN TIME
|
t>0
|
Событие ожидания завершилось, затратив t= t1-t0 сантисекунд фактического времени (см. главу 7).
|
Следующий запрос выводит гистограмму, показывающую, какими операциями заняты в настоящий момент сеансы системы:
Не указывайте условие WAIT_TIME=0 в запросе к V$SESSION_WAIT, если на самом деле подразумеваете STATE='WAITING'. У некоторых аналитиков вошло в привычку считать, что утверждения WAIT_TIME=0
Приведенный запрос отображает данные о событиях ожидания, выполняющихся в данный момент в данной системе:
и STATE=' WAITING' эквивалентны, поскольку в Oracle7 и Oracle8i дело обстояло именно так. Однако в Oracle9i эти два предиката не равнозначны.
Ядро Oracle9i вычисляет WAIT_TIME как round(x$ksusecst.ksusstim/ 10000), а значение STATE - как результат DECODE от неокругленного значения KSUSSTIM. Следовательно, поле WAIT_TIME может содержать ноль при ненулевом исходном значении. Поэтому в ядре Oracle9i возможны ситуации, когда поле WAITTIME равно нулю, а поле STATE имеет значение, отличное от WAITING.
< Предыдущая | Следующая > |
---|