Анализ загрузки сервера Oracle c помощью V$LOG_HISTORY view.
Попов О.Б. opopov@yandex.ru г.Самара,август 2002 года
В этой статье я хотел обратить внимание на малоизвестный, но в тоже
время простой и эффективный способ определения характера нагрузки сервера
в OLTP системе.
Зачем это нужно делать ? - Для этого есть несколько серьезных
причин, а именно:
- при знакомстве с незнакомым окружением всегда полезно увидеть
распределение нагрузки на сервер по времени суток и суммарную нагрузку
по месяцам;
- Некоторые работы желательно проводить во время минимальной нагрузки
на сервера a именно:
- - массовая загрузка/выгрузка данных,
- -процедуры резервного копирования(особенно если используется режим
hot backup, во время которого все измененные после начала резервного
копирования блоки записываются в журнал транзакций),
- -коррекция параметров хранения данных(сбор статистики,перестройка
разбалансированных индексов и т. д. ),
Знание достоверной
информации о том, в какое время суток и дни недели нагрузка минимальна,
может позволить DBA более эффективно выполнять свои обязанности и при
этом создавать меньше проблем пользователям.
- при настройке производительности серевера также надо знать, как
изменялась нагрузка на сервер, за последнее время , и в этом случае
всегда важно получить простой и ясный ответ на вопрос: действительно ли
падение производительности сервера связано с резко возросшей на него
нагрузкой , или дело в чем-то еще(например,увеличился объем хранимых
данных и при этом плохо спланировано разбиение данных по дискам )
- для диагностики производительности сервера администраторы используют
сценарии сбора статистики, которые обычно стараются запускать в периоды
максимальной активности, а это означает, что достоверная статистическая
информация о пиках активности сервера очень важна для администратора
- и,наконец, DBA должен аргументированно добиваться соответствия
серверного железа тем задачам, которые на нем решаются,так, например,
желание сделать upgrade сервера должно быть серьезно мотивировано и
подкрепленно объективными и воспроизводимыми данными о реальной нагрузке
на сервер.
Удивительно, но факт-грубый анализ загрузки сервера можно провести,
используя одно единственное представление- V$LOG_HISTORY, которое содержит
информацию из контрольных файлов. Описание полей V$LOG_HISTORY приведено в
Oracle8i Reference(начиная с версии 8.0x до версии 8.1.7 структура
V$LOG_HISTORY не изменялась, поэтому если вы используете Oracle в версии
начиная с 8.0x, то все далее приведенные запросы будут работать корректно
).
Таблица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,
2SUM(NEXT_CHANGE#-FIRST_CHANGE#) TRANSACTIONS_PER_MONTH
3FROM V$LOG_HISTORY
4GROUP BY TO_CHAR(FIRST_TIME,'YYYY-MM') ;
MONTH TRANSACTIONS_PER_MONTH
------- ----------------------
2000-12 127593
2001-01 73341
2001-02 91404
2001-03 69736
2001-04 104004
2001-05 263678
2001-06 283820
2001-07 322502
8 rows selected.
|
Пример выполнения этого запроса(таблица 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'
DA TRANSACTIONS_PER_DAY
-- --------------------
01 23124
04 12712
05 11246
06 23977
07 34697
08 35239
09 43891
13 12547
18 23441
19 13266
21 85879
22 113342
25 62620
26 22750
27 13015
28 13406
29 13668
17 rows selected.
SQL>
|
Пример выполнения этого запроса(таблица 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,
2SUM(NEXT_CHANGE#-FIRST_CHANGE#) TRANSACTIONS_PER_HOUR_SUM FROM
3V$LOG_HISTORY
4GROUP BY TO_CHAR(FIRST_TIME,'HH24');
HOUR TRANSACTIONS_PER_HOUR_SUM
---- -------------------------
08 19553
09 253255
10 226692
11 107578
12 234403
13 126301
14 153226
15 72623
16 45264
17 6135
18 1203
19 890
20 2048
11 rows selected.
|
Пример выполнения этого запроса(таблица 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,
2 SUM(NEXT_CHANGE#-FIRST_CHANGE#+1) TRANSACTIONS_PER_DAY_OF__WEEK
3FROM V$LOG_HISTORY
4GROUP BY TO_CHAR(FIRST_TIME,'D'), TO_CHAR(FIRST_TIME,'DAY')
DN DAY_OF_WEEEK TRANSACTIONS_PER_DAY_OF_WEEK
- --------- ----------------------------
1 SUNDAY 1401
2 MONDAY 1194239
3 TUESDAY 1120654
4 WEDNESDAY 1196367
5 THURSDAY 1752336
6 FRIDAY 1623841
7 SATURDAY 13393
7 rows selected.
| Последние два запроса показывают суммарные характеристики с момента
создания базы данных.Иногда бывает полезно посмотреть как распределяется
нагрузка по времени и дням недели за более короткий период(например за
последний месяц ), необходимые для этого измененния в вышеприведенных
запросах очевидны.
© Попов О.Б. 2002
|