Анализ загрузки сервера
Oracle c помощью
V$LOG_HISTORY view.

Попов О.Б.
opopov@yandex.ru
г.Самара,август 2002 года

В этой статье я хотел обратить внимание на малоизвестный, но в тоже время простой и эффективный способ определения характера нагрузки сервера в OLTP системе.

Зачем это нужно делать ?
- Для этого есть несколько серьезных причин, а именно:

  1. при знакомстве с незнакомым окружением всегда полезно увидеть распределение нагрузки на сервер по времени суток и суммарную нагрузку по месяцам;
  2. Некоторые работы желательно проводить во время минимальной нагрузки на сервера a именно:
    • - массовая загрузка/выгрузка данных,
    • -процедуры резервного копирования(особенно если используется режим hot backup, во время которого все измененные после начала резервного копирования блоки записываются в журнал транзакций),
    • -коррекция параметров хранения данных(сбор статистики,перестройка разбалансированных индексов и т. д. ),
    Знание достоверной информации о том, в какое время суток и дни недели нагрузка минимальна, может позволить DBA более эффективно выполнять свои обязанности и при этом создавать меньше проблем пользователям.
  3. при настройке производительности серевера также надо знать, как изменялась нагрузка на сервер, за последнее время , и в этом случае всегда важно получить простой и ясный ответ на вопрос: действительно ли падение производительности сервера связано с резко возросшей на него нагрузкой , или дело в чем-то еще(например,увеличился объем хранимых данных и при этом плохо спланировано разбиение данных по дискам )
  4. для диагностики производительности сервера администраторы используют сценарии сбора статистики, которые обычно стараются запускать в периоды максимальной активности, а это означает, что достоверная статистическая информация о пиках активности сервера очень важна для администратора
  5. и,наконец, 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