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
.