pg_profile. Сбор и анализ статистики производительности
Версия: 4.2.
В исходном дистрибутиве установлено по умолчанию: да.
Связанные компоненты:
dblink
,plpgsql
,pg_cron
.Схема размещения:
pgse_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
.
Настройка
При настройке расширения необходимо создать подключения к обоим узлам кластера для сбора статистики.
Параметр | Значение по умолчанию | Описание |
---|---|---|
pg_profile.is_enable | true | Установка базы с установленным расширением pg_profile и настроенным в pg_cron заданием на сборку статистики |
pg_profile.topn | 20 | Количество основных объектов (statements, relations и т.д.), которые должны быть представлены в каждой отсортированной таблице отчета. Параметр влияет на размер выборки - чем больше объектов требуется отобразить в отчете, тем больше объектов нужно сохранить в выборке |
pg_profile.max_sample_age | 7 | Срок хранения выборок в днях |
pg_profile.track_sample_timings | off | Когда этот параметр включен, pg_profile будет отслеживать точное время сбора выборок |
pg_profile.stats_periods | 0,30 * * * * | Строка в стиле crontab для настройки периодов сбора статистики, по умолчанию: раз в полчаса, каждый час в 0 и 30 минут |
pg_profile.query_length | 20000 | Ограничение размера запросов, применяется только к тем запросам, которые выполнялись во время сбора статистики. Не применяется к запросам из pg_stat_statements |
Использование модуля
Во время установки расширение создает один активированный локальный сервер для кластера, где установлено расширение.
При необходимости можно добавить дополнительные сервера для сбора статистики командой:
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.