Перейти к основному содержимому

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.

Установка в ручном режиме

При ручной установке необходимо выполнить следующие шаги:

  1. Установите файлы расширения pg_profile.

    Распакуйте файлы расширения в каталог с расширениями Pangolin, например:

    tar xzf pg_profile-<version>.tar.gz --directory $(pg_config --sharedir)/extension

    Убедитесь, что используется подходящая утилита pg_config.

  2. Создайте расширения 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;
  3. Настройте пользователя:

    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;
  4. Настройте права пользователя as_admin.

  5. Настройте серверы 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()');
  6. Обновите pg_profile до новой версии.

    Новые версии pg_profile будут содержать скрипт миграции (когда это возможно). В случае обновления необходимо установить новые файлы расширения (см. шаг 1) и обновить расширение:

    ALTER EXTENSION pg_profile UPDATE;
  7. Установите расширение pg_stat_kcache.

    Распакуйте файлы расширения в каталог с расширениями Pangolin:

    tar xzf pg_stat_kcache-<version>.tar.gz --directory $(pg_config --sharedir)/extension

    Убедитесь, что используется подходящая утилита pg_config.

Настройка

При настройке расширения необходимо создать подключения к обоим узлам кластера для сбора статистики.

ПараметрЗначение по умолчаниюОписание
pg_profile.is_enabletrueУстановка базы с установленным расширением pg_profile и настроенным в pg_cron заданием на сборку статистики
pg_profile.topn20Количество основных объектов (statements, relations и т.д.), которые должны быть представлены в каждой отсортированной таблице отчета. Параметр влияет на размер выборки - чем больше объектов требуется отобразить в отчете, тем больше объектов нужно сохранить в выборке
pg_profile.max_sample_age7Срок хранения выборок в днях
pg_profile.track_sample_timingsoffКогда этот параметр включен, pg_profile будет отслеживать точное время сбора выборок
pg_profile.stats_periods0,30 * * * *Строка в стиле crontab для настройки периодов сбора статистики, по умолчанию: раз в полчаса, каждый час в 0 и 30 минут
pg_profile.query_length20000Ограничение размера запросов, применяется только к тем запросам, которые выполнялись во время сбора статистики. Не применяется к запросам из 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)

Хранение данных выборки

Чтобы не хранить данные выборок вечно, существует политика хранения.

Уровни хранения:

  1. Обычное хранение (действует, если не определен другой уровень хранения). Задайте параметр pg_profile.max_sample_age в файле postgresql.conf.

  2. Определите параметр max_sample_age сервера при создании сервера или с помощью функции set_server_max_sample_age() для существующего сервера.

    Примечание:

    Параметр max_sample_age отменяет глобальный параметр pg_profile.max_sample_age для конкретного сервера.

  3. 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

  1. Удалите значение pg_stat_kcache из параметра shared_preload_libraries.
  2. Перезагрузите сервер.

Отключение подсчета точного размера отношений

Установите relnblocks_enable в off.

Отключение сбора статистика pg_profile

  1. Определите jobid задачи для pg_profile с помощью запроса:

    SELECT * from cron.job;
  2. Отключите задачу запросом:

    SELECT cron.unschedule(jobid);

Отключение сбора статистики не требует перезагрузки.

Ссылки на документацию разработчика

Дополнительно поставляемый модуль pg_profile: https://github.com/zubkov-andrei/pg_profile.