pg_profile. Сбор и анализ статистики производительности
Версия: 4.7.
В исходном дистрибутиве установлено по умолчанию: да.
Связанные компоненты: dblink, plpgsql, pg_cron.
Схема размещения:
pgse_profile.
Модуль обеспечивает возможность сбора и анализа статистики производительности СУБД Pangolin.
Модуль не влияет на конфигурацию с кластером высокой доступности СУБД Pangolin.
Запись статистики в базу данных выполняется с помощью pg_cron. Сбор статистики запускается всегда на мастере.
Поведение описано в документе «Руководство администратора», раздел «Диагностика и планирование», подраздел «Отчетность по нагрузке СУБД Pangolin».
Доработка
Совместимость с хранилищем паролей
Доработка: Использование защищенного хранилища паролей.
Версия: 4.4.0.
Описание использования защищенного хранилища паролей в документе «Руководство администратора», раздел «Утилита засекречивания и хранения параметров подключения к БД».
Интеграция с хранилищем паролей (получение пароля из хранилища)
Доработка: Расширение может получить пароль из хранилища по набору параметров
host,port,database,usernameполучаемых из настроек подключения кFOREIGN SERVERиUSER MAPPING.Версия: 6.6.0
Расширение pg_profile непосредственно не работает с хранилищем паролей, однако, в своей работе использует расширение dblink, которое может получать пароль из хранилища. Для того чтобы другие утилиты или расширения не могли воспользоваться паролями расширения pg_profile в хранилище рекомендуется защищать их путем заполнения полей roles и appnames.
Описание данной доработки приведено в подразделе «Доработка хранилища паролей для обеспечения безопасного взаимодействия с расширениями и внешними утилитами» в документе «Руководство администратора».
Ограничения
Для корректной работы pg_profile необходимы следующие расширения (по умолчанию включены в состав поставки СУБД Pangolin):
- dblink - расширение используется для подключения к БД и доработано для использования защищенного хранилища паролей;
- plpgsql - расширение по работе с процедурным языком PL/PgSQL.
Дополнительными не обязательными расширениями являются:
- pg_cron – расширение для создания заданий по расписанию;
- pg_stat_statements – расширение для сбора статистики по SQL-выражениям;
- pg_stat_kcache – расширение для сбора статистики по использованию ресурсов процессора;
pg_wait_sampling– расширение для автоматического снятия показаний по событиям ожидания (не входит в поставку Pangolin).
Описание
pg_profile - это расширение, которое помогает выявить самые ресурсоемкие операции в базах данных.
Расширение построено на статистических представлениях и нескольких дополнительных расширениях. Оно написано полностью на PL/PgSQL и не требует внешних библиотек или программного обеспечения, кроме самой СУБД Pangolin и инструмента, похожего на cron, для выполнения периодических задач.
Расширение pg_profile использует данные из pg_stat_kcache и собирает информацию о загрузке CPU и файловой системы (если это расширение установлено).
В базе данных будет создан исторический репозиторий — хранилище «выборок» для кластеров СУБД Pangolin. Выборка создается вызовом функции take_sample(). Поскольку в СУБД нет встроенного механизма планировщика задач, потребуется использовать cron (также, в состав дистрибутива СУБД Pangolin входит расширение pg_cron).
Периодические выборки позволяют выявить наиболее ресурсоемкие активности в прошлом. Например, если несколько часов назад была зафиксирована деградация производительности, постройте отчет между двумя выборками, охватывающими этот период, чтобы увидеть профиль нагрузки базы данных. Используйте, например, панель мониторинга в Grafana, чтобы точно определить время, когда происходили проблемы с производительностью. Также при необходимости создайте вручную выборку перед запуском пакетной обработки и после ее завершения.
Каждый раз, когда делается выборка, происходит вызов функции pg_stat_statements_reset(), чтобы гарантировать, что данные о запросах не потеряются из-за достижения лимита, определенного параметром pg_stat_statements.max. Отчет будет содержать раздел, информирующий, если количество собранных запросов в любой выборке приближается к 90% от значения параметра pg_stat_statements.max. Сброс данных pg_stat_statements может повлиять на системы мониторинга.
Если доступно расширение pg_wait_sampling, pg_profile будет собирать сводную статистику ожиданий в экземпляре СУБД Pangolin и сбрасывать данные из представления pg_wait_sampling_profile. Такое поведение также может влиять на системы мониторинга.
pg_profile, установленный в одном кластере, способен собирать статистику с других кластеров, называемых серверами. Просто определите эти серверы, указав имена и строки подключения, и убедитесь, что возможно подключение ко всем базам данных на всех серверах. Таким образом, возможно отслеживать статистику с реплик на мастере или с любого другого сервера. После установки расширения автоматически создается сервер local — это сервер, на котором установлен сам pg_profile.
Архитектура расширения
Расширение состоит из четырех частей:
- Исторический репозиторий — хранилище данных о выборках. Представляет собой набор таблиц расширения.
- Управление выборками — набор функций для создания выборок и очистки устаревших данных из репозитория.
- Генерация отчетов — набор функций для генерации отчетов на основе данных из исторического репозитория.
- Административные функции — позволяют создавать и управлять серверами и базовыми линиями (
baselines).
Предварительные требования
Расширение pg_profile обычно устанавливается в целевой кластер, он также может собирать данные с других кластеров. Поэтому есть требования как к базе данных, в которую устанавливается расширение pg_profile, так и к серверам:
- расширения
plpgsqlиdblinkдолжны быть также установлены в базе данныхpg_profile; - должна быть обеспечена возможность подключения к кластеру сервера из базы данных
pg_profileпо указанной строке подключения.
Указанные далее требования — опциональны, но они могут улучшить полноту собираемой статистики.
Рекомендуется установить следующие параметры сбора статистики:
track_activities = on
track_counts = on
track_io_timing = on
track_wal_io_timing = on # Начиная с СУБД Pangolin 6.X.X
track_functions = all/pl
Если необходимо видеть статистику по запросам в отчетах, то база данных, указанная в строке подключения сервера, должна иметь установленное расширение pg_stat_statements. Настройте параметры pg_stat_statements под нужды:
pg_stat_statements.max— слишком низкое значение может привести к исчезновению части статистики по запросам до создания выборки. Отчет предупредит, еслиpg_stat_statements.maxокажется недостаточным.pg_stat_statements.track = 'top'— до версии СУБД Pangolin 6.x.x значениеallможет повлиять на точность полей%Totalв секциях, связанных с запросами.
Установка
Установка расширения может быть произведена в процессеавтоматизированного развертывания СУБД Pangolin при использовании параметра pg_profile.is_enable: true.
Расширению pg_profile требуются расширения plpgsql, dblink.
Установка вручную
Шаг 1. Установка файлов расширения
Распакуйте файлы расширения в директорию расширений СУБД Pangolin:
tar xzf pg_profile-<версия>.tar.gz --directory $(pg_config --sharedir)/extension
Убедитесь, что используется правильная утилита pg_config.
Шаг 2. Создание расширений
Самый простой способ — установить все в схему public базы данных:
CREATE EXTENSION dblink;
CREATE EXTENSION pg_stat_statements;
CREATE EXTENSION pg_profile;
Если необходимо установить pg_profile в другую схему, создайте и установите расширение в созданную схему:
CREATE EXTENSION dblink;
CREATE EXTENSION pg_stat_statements;
CREATE SCHEMA profile;
CREATE EXTENSION pg_profile SCHEMA profile;
Все объекты будут созданы в схеме, указанной в параметре SCHEMA. Установка в отдельную схему является рекомендуемым способом, так как расширение создает собственные таблицы, представления, последовательности и функции. Хорошей практикой является их изоляция. Если указывать схему не представляется возможным, при использовании модуля, измените параметр search_path.
Шаг 3. Обновление до новой версии
Новые версии pg_profile содержат скрипт миграции (по возможности), поэтому для обновления необходимо установить новые файлы (смотрите «Шаг 1») и выполнить команду:
ALTER EXTENSION pg_profile UPDATE;
Настройка
Привилегии
Во время работы pg_profile могут участвовать до трех ролей:
- Владелец
pg_profile– владелец расширенияpg_profile; - Роль сбора данных – используется
pg_profileпри подключении к базам данных; - Роль генерации отчетов – используется для создания отчетов.
Если используется суперпользователь postgres для всех операций с pg_profile, можно пропустить большую часть следующих шагов.
Владелец pg_profile
Эта роль может выполнять все действия, связанные с расширением. Она будет иметь доступ к строкам подключения к серверам, которые могут содержать пароли. Используйте эту роль для запуска функции take_sample(). Для этого пользователя требуется расширение dblink.
В СУБД Pangolin в расширение добавлена функциональность получения пароля из хранилища, написанная на языке C, поэтому установить расширение возможно только под суперпользователем.
Пример (при условии, что каждое расширение в своей схеме):
\c postgres postgres
CREATE SCHEMA dblink;
CREATE EXTENSION dblink SCHEMA dblink;
CREATE USER profile_tuz with password 'profile_pwd';
GRANT USAGE ON SCHEMA dblink TO profile_tuz;
CREATE SCHEMA pgse_profile AUTHORIZATION profile_tuz;
CREATE EXTENSION pg_profile SCHEMA pgse_profile;
Роль сбора данных
Эта роль должна использоваться pg_profile для подключения к базам данных и сбора статистики. Непривилегированные пользователи не могут подключаться через dblink без пароля, поэтому его надо указать в строке подключения каждого сервера. Эта роль должна иметь доступ ко всем поддерживаемым расширениям статистики и иметь права на сброс статистики в этих расширениях.
Пример:
\c postgres postgres
CREATE SCHEMA pgss;
CREATE SCHEMA pgsk;
CREATE SCHEMA pgws;
CREATE EXTENSION pg_stat_statements SCHEMA pgss;
CREATE EXTENSION pg_stat_kcache SCHEMA pgsk;
CREATE EXTENSION pg_wait_sampling SCHEMA pgws;
CREATE USER profile_collector with password 'collector_pwd';
GRANT pg_read_all_stats TO profile_collector;
GRANT USAGE ON SCHEMA pgss TO profile_collector;
GRANT USAGE ON SCHEMA pgsk TO profile_collector;
GRANT USAGE ON SCHEMA pgws TO profile_collector;
GRANT EXECUTE ON FUNCTION pgsk.pg_stat_kcache_reset TO profile_collector;
GRANT EXECUTE ON FUNCTION pgss.pg_stat_statements_reset TO profile_collector;
GRANT EXECUTE ON FUNCTION pgws.pg_wait_sampling_reset_profile TO profile_collector;
Поскольку в СУБД Pangolin установка расширения возможна только под суперпользователем, для того, чтобы при работе функций было возможно обновление статистики(analyze) в расширении pg_profile, необходимо сделать роль сбора владельцем всех объектов в схеме pgse_profile. Ниже приведен пример скрипта для данного действия.
DO
LANGUAGE plpgsql
$$
DECLARE r record;
BEGIN
FOR r IN SELECT table_schema, table_name
FROM information_schema.tables
WHERE table_schema = 'pgse_profile'
LOOP
EXECUTE FORMAT('ALTER TABLE %I.%I OWNER TO profile_tuz;', r.table_schema, r.table_name);
END LOOP;
END
$$;
Теперь настройте строку подключения к базе данных с включенными расширениями:
\c postgres profile_tuz
SELECT profile.set_server_connstr('local','dbname=postgres port=5432 host=localhost user=profile_collector password=collector_pwd');
В СУБД Pangolin реализовано хранилище паролей, поэтому указывать пароль в строке подключения необязательно, возможно добавить его в хранилище и оно будет использовано оттуда. Однако возможность добавить пароль прямо в строку также сохранена, для обратной совместимости. Утилита pg_auth_config подробно описана в разделе «Утилиты засекречивания и хранения параметров подключения к БД» документа «Руководство администратора».
Аутентификация по паролю должна быть настроена в файле pg_hba.conf для пользователя profile_collector.
Роль сбора должна быть правильно настроена на всех серверах, с которых собирает статистику pg_profile.
Теперь вызовите функцию take_sample() от имени profile_tuz:
\c postgres profile_tuz
SELECT * FROM take_sample();
Настройте планировщик (например, crontab пользователя postgres):
*/30 * * * * psql -U profile_tuz -d postgres -c 'SELECT profile.take_sample()' > /dev/null 2>&1
Обратите внимание, что можно использовать файл паролей СУБД Pangolin для хранения паролей.
Роль генерации отчетов
Полный отчет с текстами запросов доступен только для членов роли pg_read_all_stats. Роль генерации отчетов не может получить доступ к строкам подключения серверов и, следовательно, к их паролям.
Для того чтобы выдать права на генерацию отчетов для роли profile_report, необходим следующий набор привилегий:
Набор привилегий
GRANT USAGE ON SCHEMA pgse_profile TO "profile_report";
GRANT SELECT ON ALL TABLES IN SCHEMA pgse_profile TO "profile_report";
GRANT USAGE ON ALL SEQUENCES IN SCHEMA pgse_profile TO "profile_report";
GRANT USAGE ON TYPE ext.dblink_pkey_results TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.create_baseline(character varying, tstzrange, integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.create_baseline(name, character varying, tstzrange, integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.create_baseline(character varying, integer, integer, integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.create_baseline(name, character varying, integer, integer, integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.create_server(name, text, boolean, integer, text) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.disable_server(name) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.drop_baseline(character varying) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.drop_baseline(name, character varying) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.drop_server(name) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.enable_server(name) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.export_data(name, integer, integer, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_baseline_samples(integer, character varying) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_connstr(integer, jsonb) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_diffreport(character varying, character varying, text, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_diffreport(name, character varying, character varying, text, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_diffreport(name, character varying, tstzrange, text, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_diffreport(name, tstzrange, character varying, text, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_diffreport(name, tstzrange, tstzrange, text, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_diffreport(integer, integer, character varying, text, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_diffreport(character varying, integer, integer, text, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_diffreport(name, integer, integer, character varying, text, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_diffreport(name, character varying, integer, integer, text, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_diffreport(integer, integer, integer, integer, text, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_diffreport(name, integer, integer, integer, integer, text, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_report(character varying, text, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_report(tstzrange, text, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_report(name, character varying, text, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_report(name, tstzrange, text, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_report(integer, integer, text, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_report(integer, tstzrange, text, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_report(name, integer, integer, text, boolean) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_report_latest(name) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_sampleids_by_timerange(integer, tstzrange) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_server_by_name(name) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.get_sized_bounds(integer, integer, integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.import_data(regclass, text) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.keep_baseline(character varying, integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.keep_baseline(name, character varying, integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.profile_checkavail_planning_times(integer, integer, integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.profile_checkavail_rusage(integer, integer, integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.profile_checkavail_rusage_planstats(integer, integer, integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.profile_checkavail_sessionstats(integer, integer, integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.profile_checkavail_statstatements(integer, integer, integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.profile_checkavail_stmt_cnt(integer, integer, integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.profile_checkavail_stmt_wal_bytes(integer, integer, integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.profile_checkavail_walstats(integer, integer, integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.rename_server(name, name) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.set_server_connstr(name, text) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.set_server_db_exclude(name, name[]) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.set_server_description(name, text) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.set_server_max_sample_age(name, integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.set_server_size_sampling(name, time with time zone, interval, interval) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.show_baselines(name) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.show_samples(integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.show_samples(name, integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.show_servers_size_sampling() TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.snapshot() TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.snapshot(name) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.tablespace_stats(integer, integer, integer) TO "profile_report";
GRANT EXECUTE ON FUNCTION pgse_profile.wal_stats_reset(integer, integer, integer) TO "profile_report";
Параметры расширения
Задайте параметры расширения в файле конфигурации (postgresql.conf/postgres.yml).
Параметр | Описание | Значение по умолчанию |
|---|---|---|
| Количество объектов (запросов, таблиц и так далее), отображаемых в каждом отсортированном отчете. Также этот параметр влияет на размер выборки — чем больше объектов необходимо видеть, тем больше их нужно хранить |
|
| Срок хранения выборок в днях. Выборки, старше этого значения, будут автоматически удалены при следующем вызове |
|
| Отслеживание детального времени выполнения выборки |
|
| Ограничение длины текста запроса в отчетах. Все тексты запросов в построенных отчетах будут усечены до этой длины. Это не влияет на полные тексты запросов в выборках — они сохраняются полностью и могут быть получены |
|
| Управление сброса |
|
Управление модулем
Управление серверами
После установки расширение автоматически создает один включенный сервер local — он соответствует кластеру, где установлено расширение.
Функции управления серверами представлены в одноименном подразделе раздела «Функции отчетности по нагрузке Pangolin» документа «Справочная информация».
Сбор размеров объектов
Функции получения размера объектов могут выполняться долго, особенно для больших баз. Также они требуют AccessExclusiveLock. Однако ежедневного сбора размеров может быть достаточно. pg_profile может пропускать сбор размеров при создании выборок, руководствуясь политикой сбора размеров. Политика определяется как окно времени в сутках, когда сбор размеров разрешен, и минимальный интервал между двумя выборками, в которых размеры собирались.
Функция set_server_size_sampling задает эту политику.
Функция show_servers_size_sampling() показывает политику.
Если строить отчет между выборками, в которых нет данных о размерах, то разделы роста будут основаны на pg_class.relpages. Параметр with_growth функции get_report расширит границы до ближайших выборок с размерами, и данные будут точнее.
В СУБД Pangolin реализована функциональность подсчета точных размеров отношений в БД. Регулируется функциональность параметрами описанными в подразделе «Отчетность по нагрузке СУБД Pangolin» раздела «Диагностика и планирование» документа «Руководство администратора».
Выборки
Каждая выборка содержит статистику по нагрузке с момента предыдущей выборки.
Функции выборок
Функции по работе с выборками, реализованные в расширении pg_profile, описаны в одноименном подразделе раздела «Функции отчетности по нагрузке Pangolin» документа «Справочная информация».
Создание выборок
Чтобы построить первый отчет, необходимо как минимум 2 выборки. Пример расписания (каждые 30 минут):
*/30 * * * * psql -c 'SELECT 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 будет использовать любое ненулевое значение параметра lock_timeout для настройки сессии выполнения функции take_sample(). Если параметр не задан для сессии, будет использовано значение 3 секунды.
То же самое относится к подключениям dblink, созданным во время выборки. pg_profile будет использовать любое ненулевое значение для этого соединения, если оно было установлено. Существует несколько способов задать этот параметр:
- с помощью параметра
optionстроки подключения к серверу; - в файле
postgresql.conf; - с помощью настройки пользователя в целевом кластере.
Если ни один из них не задан, в соединении dblink будет использоваться тот, который был задан в сессии при выполнении take_sample().
Хранение данных выборок
Данные нельзя хранить вечно, поэтому существуют политики хранения. Приоритеты:
- Базовая линия (
baseline) — наивысший приоритет. - Параметр сервера
max_sample_age. Устанавливается при создании сервера или с помощью функцииset_server_max_sample_age()для существующего сервера. Переопределяет глобальный параметр для конкретного сервера. - Глобальный параметр
pg_profile.max_sample_ageв файлеpostgresql.conf. Действует, если не определено ни одно из других.
Список выборок
Функция show_samples() показывает список существующих выборок. Также эта функция показывает время сброса обнаруженной статистики.
Временные показатели сбора статистики
pg_profile собирает детальную статистику по времени сбора статистики, если включен параметр pg_profile.track_sample_timings. Результаты доступны через представление v_sample_timings. Описание полей v_sample_timings:
server_name— имя сервера, с которого собран статистика;sample_id— идентификатор выборки;sample_time— время сбора;event— этап сбора;time_spent— время, затраченное на выполнение этапа.
Описание этапов (поле event):
Этап | Описание |
|---|---|
| Общий процесс сбора (все этапы) |
| Установка соединения |
| Получение параметров |
| Запрос представления |
| Расчет дифференциальной статистики по базам данных с момента предыдущей выборки |
| Запрос представления |
| Сбор статистики по запросам с использованием расширений |
| Сбор статистики кластера через представление |
| Сбор статистики WAL кластера через представление |
| Сбор статистики архиватора кластера через представление |
| Сбор статистики по объектам базы данных. Включает следующие события:
|
| Выполнение вспомогательных служебных процедур |
| Расчет дифференциальной статистики по табличным пространствам |
| Расчет дифференциальной статистики по объектам базы данных. Включает:
|
| Расчет дифференциальной статистики по кластеру |
| Расчет дифференциальной статистики по процессу архивирования |
| Удаление устаревших базовых образцов и данных образцов |
Подвыборки
Некоторые данные, связанные с производительностью, доступные в PostgreSQL, не являются накопительными. Например, наиболее полезная информация о состояниях сессий доступна через представление pg_stat_activity и требует частого сбора. Но функция take_sample() слишком ресурсоемка и выполняется слишком долго, чтобы подойти для этой цели.
Возможность создания подвыборок предоставляет быструю функцию take_subsample(), предназначенную для сбора данных, которые относительно быстро изменяются. Каждая подвыборка привязывается к следующей обычной (регулярной) выборке и удаляется вместе с ней в соответствии с политикой хранения.
Функции создания подвыборок
Функции по работе с подвыборками, реализованные в расширении pg_profile, описаны в одноименном подразделе раздела «Функции отчетности по нагрузке Pangolin» документа «Справочная информация».
Отслеживание состояний сессий
Функциональность подвыборок позволяет фиксировать наиболее интересные состояния сессий:
- длительные запросы;
- длительные транзакции;
- «старые» транзакции (держащие снимок, сильно отстающий от других);
- транзакции в состоянии ожидания (
idle) в течение длительного времени.
Настройки подвыборок
Параметры, представленные в таблице, влияют на поведение сбора подвыборок:
Параметр | Описание | Тип | Значение по умолчанию |
|---|---|---|---|
| Включение или выключение сбора подвыборок |
|
|
| Порог длительности выполнения запроса (считается «длительным») |
|
|
| Порог длительности транзакции |
|
|
| Порог «возраста» транзакции (по значению |
|
|
| Порог времени простоя транзакции |
|
|
Любую из этих настроек можно задать на уровне отдельного сервера с помощью функции set_server_subsampling().
Последнее зафиксированное состояние сессии сохраняется в хранилище, если превышен один из следующих порогов:
- во время выполнения запроса разница между
now()иquery_startпревышаетpg_profile.min_query_duration; - в ходе транзакции разница между
now()иxact_startпревышаетpg_profile.min_xact_duration; - в ходе транзакции значение
age(backend_xmin)превышаетpg_profile.min_xact_age; - в транзакции, находящейся в состоянии
idle in transactionилиidle in transaction (aborted), разница междуnow()иstate_changeпревышаетpg_profile.min_idle_xact_duration.
Каждая подвыборка сохраняет не более pg_profile.topn записей для каждого типа порога.
Сбор подвыборок по расписанию
Подвыборки достаточно быстрые, поэтому их можно собирать довольно часто, но, как правило, достаточно 2–4 сбора в минуту. Очевидно, что частота сбора зависит от наименьшего заданного порога времени.
Cron позволяет выполнять только один вызов в минуту, поэтому для более частого сбора требуется дополнительная настройка. Например, можно использовать команду \watch в psql:
echo "select take_subsample(); \watch 15" | psql &> /dev/null
Вызов psql можно обернуть в сервис systemd, например так:
[Unit]
Description=pg_profile subsampling unit
[Service]
Type=simple
ExecStart=/bin/sh -c 'echo "select take_subsample(); \\watch 15" | /path/to/psql -qo /dev/null'
User=postgres
Group=postgres
[Install]
WantedBy=multi-user.target
Базовые линии
Базовая линия (baseline) — это именованная последовательность выборок с собственной политикой хранения. Базовые линии можно использовать в функциях построения отчетов как интервал выборок. Если срок хранения базовой линии не задан — она хранится бессрочно.
Базовые линии полезны для сохранения информации о нагрузке в определенный период времени. Например, можно сохранить выборки, собранные во время нагрузочного тестирования или при типовой нагрузке, для последующего анализа.
Функции управления базовыми линиями представлены в подразделе «Функции управления baselines» раздела «Функции отчетности по нагрузке Pangolin» документа «Справочная информация».
Экспорт и импорт данных
Сохраненные выборки можно экспортировать из существующего экземпляра расширения pg_profile и загрузить в другой. Эта функция полезна, если нужно перенести серверы с одного экземпляра на другой или отправить накопленные данные в службу поддержки.
Экспорт данных
Данные экспортируются в виде обычной таблицы с помощью функции export_data(). Используйте любой способ экспорта этой таблицы из базы данных. Например, воспользуйтесь командой COPY в psql, чтобы получить один файл в формате CSV:
postgres=# \copy (SELECT * FROM export_data()) TO 'export.csv'
По умолчанию функция export_data() экспортирует все выборки со всех настроенных серверов. Однако при необходимости ограничьте экспорт только одним сервером и дополнительно укажите диапазон выборок.
Импорт данных
Импорт данных возможен только из локальной таблицы, поэтому сначала необходимо загрузить ранее экспортированные данные. Например, используя команду COPY:
postgres=# CREATE TABLE import (section_id bigint, row_data json);
CREATE TABLE
postgres=# \copy import from 'export.csv'
COPY 6437
Теперь можно выполнить импорт, передав созданную таблицу в функцию import_data():
postgres=# SELECT * FROM import_data('import');
Параметры функции и ее синтаксис представлены в подразделе import_data() раздела «Функции отчетности по нагрузке Pangolin» документа «Справочная информация».
Хотя описания серверов также экспортируются, локальные серверы в pg_profile с совпадающими именами будут блокировать операцию импорта. Рекомендуется временно переименовать такие серверы или использовать параметр server_name_prefix, чтобы избежать конфликтов. Если в будущем будет необходимость импортировать новые данные для ранее импортированных серверов, они будут сопоставляться по системному идентификатору, поэтому свободно переименовывайте импортированные серверы. Все серверы импортируются в состоянии disabled (отключены).
После успешного импорта таблицу import можно удалить.
Отчеты
Отчеты генерируются в формате HTML с помощью функций формирования отчетов. В pg_profile доступны два типа отчетов:
- Обычные отчеты содержат статистическую информацию о нагрузке экземпляра за указанный интервал;
- Дифференциальные отчеты содержат данные за два интервала, в которых статистика по одинаковым объектам отображается рядом, что упрощает сравнение нагрузки.
Разделы отчета по нагрузке СУБД Pangolin, реализованные в расширении pg_profile, описаны в разделе «Описание структуры отчета по нагрузке Pangolin» документа «Справочная информация».
Функции формирования обычных отчетов
Функции формирования обычных отчетов представлены в подразделе «Функции регулярных отчетов» раздела «Функции отчетности по нагрузке Pangolin» документа «Справочная информация».
Функции формирования дифференциальных отчетов
Функции формирования дифференциальных отчетов представлены в подразделе «Функции отчетов по изменениям» раздела «Функции отчетности по нагрузке Pangolin» документа «Справочная информация».
Ссылки на документацию разработчика
Дополнительно поставляемый модуль pg_profile: https://github.com/zubkov-andrei/pg_profile.