Диагностика производительности с помощью Statspack
1 июля 2000 г.
Diagnosing Performance with Statspack, By Connie Dialeris and Graham Wood
Кони Дайлерис и Грэхэм Вуд
Statspack (Пакет Статистики) - новое средство, входящее в состав Oracle8i Release 8.1.6, которое позволяет администраторам и специалистам по настройке диагностировать производительность системы.
В течение нескольких лет единственными средствами диагностики производительности, включенными в состав Oracle Database Server, были два скрипта: UTLBSTAT.SQL и UTLESTAT.SQL. Как известно, оба вместе BSTAT/ESTAT составляют единое очень простое инструментальное средство: они создают снимок (snapshot) данных из представлений динамической производительности за период времени между запусками BSTAT и ESTAT. Однако, организация данных получаемого в результате отчета сложна для чтения и интерпретации. Кроме того, скрипты BSTAT/ESTAT не изменялись с ростом возможностей сервера базы данных Oracle.
Для решения этих проблем в Oracle8i Release 8.1.6 включен новый пакет SQL-скриптов – Statspack, который не только учитывает новые возможности базы данных, но и выбирает дополнительные данные о производительности, создавая более гибкий отчет. Получаемый отчет существенно легче интерпретируется.
В этой статье – первой из двух частей – представлен вводный обзор установки и использования Statspack. В части 2 анализируются и интерпретируются накопленные с помощью Statspack данные.
Что такое Statspack?
Существует два основных способа настройки: профилактика и реагирование. Профилактическая настройка обычно производится во время анализа и проектирования программ. Акцентирование на настройку на этих ранних стадиях обеспечивает наилучшую производительность. Однако на практике настройка заключается, в основном, в реагировании, как во время подготовки производства, так и во время эксплуатации систем. Statspack создан именно для упрощения настройки в режиме реагирования.
Для выполнения эффективной настройки реагирования особенно важно наличие определенного эталона или точки отсчета для того, чтобы сравнить хорошо работающую систему с плохой. Без этой информации сложно определить источник проблем:
- увеличение количества транзакций в системе?
- изменение параметров (profile) транзакций?
- увеличение числа пользователей?
Statspack позволяет легко управлять собранными данными. Поэтому эталонные данные можно будет сравнить с данными, полученными в момент возникновения проблемы производительности. (Замечание: статистика, о которой идет речь в этой статье, выбирается из V$-представлений динамической производительности; она не связана со статистикой, используемой оптимизатором для выбора плана выполнения SQL-предложений).
Statspack нельзя применять в более ранних, чем Release 8.1.6, версиях, так как он использует новые возможности версии 8.1.6; однако для пробной работы можно загрузить более ранние версии, совместимые с ней. Кроме того, Statspack способен собирать данные об экземплярах Oracle Parallel Server (OPS): для получения данных о любом экземпляре OPS-базы данных, следует присоединиться к экземпляру, за которым необходимо следить, и сделать снимок (snapshot). (см. раздел "Сбор данных" далее в этой статье). В будущем, версии Statspack будут включать дополнительные особенности OPS.
Сравнение с BSTAT/ESTAT
Statspack собирает больше информации и хранит статистику о производительности в постоянных таблицах Oracle, чем существенно отличается от хорошо известных скриптов настройки BSTAT/ESTAT. Таблицы Oracle могут затем использоваться для получения отчетов и проведения анализа. Собранные данные можно анализировать, просматривая отчет Statspack, включающий итоговую страницу "состояние экземпляра и данные о загрузке", ("instance health and load"), сведения о SQL-предложениях, потребляющих наибольшее количество ресурсов, а также традиционные данные об ожидающих процессы и параметрах инициализации. В таблице 1 приведено сравнение данных, полученных Statspack и BSTAT/ESTAT, отчетов, а также некоторые различия в возможностях этих средств.
Другое основное отличие Statspack от BSTAT/ESTAT заключается в способе сбора данных. Например, BSTAT/ESTAT не разделяет сбор данных и создание отчета: скрипт ESTAT автоматически создает отчет, а затем удаляет промежуточные таблицы с собранными данными. А в Statspack фазы сбора данных и создания отчета совершенно раздельны. Сбор данных можно инициировать по запросу пользователя или запустить автоматический процесс сбора данных. В отличие от BSTAT/ESTAT, Statspack хранит данные в постоянных таблицах Oracle, которые можно будет просмотреть в другое время.
Разделение этих двух фаз и хранение данных в постоянных таблицах позволяют построить отчет для заданных точек данных. Допустим, что для сбора данных используется входящий с состав пакета Statspack скрипт автоматической обработки (statsauto.sql). Если нарушение производительности продолжается дольше того временного интервала, который вы задали, предположим, час, а, скажем, в течение трех часов, то при создании отчета надо просто задать точки начала и конца сбора данных.
Вид отчета Statspack также сильно отличается от отчета ESTAT. Первая страница предназначена для облегчения идентификации основных данных о системе и помогает определить точку анализа производительности. На листинге 1 показана первая страница отчета Statspack, взятая из производственной базы данных. Область Load Profile упорядочивает данные о загруженности по времени и количеству транзакций и, таким образом, упрощает сравнение с другими точками данных.
Область Instance Efficiency включает вычисленную статистику, такую как размер кэша (buffer-cache hit), синтаксический разбор (soft-parse) и результативность работы подпроцессов (latch-hit ratios). Итоговая страница также включает Top-5 Wait Events, которые представляют собой список из пяти основных процессов, ожидающих выполнения во время сбора данных. Если параметр timed_statistics установлен в значение true, то процессы перечисляются в порядке увеличения времени ожидания его выполнения. Если timed_statistics не установлен или установлен в значение false, то процессы перечисляются в порядке увеличения числа ожиданий. (В листинге 1 параметр timed_statistics установлен в значение true.)
Для диагностики производительности значение параметра timed_statistics, находящегося в файле init.ora, всегда лучше устанавливать в true, что позволяет быстро определить причину медленной работы экземпляра и серверных процессов, связанных с экземпляром.
Сбор данных: получение информационного снимка.
Пользователи Statspack должны быть хорошо знакомы с концепцией информационного снимка (snapshot), представляющего собой отдельно взятый набор данных о производительности экземпляра базы данных. (Информационный снимок (snapshot), используемый Statspack, является набором данных о производительности. Его нельзя путать с снапшототом (snapshot) - механизмом распределенных баз данных Oracle.) Информационный снимок по ID, который присваивается ему при создании; каждый раз при создании нового набора данных Statspack порождает новый ID снимка.
Выбирая Уровнень Статистики, АБД могут изменять количество информации или детализацию статистики Statspack, собранной снимке заданного уровня. Выбранный уровень определяет объем собираемых данных. По умолчанию используется уровень 5.
- Уровень 0
: Statspack собирает общую статистику о производительности, такую как статистику ожиданий, системные процессы, системную статистику, данные о сегментах отката, о кэше строк, SGA, о фоновых событиях, о событиях сессий, статистику блокировок, статистику буферного пула и данные о защелках (latch).
- Уровень 5:
Statspack собирает всю статистику уровня 0, а также данные о производительности часто используемых SQL-предложениях, требующих много ресурсов (high-resource).
- Уровень 10
: Statspack собирает всю статистику уровня 0 и уровня 5 заодно с информацией о дочерних процессах. На уровне 10 создание снимка иногда может занимать длительное время, так как на этом уровне иногда требоуется много ресурсов. Его следует использовать только после согласования с пользователями Oracle.
Уровни 5 и 10 перехватывают тяжелых (high-resource) SQL-предложения, которые превышают какой-либо из следующих четырех параметров:
- Количество выполнений SQL-предложения (по-умолчанию = 100)
- Количество чтений с диска при выполнении SQL-предложения (по-умолчанию = 1,000)
- Количество произведенных синтаксических разборов SQL-предложения (по-умолчанию = 1,000)
- Количество извлечений SQL-предложения из буфера (по-умолчанию = 10,000)
Если количество обращений SQL-предложения к ресурсам превышает какой-либо из этих пороговых значений, Statspack использует данное предложение при создании снимка.
Уровень и пороговые значения хранятся в таблице stats$statspack_ parameters. На момент создания снимка значения по умолчанию для порогов и уровней можно изменить на новые или временно перезаписать.
Установка Statspack и Сбор Данных.
Statspack состоит из SQL-, PL/SQL- и SQL*Plus скриптов, которые позволяют собирать, хранить и просматривать данные о производительности (см. Таблицу 2). Инсталляционный скрипт (statscre.sql) вызывает несколько других скриптов, создающих по очереди полную оболочку Statspack. (Замечание: запускать следует только инсталляционный скрипт, а не основные скрипты, вызываемые в скрипте statscre.sql.).
Все скрипты, которые необходимо выполнить для установки и запуска Statspack, находятся в директории $ORACLE_HOME/rdbms/admin для платформы UNIX и в директории %ORACLE_HOME%\rdbms\admin системы Microsoft Windows NT.
Документация по установке и использованию Statspack расположена в файле statspack.doc. Инсталляционный скрипт создает PL/SQL-пакет, называемый statspack, который является ядром системы и содержит процедуры для сбора статистики. Для выполнения вычислений над данными при создании отчета из отчетного пакета – сочетание SQL, PL/SQL и SQL*Plus команд – вызывается пакет statspack.
Для установки Statspack следует подключиться к базе данных Oracle, как пользователь internal, и запустить скрипт statscre.sql. Этот шаг создает пользователя perfstat, который является владельцем всех PL/SQL-кодов и объектов базы данных, таких как Statspack-таблицы, ограничения на таблицы и пакет statspack. Права этого пользователя для настройки производительности ограничены только привилегией на выборку из V$-представлений. Скрипт подсказывает, как установить значения по умолчанию для табличного пространства пользователя perfstat и временного табличного пространства. Затем запрашивает имя табличного пространства для хранения собранных Statspack данных и индексов — Statspack не допускает использования табличного пространства, заданного по умолчанию.
Самый простой способ получения снимка – это подключиться через SQL*Plus пользователем perfstat и выполнить процедуру statspack.snap:
SQL> connect perfstat/perfstat
SQL> execute statspack.snap;
Таким образом, статистика текущего состояния производительности сохраняется в таблицах Statspack. Далее можно сравнить данные, полученные в другом снимке и найти различия, способствующие накоплению сведений о проблемах производительности.
Для того, чтобы сравнить производительность за один день, неделю или год с другим таким же периодом, необходимо создать множество снимков, созданных за этот период. Самый простой способ сбора серий снимков – это автоматический регулярный сбор данных, осуществить который можно одним из следующих способов:
- Используя процедуру пакета базы данных Oracle dbms_job, позволяющую составить график создания снимков (Для того, чтобы помочь с конфигурацией, в Statspack входит скрипт statsauto.sql. Для более подробной информации см. "Использование пакета dbms_job для Автоматического Сбора Статистики".).
- Используя для создания снимка утилиту операционной системы, находящуюся вне базы данных, например cron в UNIX.
Конфигурация Уровня Снимка и Пороговых Значений.
Несмотря на то, что по умолчанию уровень снимка равен 5, администраторы могут изменить его специально для рабочей области этого экземпляра. Чтобы изменить параметры, просто задайте новые значения по умолчанию, которые должен использовать Statspack. Для сохранения новых значений параметров воспользуйтесь процедурой statspack.snap, чтобы установить входную переменную i_modify_ parameter в значение true; при этом новые значения сохранятся в таблице stats$statspack_parameter:
SQL> execute statspack.snap(i_snap_level=>10, i_modify_parameter=> 'true');
(В таблице 3 показан список параметров, которые можно задавать в процедуре snap).
Значения по умолчанию можно изменить без немедленного получения снимка, используя процедуру statspack.modify_statspack_parameter. Например, для того, чтобы задать 10-ый уровень снимка и изменить пороговые значнеия SQL для извлечения из буфера и чтений с диска без получения снимка, выполните следующее предложение:
SQL> execute statspack.modify_statspack_parameter (i_snap_level=>10, i_buffer_gets_th=>10000,i_disk_reads_th=>1000);
К собранной статистике экземпляра во время создания снимка можно добавить всю статистику заданной сессии:
SQL> execute statspack.snap(i_session_id=>3);
Накопление статистики уровня сессии режимом по умолчанию не задается.
Как только множество снимков создано, можно проверить активность экземпляра, запустив выполнение отчета, создаваемого скриптом statsrep.sql. Листинг 2 показывает сессию выполнения скрипта в SQL*Plus. Убедитесь, что подключение к базе данных произошло пользователем perfstat. Ввод начального и конечного ID снимка, а также имя выходного файла отчета будет запрашиваться с экрана. (По умолчанию, имя включает ID начального и конечного сников).
Как сделать это лучше.
Statspack дает администраторам новое видоизмененное средство для сбора и анализа статистики производительности базы данных. Два основных преимущества Statspacks над BSTAT/ESTAT заключаются в возможности длительного сохранения статистических данных в таблицах базы данных Oracle, что позволяет облегчить получение отчета и анализ, а также сбор гораздо большего объема данных. А так как Statspack хранит статистику в таблицах Oracle, то данные о производительности можно легко копировать утилитой export. Это особенно полезно, когда, например, возникает необходимость послать данные в Oracle Support для консультации по диагностике. (Для этого в пакет Statspack входит файл параметров для экспорта —statsuexp.par)
Oracle8i Release 8.1.6 содержит первую промышленную версию Statspack. Oracle будет улучшать этот продукт с каждой новой версией Oracle Database Server для того, чтобы обеспечить эффективное, простое в использовании средство для сбора данных о производительности и определения ее проблем. В части 2 этой статьи анализируется статистический отчет Statspack.
Кони Дайлерис (cdialeri@us.oracle.com) и Грэхэм Вуд (gwood@us.oracle.com) являются членами Группы Технологии Производительности Сервера Oracle и работают вместе более 25 лет экспертами по программному обеспечению Oracle.
Использование dbms_job для Автоматического Сбора Статистики.
Для автоматического сбора статистики можно использовать пакет dbms_job. Файл statsauto.sql содержит пример ежечасного создания снимка. Когда с помощью пакета dbms_job создается задача, Oracle связывает с ней уникальный номер задачи, который можно использовать для ее изменения или удаления. С помощью dbms_job можно составить график автоматического создания снимков. Для этого в файле init.ora необходимо установить параметр инициализации job_queue_processes в значение большее, чем 0:
# Устанавливается для того, чтобы запустить процесс создания очереди задач.
# Это позволяет dbms_job задать расписание автоматического
# сбора статистики, используя Statspack
job_queue_processes=1
Измените интервал сбора статистики, используя процедуру dbms_job.interval:
execute dbms_job.interval(, 'SYSDATE+(1/48)');
В этом случае SYSDATE+(1/48) задает создание статистики каждые 1/48 суток – т.е. каждые полчаса. Для того, чтобы остановить задачу автоматического сбора статистики или удалить ее, выполните:
execute dbms_job.remove();
Таблица 1: Сравнение Statspack и BSTAT/ESTAT
Возможность |
Statspack |
BSTAT/ESTAT |
Итоговая страница экземпляра |
Y |
N |
Нормализация статистики экземпляра по времени и количеству транзакций |
Y |
N |
События ожиданий |
Y |
Y |
Тяжелые (High-resource) SQL-предложения |
Y* |
N |
Статистика активности экземпляра |
Y |
Y |
Статистика ввода/вывода по табличным пространствам и файлам |
Y |
Y |
Разбиение буферных ожиданий по типу |
Y |
Y |
Статистика очередей |
Y |
N |
Активность и размер памяти сегментов отката |
Y |
Y |
Активность защелок (Latch) |
Y |
Y |
Распределение ожиданий защелок (Latch-sleep breakdown) |
Y |
N |
Дочерние защелки (Latch children) |
Y** |
N |
Статистика буферного пула |
Y |
N |
Активность словарного кэша |
Y |
Y |
Активность библиотечного кэша |
Y |
Y |
Итог по памяти SGA |
Y |
N |
Распределение памяти SGA |
Y |
N |
Параметры init.ora, не заданные по умолчанию |
Y |
Y |
Конфигурируемое выходное имя |
Y |
N |
Возможность перемещать данные о производительности |
Y |
N |
Конфигурируемое количество собранных данных |
Y |
N |
Возможность запуска нескольких экземпляров Oracle Parallel Server |
Y |
N |
*Уровень 5 (по умолчанию) сбора данных
** Уровень 10 сбора данных
Таблица 2: Скрипты, соддержащиеся в Statspack*.
Имя файла |
Тип скрипта |
Функция |
Комментарий |
statspack.doc |
Документация |
Содержит инструкции и информацию о Statspack |
Прочтите всю документацию перед запуском установочных скриптов |
statscre.sql |
Установка |
Создает все окружение Statspack (вызывает statscusr.sql, statsctab.sql и statspack.sql) |
Для установки следует подключаться пользователем SYS или INTERNAL |
statsdrp.sql |
Установка |
Удаляет все окружение Statspack (вызывает statsdtab.sql и statsdusr.sql) |
Для запуска следует подключаться пользователем SYS или INTERNAL |
statsrep.sql |
Отчет |
Создает отчет Statspack |
Для запуска следует подключаться пользователем PERFSTAT |
statsauto.sql |
Автоматизация |
Автоматизирует сбор статистики Statspack с помощью dbms_job |
Для запуска следует подключаться пользователем PERFSTAT |
statsuexp.par |
Перемещение данных о производительности |
Пример файла параметров для экспорта пользователя perfstat |
Для запуска следует подключаться пользователем PERFSTAT |
*Файлы, которые содержат средства диагностики производительности Statspack, расположены в директории $ORACLE_HOME/rdbms/admin.
Таблица 3: параметры процедуры statspack.snap
Параметр |
Возможные значения |
Значение по-умолчанию |
Комментарий |
i_snap_level |
0, 5, 10 |
5 |
Уровень снимка |
i_ucomment |
текст |
Не задано |
Комментарий снимка |
i_executions_th |
число>=0 |
50 |
Пороговое значение SQL: количество выполнений |
i_disk_reads_th |
число>=0 |
1,000 |
Пороговое значение SQL: количество чтений с диска |
i_parse_calls_th |
число>=0 |
1,000 |
Пороговое значение SQL: количество вызовов синтаксического разбора |
i_buffer_gets_th |
число>=0 |
10,000 |
Пороговое значение SQL: количество извлечений из буферов |
i_session_id |
Правильный SID из v$session |
0 (нет сессии) |
ID сессии; перехват статистики заданной сессии |
i_modify_parameter |
true, false |
true |
Сохранять ли специфичные параметры для дальнейшего использования |
Листинг 1. Первая страница обычного отчета Statspack
Листинг 2 Запуск на выполнение отчета Statspack
|