Анализ загрузки сервера Oracle c помощью V$LOG_HISTORY view.
Попов О.Б.
opopov@yandex.ru
г.Самара,август 2002 года
В этой статье я хотел обратить внимание на малоизвестный, но в тоже
время простой и эффективный способ определения характера нагрузки
сервера в OLTP системе.
Зачем это нужно делать ?
- Для этого есть несколько серьезных причин, а именно:
a. при знакомстве с незнакомым окружением всегда полезно увидеть
распределение нагрузки на сервер по времени суток и суммарную
нагрузку по месяцам;
b. Некоторые работы желательно проводить во время минимальной
нагрузки на сервера a именно:
+ - массовая загрузка/выгрузка данных,
+ -процедуры резервного копирования(особенно если используется
режим hot backup, во время которого все измененные после
начала резервного копирования блоки записываются в журнал
транзакций),
+ -коррекция параметров хранения данных(сбор
статистики,перестройка разбалансированных индексов и т. д. ),
Знание достоверной информации о том, в какое время суток и дни
недели нагрузка минимальна, может позволить DBA более эффективно
выполнять свои обязанности и при этом создавать меньше проблем
пользователям.
c. при настройке производительности серевера также надо знать, как
изменялась нагрузка на сервер, за последнее время , и в этом
случае всегда важно получить простой и ясный ответ на вопрос:
действительно ли падение производительности сервера связано с
резко возросшей на него нагрузкой , или дело в чем-то
еще(например,увеличился объем хранимых данных и при этом плохо
спланировано разбиение данных по дискам )
d. для диагностики производительности сервера администраторы
используют сценарии сбора статистики, которые обычно стараются
запускать в периоды максимальной активности, а это означает, что
достоверная статистическая информация о пиках активности сервера
очень важна для администратора
e. и,наконец, DBA должен аргументированно добиваться соответствия
серверного железа тем задачам, которые на нем решаются,так,
например, желание сделать upgrade сервера должно быть серьезно
мотивировано и подкрепленно объективными и воспроизводимыми
данными о реальной нагрузке на сервер.
Удивительно, но факт-грубый анализ загрузки сервера можно провести,
используя одно единственное представление- V$LOG_HISTORY, которое
содержит информацию из контрольных файлов. Описание полей
V$LOG_HISTORY приведено в Oracle8i Reference(начиная с версии 8.0x до
версии 8.1.7 структура V$LOG_HISTORY не изменялась, поэтому если вы
используете Oracle в версии начиная с 8.0x, то все далее приведенные
запросы будут работать корректно ).
CAPTION: Таблица1. Структура V$LOG_HISTORY
Column Datatype Description
THREAD# NUMBER Thread number of the archived log
SEQUENCE# NUMBER Sequence number of the archived log
FIRST_TIME DATE Time of first entry (lowest SCN) in the log. This
column was previously named TIME
FIRST_CHANGE# NUMBER Lowest SCN in the log. This column was previously
named LOW_CHANGE#
NEXT_CHANGE# NUMBER Highest SCN in the log. This column was previously
named HIGH_CHANGE#
RECID NUMBER Controlfile record ID
STAMP NUMBER Controlfile record stamp
Нагрузка по месяцам:
Запрос показывает количество изменений в БД, просуммированное и
сгруппированное по месяцам.
SELECT TO_CHAR(FIRST_TIME,'YYYY-MM')MONTH,
SUM(NEXT_CHANGE#-FIRST_CHANGE#) TRANSACTIONS_PER_MONTH
FROM V$LOG_HISTORY
GROUP BY TO_CHAR(FIRST_TIME,'YYYY-MM')
Taблица2.Результат выполнения запроса в SQL PLUS:
SQL> SELECT TO_CHAR(FIRST_TIME,'YYYY-MM')MONTH,
SUM(NEXT_CHANGE#-FIRST_CHANGE#) TRANSACTIONS_PER_MONTH
FROM V$LOG_HISTORY
GROUP BY TO_CHAR(FIRST_TIME,'YYYY-MM') ;
Пример выполнения этого запроса(таблица 2), показывает , что некий
сервер имеет довольно заметную тенденцию к увеличению количества
транзакций в месяц.
Нагрузка по дням за выбранный месяц
Следущий запрос запрошивает у пользователя месяц и год и выдает
распределение нагрузки по календарным датам за выбранный период.
mw.sql:
ACCEPT MD1 PROMPT"Enter month and year (MON-YYYY):";
SELECT TO_CHAR(FIRST_TIME,'DD') DAY,
SUM(NEXT_CHANGE#-FIRST_CHANGE#) TRANSACTIONS_PER_DAY
FROM V$LOG_HISTORY
WHERE TO_CHAR(FIRST_TIME,'MON-YYYY')='&MD1'
GROUP BY TO_CHAR(FIRST_TIME,'DD');
Taблица 3.Результат выполнения запросав SQL PLUS:
SQL> @mw.sql
Enter month and year (MON-YYYY):JUN-2001
old 4: WHERE TO_CHAR(FIRST_TIME,'MON-YYYY')='&MD1'
new 4: WHERE TO_CHAR(FIRST_TIME,'MON-YYYY')='JUN-2001'
Пример выполнения этого запроса(таблица 3), показывает , что сервер
имеет нагрузку с 21 до 25 июня 2001 года сервер был загружен
максимально, в остальные дни месяца-загрузщка совсем не велика.
Суммарная нагрузка по времени суток:
SELECT TO_CHAR(FIRST_TIME,'HH24') HOUR,
SUM(NEXT_CHANGE#-FIRST_CHANGE#) TRANSACTIONS_PER_HOUR_SUM FROM
V$LOG_HISTORY
GROUP BY TO_CHAR(FIRST_TIME,'HH24')
Taблица4.Результат выполнения запроса в SQL PLUS:
SQL> SELECT TO_CHAR(FIRST_TIME,'HH24') HOUR,
SUM(NEXT_CHANGE#-FIRST_CHANGE#) TRANSACTIONS_PER_HOUR_SUM FROM
V$LOG_HISTORY
GROUP BY TO_CHAR(FIRST_TIME,'HH24');
Пример выполнения этого запроса(таблица 4), показывает , что сервер
имеет нагрузку с 8 до 20 часов и c 9 до 16 часов нагрузка значительно
больше, чем в остальное время суток.
Суммарная нагрузка подням недели:
SELECT TO_CHAR(FIRST_TIME,'D') DN,TO_CHAR(FIRST_TIME,'DAY') DAY_OF_WEEK,
SUM(NEXT_CHANGE#-FIRST_CHANGE#+1) TRANSACTIONS_PER_DAY_OF_WEEK
FROM V$LOG_HISTORY
GROUP BY TO_CHAR(FIRST_TIME,'D'), TO_CHAR(FIRST_TIME,'DAY')
Taблица5.Результат выполнения запроса в SQL PLUS:
SQL> SELECT TO_CHAR(FIRST_TIME,'D') DN,TO_CHAR(FIRST_TIME,'DAY') DAY_OF_WEEK,
SUM(NEXT_CHANGE#-FIRST_CHANGE#+1) TRANSACTIONS_PER_DAY_OF__WEEK
FROM V$LOG_HISTORY
GROUP BY TO_CHAR(FIRST_TIME,'D'), TO_CHAR(FIRST_TIME,'DAY')
Последние два запроса показывают суммарные характеристики с момента
создания базы данных.Иногда бывает полезно посмотреть как
распределяется нагрузка по времени и дням недели за более короткий
период(например за последний месяц ), необходимые для этого измененния
в вышеприведенных запросах очевидны.