Рgpro_pwr — инструмент стратегического мониторинга нагрузки на базу данных, который помогает DBA выявлять самые ресурсоёмкие операции. Первая версия модуля — для PostgreSQL — появилась в 2017-м и называлась pg_profile, а разработал её Андрей Зубков — в те времена администратор баз данных, а сейчас инженер Postgres Professional. 

Отличие утилиты pg_profile от pgpro_pwr состоит в том, что первая работает с опенсорсной PostgreSQL (в 2024 году пакет pg_profile был включен в репозиторий PostgreSQL 17), а вторая может собирать расширенные статистики и встроена в релизы Postgres Pro.

Как всё начиналось

Мы не изобрели велосипед: похожие средства были и раньше, но работать с ними в веб-приложениях было неудобно — приходилось разворачивать системы мониторинга отдельно от СУБД. Администраторы БД (особенно знакомые с Oracle AWR)  мечтали об  утилите, которая работала бы прямо внутри Postgres — именно такое платформенно независимое расширение Андрей и написал на PL/pgSQL. 

Как работают pg_profile и pgpro_pwr

В наших утилитах нет алертинга: они следят за показателями нагрузки в БД с помощью счётчиков, непрерывно возрастающих с момента последнего сброса — часто с момента создания кластера. Эти данные в чистом виде бесполезны, но показательны их приращения во времени в разных срезах: на уровне кластеров или БД, отдельных функций или таблиц. Утилиты фиксируют показания счетчиков с заданным интервалом и записывают разницу значений в свой репозиторий. 

Короткий тест на то, нужна ли вам утилита:

1. Хотите проверить запас прочности давно работающей системы, чтобы, например, «прикрутить» к ней новую функцию? 

2. Хотите проанализировать результаты нагрузочного тестирования?

3. Хотите выявить активности, которые нагружают вашу систему больше остальных, например:

  • активные таблицы, которые требуют частого запуска процедуры VACUUM;

  • слишком часто или долго исполняемые запросы;

  • «кривой» план оптимизации.

    Спойлер

    Пока «кривые» планы умеет выявлять только pgpro_pwr, но мы надеемся научить этому и pg_profile.

Если вы ответили «да» на любой из этих вопросов, pg_profile или pgpro_pwr вам точно понадобятся.

Теперь посмотрим, из чего состоят и что умеют наши pg_profile и pgpro_pwr. 

Устройство утилит

В состав pg_profile и pgpro_pwr входят:

  • Таблицы репозитория для хранения данных со снимков

  • Функции сбора данных для снимков

  • Функции построения отчетов

  • Служебные таблицы и функции

У утилит две задачи: 

  1. Выполнение снимков. Утилиты изолированы от ОС и не может настраивать что-то самостоятельно, поэтому для снимков нужно настроить отдельный планировщик.

  2. Формирование отчётов — html-документов с суммарной статистикой за определённый интервал времени. Отчёты включают множество статистик, некоторые из них есть только в pgpro_pwr. Например, статистики очистки БД и отдельных планов, статистики выражений на уровне планов, распределение нагрузки и статистики инвалидаций.

Как мониторить производительность

Для подготовки к мониторингу выполните несколько шагов, которые мы подробно описали в документации:

  1. Установите расширение (pg_profile / pgpro_pwr

  2. Настройте роли (pg_profile / pgpro_pwr).

  3. Настройте параметры расширения (pg_profile / pgpro_pwr).

После установки оба расширения создадут один активный сервер local, соответствующий текущему кластеру. Сервером можно управлять с помощью функций (полный список для pg_profile и pgpro_pwr). Например, функция create_server создаёт определение сервера:

create_server(server name, server_connstr text, server_enabled boolean = TRUE, max_sample_age integer = NULL, description text = NULL) 

Вот пример этой функции в действии:

SELECT profile.create_server('omega','host=name_or_ip dbname=postgres port=5432');

Статистическую информацию о нагрузке базы данных содержат выборки, которыми тоже можно управлять (pg_profile / pgpro_pwr). Собранные выборки можно экспортировать из одного экземпляра расширения и загрузить в другой (об импорте и экспорте в pg_profile / pgpro_pwr). Это позволяет перемещать накопленную информацию о серверах или передавать её специалистам техподдержки для анализа.

Расширения, серверы и выборки настроены — теперь можно формировать отчёты, которые делятся на: 

  • Обычные (pg_profile / pgpro_pwr) — предоставляют статистику по нагрузке для заданного интервала.

  • Сравнительные (pg_profile / pgpro_pwr) — предоставляют статистику по одинаковым объектам для сравнения в двух интервалах.

Пример построения отчёта для локального сервера (local) за интервал, определяемый выборками: 

$ 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

Отчёт можно открыть в любом браузере. Виды отчётов и статистики, которые содержит каждый вид, подробно описаны в документации (pg_profile / pgpro_pwr).

Вот несколько примеров:

Статистики ожиданий
Статистики ожиданий
Расширенные статистики очистки
Расширенные статистики очистки
Распределение нагрузки
Распределение нагрузки

Что дальше

Сейчас мы пытаемся передать в ваниллу патч с вакуумными статистиками. Мы стараемся отдавать в апстрим всё, что только можем, потому что разрешать последующие мёрж-конфликты бывает довольно сложно. 

Если у вас возникнут вопросы или сложности в процессе мониторинга, будем рады помочь. Делитесь мнениями и идеями в комментариях!

Комментарии (0)