G.3. pgpro_pwr — отчёты о нагрузке
- G.3.1. Архитектура pgpro_pwr
- G.3.2. Предварительные требования
- G.3.3. Установка и подготовка
- G.3.4. Управление серверами
- G.3.5. Управление выборками
- G.3.6. Управление анализом размеров отношений
- G.3.7. Управление промежуточными выборками
- G.3.8. Управление выборочными линиями
- G.3.9. Экспорт и импорт данных
- G.3.10. Функции построения отчётов
- G.3.11. Разделы отчёта pgpro_pwr
- G.3.12. Диагностические средства pgpro_pwr
- G.3.13. Важные замечания
- G.3.2. Предварительные требования
Модуль pgpro_pwr предназначен для выявления наиболее ресурсоёмких операций в базе данных. (Корень pwr, произносится как «пауэр» (power), — это сокращение от Postgres Pro Workload Reporting, Отчётность по нагрузке Postgres Pro.) Данный модуль основывается на представлениях Сборщика статистики и расширении pgpro_stats или pg_stat_statements.
Примечание
Хотя pgpro_pwr может работать с расширением pg_stat_statements, по возможности рекомендуется использовать расширение pgpro_stats, так как оно выдаёт планы операторов, информацию о событиях ожидания и статистику распределения нагрузки для баз данных, ролей, клиентских узлов и приложений.
Ниже предполагается, что используется pgpro_stats, если иное не отмечено явно.
Если у вас нет возможности использовать pgpro_stats в нужной базе, но имеется расширение pg_stat_kcache, pgpro_pwr может обрабатывать выдаваемую pg_stat_kcache информацию об использовании командами ресурсов процессора и о нагрузке на уровне файловой системы (rusage).
pgpro_pwr получает сводную статистику ожидания от расширения pg_wait_sampling. Когда используется pg_wait_sampling, pgpro_pwr сбрасывает профиль выборки ожидания для каждой выборки.
Суть pgpro_pwr заключается в обработке накапливаемых статистических выборок. В каждой выборке содержится статистическая информация о наиболее активных объектах и запросах, добавленная с момента получения предыдущей выборки, или, говоря кратко, после предыдущей выборки. Впоследствии эта информация используется при построении отчётов.
pgpro_pwr предоставляет функции для получения выборок. Аккумулируемые регулярные выборки позволяют строить отчёты о нагрузке базы данных за прошедшее время.
pgpro_pwr позволяет создавать выборки явным образом во время массовой обработки данных, тестирования нагрузки и т. д.
При каждом получении выборки вызывается функция pgpro_stats_statements_reset() (она описана в pgpro_stats), чтобы статистика выполнения операторов не потерялась, когда количество операторов превысит pgpro_stats.max (см. Подраздел G.4.7.1). Кроме этого, в отчёте будет содержаться раздел, в котором можно узнать, не превышает ли количество операторов 90% от значения pgpro_stats.max.
Расширение pgpro_pwr, установленное на одном сервере Postgres Pro, может собирать статистику и с других серверов. Таким образом, на ведущем сервере можно собирать статистику нагрузки также с серверов горячего резерва. Чтобы это реализовать, необходимо указать имена всех серверов и строки подключения, а также обеспечить возможность подключения pgpro_pwr ко всем серверам.
G.3.1. Архитектура pgpro_pwr
Данное расширение состоит из следующих частей:
Репозиторий истории — хранилище собранных данных. В нём находится несколько таблиц расширения.
Примечание
Помимо прочего, в таблицах pgpro_pwr хранится текст запросов в открытом виде, который может содержать конфиденциальную информацию. Поэтому в целях безопасности ограничьте доступ к репозиторию должным образом.
Механизм управления выборками включает функции, позволяющие делать выборки и поддерживать актуальное состояние репозитория, удаляя устаревшие данные.
Механизм отчётов включает функции построения отчётов по данным, находящемся в репозитории истории.
Административные функции, предназначенные для создания серверов и выборочных линий, а также для управления ими.
G.3.2. Предварительные требования
Следующие требования приведены для варианта установки pgpro_pwr в целевом кластере, то есть в кластере, нагрузка которого будет анализироваться в первую очередь, хотя это расширение может собирать данные производительности и с других кластеров.
G.3.2.1. Для базы данных pgpro_pwr
Расширение pgpro_pwr зависит от языка PL/pgSQL и расширения dblink.
G.3.2.2. Для целевого сервера
Целевой сервер должен разрешать подключения ко всем базам данных с сервера, на котором работает pgpro_pwr. Вам надо будет задать строку подключения для этого сервера с указанием определённой базы данных. Эта база данных имеет особое значение, так как pgpro_pwr будет обращаться к установленному в ней расширению pgpro_stats или pg_stat_statements. Однако заметьте, что pgpro_pwr будет подключаться и ко всем остальным базам на этом сервере.
Для получения более полной статистики можно дополнительно:
Установить и настроить расширение pgpro_stats в вышеупомянутой базе данных, если вы хотите видеть в отчётах статистику по операторам. Полнота и точность собираемой статистики может зависеть от следующих параметров:
pgpro_stats.maxПри небольшом значении этого параметра некоторая статистика может теряться между выборками. Если объём попадающей в выборку статистики близок к значению
pgpro_stats.max, вы увидите предупреждение об этом в отчёте.pgpro_stats.trackОптимальным является значение по умолчанию, '
top' (заметьте, что значение 'all' повлияет на точность полей%Total(% всего) в разделах отчёта, посвящённым SQL-операторам).
Задать следующие параметры Сборщика статистики Postgres Pro:
track_activities = on track_counts = on track_io_timing = on track_wal_io_timing = on # Начиная с PostgreSQL 14 track_functions = all/pl
G.3.3. Установка и подготовка
pgpro_pwr поставляется вместе с Postgres Pro Standard в виде отдельного пакета pgpro-pwr-std-15 (подробные инструкции по установке приведены в Главе 16).
Примечание
Расширение pgpro_pwr создаёт множество объектов в базе данных, поэтому рекомендуется устанавливать его в отдельную схему.
Хотя pgpro_pwr вполне можно использовать с правами суперпользователя, наличие таких прав не является обязательным. Поэтому вы можете выбрать одну из следующих процедур установки в зависимости от ваших требований безопасности и конфигурации или разработать собственную:
G.3.3.1. Упрощённая установка
Эта процедура предназначена для случаев, когда pgpro_pwr устанавливается непосредственно на целевой сервер и будет отслеживать его нагрузку от имени суперпользователя.
Создайте схему для установки pgpro_pwr, а затем создайте расширение:
CREATE SCHEMA profile; CREATE EXTENSION pgpro_pwr SCHEMA profile;
G.3.3.2. Развёрнутая установка
Эта процедура охватывает случаи, когда планируется использовать pgpro_pwr для отслеживания нагрузки на одном или нескольких серверах с соблюдением принципа наименьших привилегий.
G.3.3.2.1. В базе данных целевого сервера
Создайте на целевом сервере пользователя для pgpro_pwr:
CREATE USER pwr_collector PASSWORD 'collector_pwd';
Убедитесь в том, что пользователь имеет возможность подключаться к любой базе данных кластера (по умолчанию это так) и что pg_hba.conf разрешает такие подключения с сервера, где размещён pgpro_pwr. Также включите этого пользователя в роль pwr_collector и дайте ему право EXECUTE для следующих функций:
GRANT pg_read_all_stats TO pwr_collector; GRANT EXECUTE ON FUNCTION pgpro_stats_statements_reset TO pwr_collector; GRANT EXECUTE ON FUNCTION pgpro_stats_totals_reset(text,bigint) TO pwr_collector;
Также следует проверить наличие права SELECT для представления pgpro_stats_archiver:
GRANT SELECT ON pgpro_stats_archiver TO pwr_collector;
G.3.3.2.2. В базе данных pgpro_pwr
Создайте непривилегированного пользователя:
CREATE USER pwr_user;
Этот пользователь будет владельцем схемы расширения, и от его имени будут собираться статистические выборки.
Создайте схему для установки pgpro_pwr:
CREATE SCHEMA profile AUTHORIZATION pwr_user;
Дайте пользователю право USAGE для схемы, где располагается расширение dblink:
GRANT USAGE ON SCHEMA public TO pwr_user;
Создайте расширение от имени pwr_user:
\c - pwr_user CREATE EXTENSION pgpro_pwr SCHEMA profile;
Определите параметры подключения к целевому серверу для pgpro_pwr. Например:
SELECT profile.create_server('target_server_name','host=192.168.1.100 dbname=postgres port=5432');Указанная строка подключения будет использоваться в вызове при выполнении функции dblink_connect()take_sample().
Примечание
Строки подключения хранятся в таблице pgpro_pwr в открытом виде, поэтому следует ограничивать доступ к таблицам расширения pgpro_pwr.
G.3.3.3. Настройка ролей pgpro_pwr
В работе pgpro_pwr можно выделить до трёх ролей:
Роль владелец pgpro_pwr является владельцем расширения pgpro_pwr.
Роль сбора статистики используется pgpro_pwr для подключения к базам данных и сбора статистики.
Роль создания отчётов используется для создания отчётов.
Если все действия с pgpro_pwr выполняются от имени суперпользователя postgres, можно пропустить большую часть настройки, описанной ниже.
G.3.3.3.1. Владелец pgpro_pwr
Эту роль можно использовать для выполнения всех действий, связанных с pgpro_pwr. Она будет иметь доступ к строкам подключения к серверу, которые могут содержать пароли. Эту роль следует использовать для вызова функции take_sample(). Пользователю с такой ролью необходимо расширение dblink.
Рассмотрим пример, в котором каждое расширение установлено в отдельной схеме:
\c postgres postgres CREATE SCHEMA dblink; CREATE EXTENSION dblink SCHEMA dblink; CREATE USER pwr_usr with password 'pwr_pwd'; GRANT USAGE ON SCHEMA dblink TO pwr_usr; CREATE SCHEMA profile AUTHORIZATION pwr_usr; \c postgres pwr_usr CREATE EXTENSION pgpro_pwr SCHEMA profile;
G.3.3.3.2. Роль сбора статистики
Эта роль должна использоваться расширением pgpro_pwr для подключения к базам данных и сбора статистики. Непривилегированные пользователи не могут открывать соединения, используя dblink, без пароля, поэтому необходимо указать пароль в строке подключения для каждого сервера. Эта роль должна иметь доступ ко всем расширениям, собирающим статистику, а также иметь возможность выполнять сброс статистики для таких расширений.
Рассмотрим пример. Если для сбора статистики используется расширение pgpro_stats, настройте роль сбора статистики следующим образом:
\c postgres postgres CREATE SCHEMA pgps; CREATE EXTENSION pgpro_stats SCHEMA pgps; CREATE USER pwr_collector with password 'collector_pwd'; GRANT pg_read_all_stats TO pwr_collector; GRANT USAGE ON SCHEMA pgps TO pwr_collector; GRANT EXECUTE ON FUNCTION pgps.pgpro_stats_statements_reset TO pwr_collector;
Если для сбора статистики используется расширение pg_stat_statements, настройте её, как указано ниже:
\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 pwr_collector with password 'collector_pwd'; GRANT pg_read_all_stats TO pwr_collector; GRANT USAGE ON SCHEMA pgss TO pwr_collector; GRANT USAGE ON SCHEMA pgsk TO pwr_collector; GRANT USAGE ON SCHEMA pgws TO pwr_collector; GRANT EXECUTE ON FUNCTION pgss.pg_stat_statements_reset TO pwr_collector; GRANT EXECUTE ON FUNCTION pgsk.pg_stat_kcache_reset TO pwr_collector; GRANT EXECUTE ON FUNCTION pgws.pg_wait_sampling_reset_profile TO pwr_collector;
Теперь следует задать строку подключения, указывающую на базу данных с установленными расширениями статистики:
\c postgres pwr_usr
SELECT profile.set_server_connstr('local','dbname=postgres port=5432 host=localhost user=pwr_collector password=collector_pwd'); В файле pg_hba.conf следует указать, что для пользователя pwr_collector требуется аутентификация по паролю.
Очевидно, что роль сбора статистики должна быть правильно настроена на всех серверах, с которых расширение pgpro_pwr собирает статистику.
Теперь можно вызывать take_sample(), используя роль pwr_usr:
\c postgres pwr_usr SELECT * FROM take_sample();
Затем необходимо настроить планировщик задач (в нашем примере это команда crontab пользователя postgres):
*/30 * * * * psql -U pwr_usr -d postgres -c 'SELECT profile.take_sample()' > /dev/null 2>&1
Обратите внимание, что для хранения паролей можно использовать файл паролей Postgres Pro.
G.3.3.3.3. Роль создания отчётов
Любой пользователь может собирать отчёты pgpro_pwr. Минимальные права, необходимые для создания отчётов pgpro_pwr, предоставляются роли public. Однако полный отчёт с текстами запросов доступен только члену роли pg_read_all_stats. В любом случае роль создания отчётов не имеет доступа к строкам подключения к серверу, поэтому она не может получить пароли серверов.
G.3.3.4. Настройка параметров расширения
Вы можете определить в postgresql.conf следующие параметры pgpro_pwr:
pgpro_pwr.max(integer)Количество выбираемых первых объектов (операторов, отношений и т. д.), которое будет выдаваться в каждой отсортированной по некоторому критерию таблице отчёта. Этот параметр влияет на размер выборки: чем больше объектов необходимо отобразить в отчёте, тем больше должна быть выборка. Максимальное значение — 100. Любое значение больше максимально допустимого будет уменьшено до 100.
Значение по умолчанию —
20.pgpro_pwr.max_sample_age(integer)Срок хранения выборки (в днях). Выборки старее
pgpro_pwr.max_sample_ageдней автоматически удаляются при очередном вызовеtake_sample().Значение по умолчанию —
7.pgpro_pwr.max_query_length(integer)Максимальная длина выводимого запроса в отчётах. Все запросы в отчётах будут сокращены до количества символов, указанного в
pgpro_pwr.max_query_length.Значение по умолчанию —
20 000символов.pgpro_pwr.track_sample_timings(boolean)Включает сбор подробной информации о времени выполнения внутренних процедур pgpro_pwr. Этот параметр полезен для диагностики в случае медленного выполнения функций получения выборок. Собранные показатели можно будет просмотреть в представлении
v_sample_timings.Значение по умолчанию —
off(выкл.).pgpro_pwr.statements_reset(boolean)Управляет сбросом статистики pgpro_stats/pg_stat_statements во время получения выборки. Позволяет не сбрасывать статистику во время получения выборки благодаря использованию новых методов. При отключении этого параметра pgpro_pwr будет отслеживать вытеснения операторов, используя значения поля
calls. Однако этот метод не полностью предотвращает потерю статистики. Расширения pg_stat_statements версии 1.11 и pgpro_stats версии 1.8 имеют возможности для учёта точного времени наблюдения за выражением, которые могут уменьшить потенциальную потерю данных. Когда этот параметр отключён, его можно временно включить в сеансе, чтобы периодически выполнять сброс pgpro_stats/pg_stat_statements.Значение по умолчанию —
on(вкл.).pgpro_pwr.relsize_collect_mode(text)Задаёт режим сбора сведений о размерах отношений. Возможные значения:
off— сбор сведений о размерах отношений основан на каталогеpg_class. Хотя полученные таким образом данные являются приблизительными, их сбор почти не потребляет ресурсов.on— для каждой выборки собираются точные размеры отношений с помощью функцииpg_relation_size(). Такой сбор требует блокировки таблицы и довольно ресурсоёмок.schedule— точные размеры отношений собираются в окне анализа размеров, определённом для каждого сервера.
Значение по умолчанию —
off(выкл.).
G.3.4. Управление серверами
После установки pgpro_pwr создаёт по умолчанию активное определение сервера с именем local, соответствующее текущему кластеру. Активные определения серверов обрабатываются без явного указания при получении выборок (см. описание take_sample()). Неактивный сервер считается исключённым.
Строка локального сервера по умолчанию содержит только параметры dbname и port. Значения этих параметров берутся из свойств подключения, которое было установлено в момент создания расширения. Заданную ранее строку подключения сервера можно изменить, воспользовавшись функцией set_server_connstr().
G.3.4.1. Функции управления серверами
Для управления серверами предназначены следующие функции pgpro_pwr:
-
create_server(servername,connstrtext,enabledbooleanDEFAULTTRUE,max_sample_ageintegerDEFAULTNULLdescriptiontextDEFAULTNULL) Создаёт определение сервера.
Аргументы:
server— имя сервера, которое должно быть уникальным.connstr— строка подключения. Должна содержать все необходимые параметры для подключения со стороны сервера с pgpro_pwr к базе данных целевого сервера.enabled— установите этот параметр, чтобы включить сервер в число серверов, обрабатываемых функциейtake_sample()без аргументов.max_sample_age— срок хранения выборки (в днях). Переопределяет глобальное значениеpgpro_pwr.max_sample_ageдля данного сервера.description— описание сервера, которое будет включаться в отчёты.
Например, определение сервера можно создать так:
SELECT profile.create_server('omega','host=192.168.1.100 dbname=postgres port=5432');
-
drop_server(servername) Удаляет сервер и все полученные с него выборки.
-
set_server_description(servernamedescriptiontext) Задаёт описание для сервера.
-
set_server_subsampling(servername,subsample_enabledboolean,min_query_durationinterval,min_xact_durationinterval,min_xact_ageinteger,min_idle_xact_durinterval hour to second) Определяет параметры получения промежуточных выборок для сервера.
Аргументы:
server— имя сервера.subsample_enabled— определяет, включено ли получение промежуточных выборок для сервера, то есть должна ли функцияtake_subsample()фактически создавать промежуточные выборки.min_query_duration— предел длительности запроса.min_xact_duration— предел длительности транзакции.time_range— предел возраста транзакций.min_idle_xact_dur_age— предел простоя транзакции.
-
enable_server(servername) Включает сервер в число серверов, обрабатываемых функцией
take_sample()без аргументов.
-
disable_server(servername) Исключает сервер из числа серверов, обрабатываемых функцией
take_sample()без аргументов.
-
set_server_setting(servername,settingtext,valuejsonb) Выполняет тонкую настройку сбора статистики сервера. Настройки
collect*управляют тем, какая статистика будет собираться, и для них параметрvalueпринимает логические значения, по умолчанию равныеtrue. Доступные настройки:collect_pg_stat_statement— собирать статистику выполнения операторов с помощью расширений pg_stat_statements и pg_stat_kcache.collect_pg_wait_sampling— собирать статистку событий ожидания с помощью расширения pg_wait_sampling.collect_objects— собирать статистику по всем объектам схемы, то есть по таблицам, индексам и функциям, из представленийpg_stat_*.collect_relations— собирать статистику по таблицам и индексам из представленийpg_stat_*.collect_functions— собирать статистику по пользовательским функциям из представленияpg_stat_user_functions.collect_vacuum_stats— собирать расширенную статистку очистки баз данных.
G.3.5. Управление выборками
Выборка содержит статистическую информацию о нагрузке базы данных, полученную после предыдущей выборки
G.3.5.1. Функции обработки выборок
Для работы с выборками предназначены следующие функции pgpro_pwr:
-
take_sample()
take_sample(servername[,skip_sizesboolean]) Получает выборки.
Без параметров эта форма функции получает выборки со всех включённых серверов, обращаясь к ним последовательно, и выдаёт в результате таблицу со следующими столбцами:
server— имя сервера.result— результат получения выборки. Может быть строкойOK, если выборка получена успешно, либо содержать текст с трассировкой ошибки в случае неудачи.elapsed— время, потраченное на получение выборки.
С параметром эта функция получает выборку с указанного сервера, даже если этот сервер исключён. Она полезна, когда вам нужно получать выборки с разных серверов с разной частотой. В случае успеха она выдаёт
0.Аргументы:
server— имя сервера.skip_sizes— если этот параметр опущен или равен NULL, применяется политика анализа размеров; если он равенfalse, анализ размеров производится, а еслиtrue— пропускается.
-
take_sample_subset([sets_cntinteger,current_setinteger]) Получает выборку с каждого сервера в подмножестве. Используйте эту функцию, чтобы получать выборки параллельным образом при большом количестве включённых серверов. Хотя PL/pgSQL не поддерживает параллельное выполнение функции, вы можете запустить эту функцию в нескольких сеансах. Она возвращает тот же тип, что и
take_sample(). Если оба параметра опущены, функция действует аналогичноtake_sample(), то есть перебирает все включённые серверы по одному.Аргументы:
sets_cnt— количество подмножеств, на которое будет разделено множество всех включённых серверов.current_set— номер подмножества, в котором будут собираться выборки. Принимает значение от 0 доsets_cnt- 1. Для выбранного подмножества выборки собираются как обычно, с последовательным переходом от сервера к серверу.
Если обнаружится, что после предыдущей выборки произошёл сброс статистики, pgpro_pwr обработает соответствующие абсолютные значения как разницу; однако точность пострадает в любом случае.
-
show_samples([servername,] [daysinteger]) Выдаёт таблицу с информацией об имеющихся на сервере выборках статистики (если параметр
serverопущен, подразумеваетсяlocal) за последниеdaysдней (если этот параметр опущен, то за всё время). Эта таблица содержит следующие столбцы:sample— идентификатор выборки.sample_time— время, когда была получена выборка.dbstats_reset—NULLили время сброса статистики в представленииpg_stat_database, если она была сброшена после предыдущей выборки.clustats_reset—NULLили время сброса статистики в представленииpg_stat_bgwriter, если она была сброшена после предыдущей выборки.archstats_reset—NULLили время сброса статистики в представленииpg_stat_archiver, если она была сброшена после предыдущей выборки.
Функции получения выборок также поддерживают заданное политикой хранения желаемое состояние репозитория, удаляя устаревшие выборки и выборочные линии.
G.3.5.2. Получение выборок
Чтобы получить выборки со всех включённых серверов, вызовите функцию take_sample(). Обычно достаточно получать одну-две выборки в час. Для выполнения этой функции по расписанию можно воспользоваться планировщиком cron или подобным. Например, так выглядит расписание cron для получения выборок каждые 30 минут:
*/30 * * * * psql -c 'SELECT profile.take_sample()' &> /dev/null
Однако результаты такого вызова не проверяются на ошибки. В производственной среде для целей мониторинга имеет смысл проверять строку результата, которая будет содержать 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 "postgresno" does not exist |
(2 rows)G.3.5.3. Политика хранения выборок
Политики хранения можно определить на следующих уровнях:
Глобальный
Значение параметра
pgpro_pwr.max_sample_ageв файлеpostgresql.confопределяет общее значение параметра хранения, действующее в случае, когда не определены никакие другие параметры.Сервер
Параметр
max_sample_age, указанный при создании сервера или при вызове функцииset_server_max_sample_age(, определяет срок хранения на уровне сервера. Значение этого параметра переопределяет значениесервер)pgpro_pwr.max_sample_ageдля конкретного сервера.Выборочная линия
Созданная выборочная линия переопределяет все другие заданные сроки хранения для включённых в неё выборок.
G.3.6. Управление анализом размеров отношений
Сбор сведений о размерах всех отношений в базе данных с использованием функций Postgres Pro может занять продолжительное время. Кроме того, эти функции требуют установления блокировки AccessExclusiveLock для анализируемых отношений. Однако во многих случаях может быть достаточно собирать информацию о размерах один раз в сутки. Реализовать это можно, определив в pgpro_pwr политики анализа размеров для серверов, позволяющие пропускать сбор сведений о размерах в процессе получения выборок. Такая политика устанавливает:
Окно в течение суток, когда разрешается сбор сведений о размерах отношений.
Минимальный промежуток между двумя выборками со сведениями о размерах.
Когда определена политика анализа размеров, функции получения выборок собирают сведения о размерах только в заданном окне и только если после предыдущей выборки с размерами прошло не меньше заданного промежутка. Такую политику позволяют определить следующие функции:
-
set_server_size_sampling(servername,window_starttime with time zoneDEFAULTNULL,window_durationinterval hour to secondDEFAULTNULL,sample_intervalinterval day to minuteDEFAULTNULL,collect_modetextDEFAULTNULL) Определяет политику сбора сведений о размере для сервера.
Аргументы:
server— имя сервера.window_start— время начала периода сбора.window_duration— длительность периода сбора.sample_interval— минимальный промежуток времени между сборами сведений о размере.collect_mode— при значенииoff, используемом по умолчанию для новых инсталляций, размеры отношений собираются из каталогаpg_class, при значенииon, размеры отношений собираются с помощью функцииpg_relation_size(), при значенииschedule, pgpro_pwr собирает размеры отношений в заданном окне. Этот параметр переопределяет значение параметра расширения relsize_collect_mode. При обновлении с предыдущих версий для этого параметра устанавливается значениеonилиschedule, что не меняет поведения, имевшего место до обновления.
Примечание
Если вы построите отчёт между двумя выборками, хотя бы в одной из которых отсутствуют сведения о размерах отношений, в нём будут разделы с информацией об увеличивающихся в размере объектах, полученной из pg_class.relpages. Однако вы можете расширить интервал отчёта до ближайших выборок, содержащих сведения о размерах, передав функциям построения отчётов параметр with_growth; это позволяет получать более точные данные об увеличении размера.
Размеры отношений необходимо знать, чтобы вычислить объём последовательно сканированных данных в таблицах и непосредственную нагрузку автоочистки при обработке индексов.
Пример:
SELECT set_server_size_sampling('local','23:00+03',interval '2 hour',interval '8 hour', 'schedule'); Функция show_servers_size_sampling выводит политики анализа размеров для всех серверов:
postgres=# SELECT * FROM show_servers_size_sampling(); server_name | window_start | window_end | window_duration | sample_interval | limited_collection -------------+--------------+-------------+-----------------+-----------------+-------------------- local | 23:00:00+03 | 01:00:00+03 | 02:00:00 | 08:00:00 | t
G.3.7. Управление промежуточными выборками
Некоторые доступные в Postgres Pro данные, связанные с производительностью, не являются накопительными. Например, наиболее часто используемые данные о состояниях сеансов доступны через представление pg_stat_activity и могут быть получены только с помощью частых выборок. Однако функция take_sample() создаёт большую нагрузку и может занять много времени. Поэтому она не подходит для сбора данных о состоянии сеансов.
В механизме промежуточных выборок реализована новая быстрая функция take_subsample(). Она может использоваться для сбора относительно быстро меняющихся данных. Каждая промежуточная выборка привязана к следующей обычной выборке и удаляется вместе с ней согласно заданной политике хранения.
Механизм промежуточных выборок можно использовать для захвата наиболее интересных состояний сеансов:
Длительные запросы
Длительные транзакции
Старые транзакции, то есть те, снимок в которых находится позади множества других транзакций
Транзакции, долгое время находящиеся в состоянии простоя (idle)
G.3.7.1. Функции получения промежуточных выборок
Следующие функции pgpro_pwr относятся к работе с промежуточными выборками:
-
take_subsample()
take_subsample(servername) Без параметров эта функция получает промежуточные выборки со всех включённых серверов с включённым механизмом их получения (за подробностями обратитесь к set_server_subsampling). Промежуточные выборки для серверов получаются последовательно, по одному. Функция выдаёт в результате таблицу со следующими столбцами:
server— имя сервера.result— результат получения промежуточной выборки. Может быть строкойOK, если промежуточная выборка получена успешно, либо содержать текст ошибки в случае неудачи.elapsed— время, потраченное на получение промежуточной выборки.
Этот табличный формат вывода данных позволяет легко управлять созданием промежуточных выборок с помощью SQL-запроса.
С параметром эта функция получает промежуточную выборку с указанного сервера. Она полезна, когда нужно получать промежуточные выборки с разных серверов с разной частотой или получить явную выборку для конкретного сервера.
Аргументы:
server— имя сервера.
Примечание
Попытка получить промежуточную выборку во время получения обычной выборки завершится ошибкой.
-
take_subsample_subset([sets_cntinteger], [current_setinteger]) Получает промежуточную выборку с каждого сервера в подмножестве с включённым механизмом их получения. Хотя даже последовательное получение промежуточных выборок должно выполняться достаточно быстро, их можно получать параллельно, аналогично обычным выборкам. Эта функция возвращает тот же тип, что и
take_subsample(). Если оба параметра опущены, функция действует аналогичноtake_subsample().Аргументы:
sets_cnt— количество подмножеств серверов.current_set— номер подмножества, в котором будут собираться промежуточные выборки. Принимает значение от 0 доsets_cnt- 1. Для выбранного подмножества промежуточные выборки собираются как обычно, с последовательным переходом от сервера к серверу.
G.3.7.2. Конфигурирование механизма получения промежуточных выборок
На поведение промежуточных выборок влияют следующие параметры:
pgpro_pwr.subsample_enabled— определяет, должна ли функцияtake_subsample()фактически создавать промежуточную выборку.pgpro_pwr.min_query_duration— предел, по достижении которого запрос считается длительным.pgpro_pwr.min_xact_duration— предел, по достижении которого транзакция считается длительной.pgpro_pwr.min_xact_age— предел возраста транзакции.pgpro_pwr.min_idle_xact_dur_age— предел простоя транзакции.
Это поведение можно задать на уровне сервера с помощью функции set_server_subsampling.
Последнее наблюдаемое состояние сеанса сохраняется в репозитории, когда происходит одно из следующих событий, связанных с пределами:
Во время выполнения запроса разница между
now()иquery_startпревышает пределpgpro_pwr.min_query_duration.Во время выполнения транзакции разница между
now()иxact_startпревышает пределpgpro_pwr.min_xact_duration.Во время выполнения транзакции
age(превышает пределbackend_xmin)pgpro_pwr.min_xact_age.Во время выполнения транзакции в состоянии
idle in transactionилиidle in transaction (aborted)разница междуnow()иstate_changeпревышает пределpgpro_pwr.min_idle_xact_duration.
За более подробным описанием упомянутых полей обратитесь к Главе 26. Каждая промежуточная выборка может содержать не более pgpro_pwr.max записей для каждого типа пределов.
G.3.7.3. Планирование получения промежуточных выборок
Скорость получения промежуточных выборок позволяет получать их довольно часто. Однако обычно требуется не более 2-4 промежуточных выборок в минуту. Очевидно, что частота промежуточных выборок зависит от самого маленького из значений параметров пределов.
Cron допускает только один вызов в минуту, поэтому нужно предпринять дополнительные действия, чтобы получать промежуточные выборки чаще. Например, можно использовать команду psql \watch:
echo "select take_subsample(); \watch 15" | psql &> /dev/null
Вызов psql можно обернуть в systemd следующим образом:
Description=pgpro_pwr subsampling unit [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
G.3.8. Управление выборочными линиями
Выборочной линией называется именованная последовательность выборок, для которых определяется отдельный срок хранения. Выборочная линия также может задавать интервал для функций построения отчётов. Если срок хранения для выборочной линии не определён, относящиеся к ней выборки не будут удаляться. Выборочные линии позволяют сохранить информацию о нагрузке базы данных за определённый интервал времени.
G.3.8.1. Функции управления выборочными линиями
Для управления выборочными линиями предназначены следующие функции pgpro_pwr:
-
create_baseline([servername,]baselinevarchar(25),start_idinteger,end_idinteger[,daysinteger])
create_baseline([servername,]baselinevarchar(25),time_rangetstzrange[,daysinteger]) Создаёт выборочную линию.
Аргументы:
server— имя сервера. Если оно опущено, подразумеваетсяlocal.baseline— имя выборочной линии, которое должно быть уникальным на сервере.start_id— идентификатор первой выборки в линии.end_id— идентификатор последней выборки в линии.time_range— период времени для выборочной линии. Выборочная линия будет включать все выборки, относящиеся к минимальному интервалу, который покрывает заданный отрезокtime_range.days— срок хранения выборочной линии, определяемый целым количеством дней с моментаnow(). Чтобы срок хранения не ограничивался, опустите этот параметр или задайте значение NULL.
-
drop_baseline([servername,]baselinevarchar(25)) Удаляет выборочную линию. Аргументы этой функции действуют аналогично одноимённым аргументам
create_baseline. Удаление выборочной линии не влечёт за собой непосредственное удаление относящихся к ней выборок. На них просто перестают распространяться заданные для этой линии параметры хранения.
-
keep_baseline([servername,]baselinevarchar(25)[,daysinteger]) Изменяет срок хранения для выборочной линии. Аргументы этой функции действуют аналогично одноимённым аргументам
create_baseline. Чтобы изменить срок хранения для всех существующих выборочных линий, опустите параметрbaselineили передайте в нём NULL.
G.3.9. Экспорт и импорт данных
Собранные выборки можно экспортировать из одного экземпляра расширения pgpro_pwr и загрузить в другой. Это позволяет перемещать накопленную информацию о серверах или передать её специалистам поддержки для анализа.
G.3.9.1. Экспорт данных
Функция export_data экспортирует данные в обычную таблицу. Выгрузить их затем из базы данных можно любым доступным способом. Например, можно воспользоваться метакомандой psql \copy и получить данные в файле csv:
postgres=# \copy (select * from export_data()) to 'export.csv'
G.3.9.2. Импорт данных
Так как данные могут импортироваться только из локальной таблицы, сначала загрузите ранее экспортированные данные. Для этого вновь воспользуйтесь метакомандой \copy:
postgres=# CREATE TABLE import (section_id bigint, row_data json); CREATE TABLE postgres=# \copy import from 'export.csv' COPY 6437
Теперь вы можете импортировать данные, передав таблицу import функции import_data:
postgres=# SELECT * FROM import_data('import'); По завершении импорта таблицу import можно удалить.
Примечание
Если данные сервера импортируются впервые, локально определённые серверы pgpro_pwr с совпадающими именами вызовут конфликт во время импорта. Чтобы его избежать, можно временно переименовать такие серверы или указать префикс имён серверов для операций импорта. Однако во время последующего импорта данных для ранее импортированных серверов эти данные будут сопоставляться с серверами по системным идентификаторам, поэтому эти серверы можно переименовать как угодно. Также имейте в виду, что pgpro_pwr переводит импортируемые серверы в отключённое состояние, чтобы функция take_sample() не обрабатывала их.
G.3.9.3. Функции экспорта и импорта
Для экспорта и импорта данных предназначены следующие функции:
-
export_data([servername, [min_sample_idinteger,] [max_sample_idinteger,]] [,obfuscate_queriesboolean] [,hide_connstrboolean]) Экспортирует собранные данные.
Аргументы:
server— имя сервера. Если оно опущено, данные экспортируется со всех настроенных серверов.min_sample_id,max_sample_id— идентификаторы выборок, ограничивающих диапазон экспортируемых выборок (включающий указанные границы). Еслиmin_sample_idопущен или равен NULL, экспортируются все выборки до выборкиmax_sample_id; если жеmax_sample_idопущен или равен NULL, экспортируются все выборки, начиная с выборкиmin_sample_id.obfuscate_queries— экспортирует тексты запросов в виде хешаMD5и исключает из экспорта строки подключения к серверу. Передавайте этот аргумент, только когда нужно скрыть тексты запросов.hide_connstr— исключает из экспорта строки подключения к серверу.
-
import_data(dataregclass[,server_name_prefixtext]) Импортирует ранее экспортированные данные. Возвращает число строк, фактически загруженных в таблицы pgpro_pwr.
Аргументы:
data— имя таблицы, содержащей данные импорта.server_name_prefixзадаёт префикс имён серверов для операции импорта. Его можно использовать, чтобы избежать конфликтов имён.
G.3.10. Функции построения отчётов
Отчёты pgpro_pwr формируются в формате HTML функциями построения. В pgpro_pwr имеются следующие типы отчётов:
Обычные отчёты предоставляют статистику по нагрузке для заданного интервала.
Разностные отчёты предоставляют статистику по одинаковым объектам в двух интервалах. Соответствующие значения выводятся рядом, что