Р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 входят:
Таблицы репозитория для хранения данных со снимков
Функции сбора данных для снимков
Функции построения отчетов
Служебные таблицы и функции
У утилит две задачи:
Выполнение снимков. Утилиты изолированы от ОС и не может настраивать что-то самостоятельно, поэтому для снимков нужно настроить отдельный планировщик.
Формирование отчётов — html-документов с суммарной статистикой за определённый интервал времени. Отчёты включают множество статистик, некоторые из них есть только в pgpro_pwr. Например, статистики очистки БД и отдельных планов, статистики выражений на уровне планов, распределение нагрузки и статистики инвалидаций.
Как мониторить производительность
Для подготовки к мониторингу выполните несколько шагов, которые мы подробно описали в документации:
Установите расширение (pg_profile / pgpro_pwr)
Настройте роли (pg_profile / pgpro_pwr).
Настройте параметры расширения (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).
Вот несколько примеров:
Что дальше
Сейчас мы пытаемся передать в ваниллу патч с вакуумными статистиками. Мы стараемся отдавать в апстрим всё, что только можем, потому что разрешать последующие мёрж-конфликты бывает довольно сложно.
Если у вас возникнут вопросы или сложности в процессе мониторинга, будем рады помочь. Делитесь мнениями и идеями в комментариях!