pg_profile. Сбор и анализ статистики производительности#
Модуль обеспечивает возможность сбора и анализа статистики производительности СУБД Pangolin.
Модуль не влияет на конфигурацию с кластером высокой доступности СУБД Pangolin.
Запись статистики в базу данных выполняется с помощью pg_cron. Сбор статистики запускается всегда на мастере.
Поведение описано в документе «Руководство администратора», раздел «Сценарии администрирования», подраздел «Отчетность по нагрузке Pangolin».
Доработка#
Доработка: Использование защищенного хранилища паролей.
Версия: 4.4.0.
Ограничения#
Для корректной работы pg_profile необходимы следующие расширения (по умолчанию включены в состав поставки СУБД Pangolin):
dblink - расширение используется для подключения к БД и доработано для использования защищенного хранилища паролей;
pg_cron - расширение для создания заданий по расписанию;
pg_stat_statements - расширение для сбора статистики по SQL-выражениям;
plpgsql - расширение по работе с plpgsql.
Установка#
Установка расширения может быть произведена в процессе развертывании СУБД Pangolin при использовании параметра pg_profile.is_enable: true (документ «Руководство по установке», раздел «Автоматизированная установка при помощи Ansible-скриптов»).
Расширению pg_profile требуются расширения plpgsql, dblink.
Установка в ручном режиме#
При ручной установке необходимо выполнить следующие шаги:
Установите файлы расширения
pg_profile.Распакуйте файлы расширения в каталог с расширениями Pangolin, например:
tar xzf pg_profile-<version>.tar.gz --directory $(pg_config --sharedir)/extensionУбедитесь, что используется подходящая утилита
pg_config.Создайте расширения
pg_profile.Рекомендуется установка в отдельную схему – расширение создает свои собственные таблицы, представления, последовательности и функции. Создайте схему для сбора статистики и установите расширение в эту схему:
CREATE SCHEMA pgse_profile; CREATE EXTENSION dblink schema ext; CREATE EXTENSION plpgsql schema pgse_profile; CREATE EXTENSION pg_stat_statements schema ext; CREATE EXTENSION pg_profile SCHEMA pgse_profile;Настройте пользователя:
CREATE ROLE profile_tuz NOLOGIN; REVOKE ALL ON SCHEMA pgse_profile FROM public; GRANT USAGE ON SCHEMA ext TO profile_tuz; GRANT USAGE ON SCHEMA pgse_profile TO profile_tuz; GRANT pg_read_all_stats TO profile_tuz; GRANT EXECUTE ON FUNCTION pg_stat_statements_reset TO profile_tuz; GRANT all ON all TABLES IN SCHEMA ext TO profile_tuz; GRANT SELECT, USAGE ON all sequences IN SCHEMA ext TO profile_tuz; GRANT EXECUTE ON all functions in SCHEMA ext TO profile_tuz; GRANT all ON all tables in SCHEMA pgse_profile TO profile_tuz; GRANT SELECT, USAGE ON all sequences IN SCHEMA pgse_profile TO profile_tuz; GRANT EXECUTE ON all functions IN SCHEMA pgse_profile TO profile_tuz; GRANT USAGE ON TYPE dblink_pkey_results TO profile_tuz;Настройте права пользователя
as_admin.Настройте серверы
pg_profileи задачи cron:SELECT pgse_profile.create_server('master', 'dbname={{ db_name }} host={{ hostname }} port={{ port }} user=profile_tuz');Если установка мастер + standalone:
SELECT pgse_profile.create_server('slave', 'dbname={{ db_name }} host={{ hostname }} port={{ port }} user=profile_tuz'); ()В общем случае, если на одном экземпляре есть несколько БД, достаточно добавить один сервер, который обойдет все базы.
SELECT cron.schedule('{{ pg_profile.stats_periods }}', 'SELECT pgse_profile.take_sample()');Обновите
pg_profileдо новой версии.Новые версии
pg_profileбудут содержать скрипт миграции (когда это возможно). В случае обновления необходимо установить новые файлы расширения (см. шаг 1) и обновить расширение:ALTER EXTENSION pg_profile UPDATE;Установите расширение
pg_stat_kcache.Распакуйте файлы расширения в каталог с расширениями Pangolin:
tar xzf pg_stat_kcache-<version>.tar.gz --directory $(pg_config --sharedir)/extensionУбедитесь, что используется подходящая утилита
pg_config.
Настройка#
При настройке расширения необходимо создать подключения к обоим узлам кластера для сбора статистики.
Параметр |
Значение по умолчанию |
Описание |
|---|---|---|
|
true |
Установка базы с установленным расширением |
|
20 |
Количество основных объектов (statements, relations и т.д.), которые должны быть представлены в каждой отсортированной таблице отчета. Параметр влияет на размер выборки - чем больше объектов требуется отобразить в отчете, тем больше объектов нужно сохранить в выборке |
|
7 |
Срок хранения выборок в днях |
|
off |
Когда этот параметр включен, |
|
0,30 * * * * |
Строка в стиле crontab для настройки периодов сбора статистики, по умолчанию: раз в полчаса, каждый час в 0 и 30 минут |
|
20000 |
Ограничение размера запросов, применяется только к тем запросам, которые выполнялись во время сбора статистики. Не применяется к запросам из |
Использование модуля#
Во время установки расширение создает один активированный локальный сервер для кластера, где установлено расширение.
При необходимости можно добавить дополнительные сервера для сбора статистики командой:
SELECT pgse_profile.create_server('omega','host=name_or_ip dbname=postgres port=5432');
Выборки#
Каждая выборка содержит статистическую информацию о рабочей нагрузке БД со времени предыдущей выборки.
Функция сбора выборок также обслуживает хранилище сервера — удаляет устаревшие выборки в соответствии с политикой хранения.
Сохранение выборки#
Нужно собрать не меньше 2 выборок, чтобы иметь возможность создания первого отчета между 1-ой и 2-ой выборками. Выборки для всех активированных серверов собираются вызовом функции take_sample(). Как правило, собирают одну или две выборки в час.
Для взятия выборок по расписанию можно использовать cron или похожие инструменты. Пример с 30-ти минутным периодом:
*/30 * * * * psql -c 'SELECT pgse_profile.take_sample();' > /dev/null 2>&1
Рассмотренный выше вызов функции не имеет проверки на ошибки результатов take_sample().
Функцию take_sample() можно вызвать так, чтобы она вернула OK для всех серверов, где выборка взята успешно, и показала текст ошибки для неудачных попыток:
select * from take_sample();
server | result | elapsed
-----------+-------------------------------------------------------------------------------+---------------
ok_node | OK | 00:00:00.48
fail_node | could not establish connection +| 00:00:00
| SQL statement "SELECT dblink_connect('server_connection',server_connstr)" +|
| PL/pgSQL function take_sample(integer) line 69 at PERFORM +|
| PL/pgSQL function take_sample_subset(integer,integer) line 27 at assignment +|
| SQL function "take_sample" statement 1 +|
| FATAL: database "nodb" does not exist |
(2 rows)
Хранение данных выборки#
Чтобы не хранить данные выборок вечно, существует политика хранения.
Уровни хранения:
Обычное хранение (действует, если не определен другой уровень хранения). Задайте параметр
pg_profile.max_sample_ageв файлеpostgresql.conf.Определите параметр
max_sample_ageсервера при создании сервера или с помощью функцииset_server_max_sample_age()для существующего сервера.Примечание:
Параметр
max_sample_ageотменяет глобальный параметрpg_profile.max_sample_ageдля конкретного сервера.Baseline переопределяет срок хранения для включенных (included) выборок с наивысшим приоритетом. Создайте baseline.
Список выборок#
Используйте функцию show_samples(), чтобы получить список существующих выборок в репозитории. Эта функция также покажет обнаруженное время сброса статистики.
Тайминги сбора выборок#
Расширение pg_profile будет собирать подробную статистику по времени сбора выборок, когда включен параметр pg_profile.track_sample_timings.
Baselines#
Baseline — это именованная последовательность выборок с собственными настройками хранения.
Baseline можно использовать в функциях построения отчетов как интервал выборки. Неопределенный baseline хранения означает бесконечное хранение.
Baselines можно использовать для сохранения информации о загруженности базы данных за определенный период времени. Например, можно сохранить выборки, собранные во время нагрузочного тестирования или во время регулярной нагрузки на систему для дальнейшего использования.
Отчеты#
Отчеты создаются в формате HTML функциями по работе с отчетами. В pg_profile есть два типа доступных отчетов:
регулярные отчеты — содержат статистическую информацию о загруженности экземпляра за период отчета;
отчеты по изменениям — содержат данные из двух интервалов со значениями статистики с одинаковых объектов, расположенных один за другим, что упрощает сравнение рабочей нагрузки.
Посмотреть отчет можно в любом веб-браузере.
Функции регулярных отчетов и отчетов по изменениям описаны в документе «Список PL/SQL функций продукта», раздел «Отчетность по нагрузке Pangolin» (документ доступен в личном кабинете).
Построить отчет по изменениям можно также с помощью следующих комбинаций:
get_diffreport([server name,] baseline varchar(25), time_range tstzrange [, description text])
get_diffreport([server name,] time_range tstzrange, baseline varchar(25) [, description text])
get_diffreport([server name,] start1_id integer, end1_id integer, baseline varchar(25) [, description text])
get_diffreport([server name,] baseline varchar(25), start2_id integer, end2_id integer [, description text])
Примеры формирования отчетов#
psql -Aqtc "SELECT profile.get_report(480,482)" -o report_480_482.html
Для любых других серверов по их именам:
psql -Aqtc "SELECT profile.get_report('omega',12,14)" -o report_omega_12_14.html
Формирование отчета по временному промежутку:
psql -Aqtc "select profile.get_report(tstzrange('2020-05-13 11:51:35+03','2020-05-13 11:52:18+03'))" -o report_range.html
Формирование отчета за последние 24 часа:
psql -Aqtc "select profile.get_report(tstzrange(now() - interval '1 day',now()))" -o last24h_report.html
Отключение функциональности#
Отключение pg_stat_kcache#
Удалите значение
pg_stat_kcacheиз параметраshared_preload_libraries.Перезагрузите сервер.
Отключение подсчета точного размера отношений#
Установите relnblocks_enable в off.
Отключение сбора статистика pg_profile#
Определите
jobidзадачи дляpg_profileс помощью запроса:SELECT * from cron.job;Отключите задачу запросом:
SELECT cron.unschedule(jobid);
Отключение сбора статистики не требует перезагрузки.
Ссылки на документацию разработчика#
Дополнительно поставляемый модуль pg_profile: https://github.com/zubkov-andrei/pg_profile.