F.42. pgpro_stats
Расширение pgpro_stats
предоставляет возможности для сбора статистики планирования и выполнения всех обрабатываемых сервером SQL-операторов. Оно основано на модуле pg_stat_statements и реализует следующую дополнительную функциональность:
Сохранение помимо текста запросов соответствующих планов запросов.
Возможность изменения частоты сбора статистики для оптимизации связанных с ним издержек.
Вычисление статистики по событиям ожидания для выполняемых запросов.
Подсчёт статистики использования ресурсов при выполнении операторов.
Подсчёт статистики аннулирования кеша.
Предоставление возможности просмотра статистики по очистке баз данных, таблиц и индексов, собранных ядром системы.
Описание типов и представлений, отображающих статистику аннулирования кешей, а также общая информация об этой статистике приводится в разделе Подраздел F.42.8.
F.42.1. Ограничения
При некоторых обстоятельствах
pgpro_stats
может не сопоставить параметры в тексте запроса с теми же параметрами в соответствующем плане запроса.Некоторые запросы SPI в статистике не учитываются.
Расширение
pgpro_stats
несовместимо с pg_stat_statements, а также другими расширениями, встраивающими свои обработчики в анализатор, планировщик или исполнитель и влияющими на разбор, планирование или выполнение запросов. Также обратите внимание, что для получения окончательной версии запросов и планов библиотекаpgpro_stats
должна указываться последней в спискеshared_preload_libraries
, но есть расширения, например,pg_pathman
, которые работают, только если их библиотека указана последней.pgpro_stats
может не работать корректно со сторонними расширениями, добавляющими в планы узлыCustomScan
иForeignScan
.В текущей версии статистика планирования не собирается и соответствующие столбцы представлений содержат нули.
F.42.2. Установка и подготовка
Расширение pgpro_stats
включено в состав Postgres Pro Enterprise, но должно устанавливаться отдельно. Установив pgpro_stats
, выполните следующие действия, чтобы подготовить pgpro_stats
к работе:
Добавьте
pgpro_stats
в параметр shared_preload_libraries в файлеpostgresql.conf
:shared_preload_libraries = 'pgpro_stats'
Перезапустите Postgres Pro Enterprise, чтобы изменения вступили в силу.
Когда сервер перезапустится,
pgpro_stats
начнёт собирать статистику по всем базам данных в кластере. При необходимости вы можете ограничить область сбора отдельными базами или отключить его, воспользовавшись параметрами конфигурацииpgpro_stats
.Обращаться к собираемой статистике вы сможете после того, как создадите расширение
pgpro_stats
:CREATE EXTENSION pgpro_stats;
F.42.3. Использование
F.42.3.1. Сбор статистики по операторам запросов и планам
После того как расширение pgpro_stats
будет установлено, оно начнёт собирать статистику по выполняемым операторам. Собираемые данные во многом пересекаются с теми, что собирает pg_stat_statements, но также включают информацию о планах запросов и событиях ожидания для каждого типа запроса. Полученная статистика сохраняется в кольцевом буфере в памяти, а прочитать её можно через представление pgpro_stats_statements.
По умолчанию pgpro_stats
собирает статистику по всем операторам, с учётом значений параметров pgpro_stats.track и pgpro_stats.track_utility. Однако в целях оптимизации производительности вы можете уменьшить частоту выборки, воспользовавшись параметром pgpro_stats.query_sample_rate, и тогда pgpro_stats
для вычисления статистики будет случайным образом выбирать заданную долю запросов из общего количества.
Для сбора статистики по событиям ожидания pgpro_stats
производит выборки с определённой периодичностью. Эта периодичность задаётся параметром pgpro_stats.profile_period и по умолчанию равна 10 мс. Если выборка показывает, что процесс находится в состоянии ожидания, к общей длительности ожидания события добавляется значение pgpro_stats.profile_period. Таким образом, оценка длительности ожидания остаётся корректной даже при изменениях значения pgpro_stats.profile_period. Если вас не интересует статистика по событиям ожидания, сбор этой информации можно отключить, установив для параметра pgpro_stats.enable_profile значение false
.
Показатели pgpro_stats_statements.plans
и pgpro_stats_statements.calls
не обязательно должны совпадать, так как статистика планирования и выполнения обновляется в конце соответствующей фазы и только при успешном завершении этой фазы. Например, если для оператора успешно выполнилось планирование, но во время выполнения произошла ошибка, изменится только статистика планирования. Если же планирование пропускается по причине использования кешированного плана, увеличивается только счётчик выполнения.
Например, давайте создадим таблицу со случайными данными и построим в ней индекс:
CREATE TABLE test AS (SELECT i, random() x FROM generate_series(1,1000000) i); CREATE INDEX test_x_idx ON test (x);
Выполните несколько раз следующий запрос с различными значениями :x_min
и :x_max
:
select * from test where x >= :x_min and x <= :x_max;
После этого собранная статистика должна появиться в представлении pgpro_stats_statements
:
SELECT queryid, query, planid, plan, wait_stats FROM pgpro_stats_statements WHERE query LIKE 'select * from test where%'; -[ RECORD 1 ]---------------------------------------------------------------------------------------------------------- queryid | 1109491335754870054 query | select * from test where x >= $1 and x <= $2 planid | 8287793242828473388 plan | Gather | Output: i, x | Workers Planned: 2 | -> Parallel Seq Scan on public.test | Output: i, x | Filter: ((test.x >= $3) AND (test.x <= $4)) | wait_stats | {"IO": {"DataFileRead": 10}, "IPC": {"BgWorkerShutdown": 10}, "Total": {"IO": 10, "IPC": 10, "Total": 20}} -[ RECORD 2 ]---------------------------------------------------------------------------------------------------------- queryid | 1109491335754870054 query | select * from test where x >= $1 and x <= $2 planid | -9045072158333552619 plan | Bitmap Heap Scan on public.test | Output: i, x | Recheck Cond: ((test.x >= $3) AND (test.x <= $4)) | -> Bitmap Index Scan on test_x_idx | Index Cond: ((test.x >= $5) AND (test.x <= $6)) | wait_stats | {"IO": {"DataFileRead": 40}, "Total": {"IO": 40, "Total": 40}} -[ RECORD 3 ]---------------------------------------------------------------------------------------------------------- queryid | 1109491335754870054 query | select * from test where x >= $1 and x <= $2 planid | -1062789671372193287 plan | Seq Scan on public.test | Output: i, x | Filter: ((test.x >= $3) AND (test.x <= $4)) | wait_stats | NULL -[ RECORD 4 ]---------------------------------------------------------------------------------------------------------- queryid | 1109491335754870054 query | select * from test where x >= $1 and x <= $2 planid | -1748292253893834280 plan | Index Scan using test_x_idx on public.test | Output: i, x | Index Cond: ((test.x >= $3) AND (test.x <= $4)) | wait_stats | NULL
F.42.3.2. Сбор дополнительных метрик
Используя pgpro_stats
, вы можете определить дополнительные интересующие вас метрики. Собираемые данные будут накапливаться в кольцевом буфере для последующей передачи их в систему мониторинга. Этот подход лучше, чем непосредственный опрос базы данных системой мониторинга, так как в случае кратковременного прерывания соединения собранные данные не будут потеряны, а сохранятся в буфере и могут быть считаны позднее.
Чтобы настроить сбор дополнительной метрики, выполните следующее:
Для каждой метрики необходимо определить все параметры конфигурации, перечисленные в Подразделе F.42.7.2. В именах параметров должен присутствовать уникальный идентификатор (номер) метрики.
Например, чтобы раз в 60 секунд собирать информацию о замусоривании индексов, вы можете определить первую дополнительную метрику, установив соответствующие параметры следующим образом:
pgpro_stats.metric_1_name = index_bloat pgpro_stats.metric_1_query = 'select iname, ibloat, ipages from bloat' pgpro_stats.metric_1_db = 'postgres' pgpro_stats.metric_1_user = postgres pgpro_stats.metric_1_period = '60s'
Перезапустите сервер.
pgpro_stats
начинает собирать статистику по выполняемым операторам и сохраняет её в кольцевом буфере; собранная статистика появляется в представленииpgpro_stats_metrics
:SELECT * FROM pgpro_stats_metrics;
Когда метрика уже добавлена, её параметры можно изменять без перезапуска сервера, просто перезагружая файл конфигурации
postgresql.conf
.При необходимости настройте экспорт данных в систему мониторинга, которую вы используете.
F.42.4. Представления
F.42.4.1. Представление pgpro_stats_statements
Статистика, собираемая модулем, выдаётся через представление с именем pgpro_stats_statements
. Это представление содержит отдельные строки для каждой комбинации идентификатора базы данных, идентификатора пользователя и идентификатора запроса (но в количестве, не превышающем максимальное число различных операторов, которые может отслеживать модуль). Столбцы представления показаны в Таблице F.89.
Таблица F.89. Столбцы pgpro_stats_statements
Имя | Тип | Ссылки | Описание |
---|---|---|---|
userid | oid |
| OID пользователя, выполнявшего оператор |
dbid | oid |
| OID базы данных, в которой выполнялся оператор |
queryid | bigint | Внутренний хеш-код, вычисленный для дерева разбора оператора | |
planid | bigint | Внутренний хеш-код, вычисленный для дерева плана оператора | |
query | text | Текст, представляющий оператор | |
plan | text | План запроса, представленный в формате, определённом параметром конфигурации pgpro_stats.plan_format | |
plans | int8 | Число операций планирования этого оператора (если включён параметр pgpro_stats.track_planning , иначе 0). В текущей версии всегда 0. | |
total_plan_time | float8 | Общее время, затраченное на планирование этого оператора в миллисекундах (если включён параметр pgpro_stats.track_planning , иначе 0). В текущей версии всегда 0. | |
min_plan_time | float8 | Минимальное время, затраченное на планирование этого оператора в миллисекундах (если включён параметр pgpro_stats.track_planning , иначе 0). В текущей версии всегда 0. | |
max_plan_time | float8 | Максимальное время, затраченное на планирование этого оператора в миллисекундах (если включён параметр pgpro_stats.track_planning , иначе 0). В текущей версии всегда 0. | |
mean_plan_time | float8 | Среднее время, затраченное на планирование этого оператора в миллисекундах (если включён параметр pgpro_stats.track_planning , иначе 0). В текущей версии всегда 0. | |
stddev_plan_time | float8 | Стандартное отклонение времени, затраченного на планирование этого оператора в миллисекундах (если включён параметр pgpro_stats.track_planning , иначе 0). В текущей версии всегда 0. | |
plan_rusage | pgpro_stats_rusage | Статистика использования ресурсов при планировании оператора. В текущей версии содержит нули. | |
calls | int8 | Счётчик выполнений данного оператора | |
total_exec_time | float8 | Общее время, затраченное на выполнение оператора, в миллисекундах | |
min_exec_time | float8 | Минимальное время, затраченное на выполнение оператора, в миллисекундах | |
max_exec_time | float8 | Максимальное время, затраченное на выполнение оператора, в миллисекундах | |
mean_exec_time | float8 | Среднее время, затраченное на выполнение оператора, в миллисекундах | |
stddev_exec_time | float8 | Стандартное отклонение времени, затраченного на выполнение оператора, в миллисекундах | |
exec_rusage | pgpro_stats_rusage | Статистика использования ресурсов при выполнении оператора. | |
rows | int8 | Общее число строк, полученных или затронутых оператором | |
shared_blks_hit | int8 | Общее число попаданий разделяемых блоков в кеш для данного оператора | |
shared_blks_read | int8 | Общее число разделяемых блоков, прочитанных данным оператором | |
shared_blks_dirtied | int8 | Общее число разделяемых блоков, «загрязнённых» данным оператором | |
shared_blks_written | int8 | Общее число разделяемых блоков, записанных данным оператором | |
local_blks_hit | int8 | Общее число попаданий локальных блоков в кеш для данного оператора | |
local_blks_read | int8 | Общее число локальных блоков, прочитанных данным оператором | |
local_blks_dirtied | int8 | Общее число локальных блоков, «загрязнённых» данным оператором | |
local_blks_written | int8 | Общее число локальных блоков, записанных данным оператором | |
temp_blks_read | int8 | Общее число временных блоков, прочитанных данным оператором | |
temp_blks_written | int8 | Общее число временных блоков, записанных данным оператором | |
blk_read_time | float8 | Общее время, затраченное оператором на чтение блоков, в миллисекундах (если включён track_io_timing, или ноль в противном случае) | |
blk_write_time | float8 | Общее время, затраченное оператором на запись блоков, в миллисекундах (если включён track_io_timing, или ноль в противном случае) | |
wal_records | int8 | Общее число записей WAL, сгенерированных при выполнении операторов. В текущей версии всегда 0. | |
wal_fpi | int8 | Общее число образов полных страниц в WAL, сгенерированных при выполнении операторов. В текущей версии всегда 0. | |
wal_bytes | numeric | Общий объём WAL (в байтах), сгенерированный при выполнении операторов. В текущей версии всегда 0. | |
wait_stats | jsonb | Объект типа jsonb , содержащий статистику по событиям ожидания для каждого выполнения запроса по соответствующему плану. Все показатели представлены в миллисекундах и кратны параметру конфигурации pgpro_stats.profile_period. | |
inval_msgs | pgpro_stats_inval_msgs | Число сообщений аннулирования кеша по типам, выданных при выполнении оператора (если это поддерживает сервер, иначе — 0). |
Аналогично расширению pg_stat_statements, DML запросы (то есть SELECT
, INSERT
, UPDATE
, DELETE
и MERGE
) в pgpro_stats объединяются в одну запись, когда они имеют идентичные структуры запросов согласно внутреннему вычисленному хешу. Обычно два запроса будут считаться равными при таком сравнении, если они семантически равнозначны, не считая значений констант, фигурирующих в запросе. Однако служебные команды (то есть все другие команды) сравниваются строго по текстовым строкам запросов. Когда значение константы игнорируется в целях сравнения запроса с другими запросами, эта константа заменяется в выводе pgpro_stats обозначением параметра, например, $k
, где k
- натуральное число. Если в запросе уже есть параметры, то начальное значение k
равно номеру, следующим за номером последнего параметра $n
в исходном тексте запроса. Если параметров нет, то начальное значение k
равно единице. Стоит отметить, что в некоторых случаях на эту нумерацию могут влиять скрытые символы параметров. Например, PL/pgSQL применяет такие символы для добавления в запросы значений локальных переменных функций, так что оператор PL/pgSQL вида SELECT i + 1 INTO j
будет представлен в тексте как SELECT i + $2
.
Подобный механизм объединения текстов pgpro_stats использует и для текстов планов. При этом делается попытка сопоставить номера констант в тексте плана соответствующим номерам констант в тексте запроса. Если такая попытка для какой-либо константы в тексте плана оканчивается неудачей, то ей присваивается следующий номер, больший максимального номера заменённой константы в тексте запроса. Например, для запроса:
SELECT 1::int, 'abc'::VARCHAR(3), 2::int;
в его тексте и в тексте соответствующего плана pgpro_stats подставит номера констант следующим образом:
postgres=# SELECT query, plan FROM pgpro_stats_statements; query | plan ------------------------------------------------+-------------------------------------------------- SELECT $1::int, $2::VARCHAR(3), $3::int | Result + | Output: $1, $4, $3 +
В данном тексте плана удалось сопоставить константы с номерами 1 и 3 из текста запроса, а константу с номером 2 сопоставить не удалось, и она была заменена номером, следующим за максимальным номером в тексте запроса — номером 4.
При подстановке номеров в тесте плана делается исключение для номера версии XML документа. Если в исходном запросе он был задан константой, например '1.0', то в тексте плана это значение сохранится как есть и не будет заменено на подстановочный символ вида $k
. Если в исходном запросе номер версии XML документа был задан выражением, то подстановка символов вместо констант будет сделана по обычным правилам.
F.42.4.2. Представление pgpro_stats_totals
Агрегированная статистика, собранная модулем, выдаётся через представление pgpro_stats_totals
. Это представление содержит отдельные строки для каждого отдельного объекта БД (но в количестве, не превышающем максимальное число различных объектов, которое может отслеживать модуль). Столбцы представления показаны в Таблице F.90.
Таблица F.90. Столбцы pgpro_stats_totals
Имя | Тип | Описание |
---|---|---|
object_type | text | Тип объекта, для которого агрегируется статистика: «cluster» (кластер БД), «database» (база данных), «user» (пользователь), «client_addr» (адрес клиента), «application» (приложение), «backend» (обслуживающий процесс), «session» (сеанс) |
object_id | bigint | Идентификатор объекта: oid для баз и пользователей, pid для обслуживающих процессов, sid для сеансов, NULL для иных объектов |
object_name | text | Текстовое имя объекта либо NULL |
queries_planned | int8 | Число спланированных запросов |
total_plan_time | float8 | Общее время, затраченное на планирование операторов, в миллисекундах. В текущей версии всегда 0. |
total_plan_rusage | pgpro_stats_rusage | Агрегированная статистика использования ресурсов при планировании операторов. В текущей версии содержит нули. |
queries_executed | int8 | Число выполненных запросов |
total_exec_time | float8 | Общее время, затраченное на выполнение операторов, в миллисекундах |
total_exec_rusage | pgpro_stats_rusage | Агрегированная статистика использования ресурсов при выполнении операторов |
rows | int8 | Общее число строк, полученных или затронутых операторами |
shared_blks_hit | int8 | Общее число попаданий разделяемых блоков в кеш для данных операторов |
shared_blks_read | int8 | Общее число разделяемых блоков, прочитанных операторами |
shared_blks_dirtied | int8 | Общее число разделяемых блоков, «загрязнённых» операторами |
shared_blks_written | int8 | Общее число разделяемых блоков, записанных операторами |
local_blks_hit | int8 | Общее число попаданий локальных блоков в кеш для данных операторов |
local_blks_read | int8 | Общее число локальных блоков, прочитанных операторами |
local_blks_dirtied | int8 | Общее число локальных блоков, «загрязнённых» операторами |
local_blks_written | int8 | Общее число локальных блоков, записанных операторами |
temp_blks_read | int8 | Общее число локальных блоков, прочитанных операторами |
temp_blks_written | int8 | Общее число временных блоков, записанных операторами |
blk_read_time | float8 | Общее время, затраченное операторами на чтение блоков, в миллисекундах (если включён track_io_timing, или ноль в противном случае) |
blk_write_time | float8 | Общее время, затраченное операторами на запись блоков, в миллисекундах (если включён track_io_timing, или ноль в противном случае) |
wal_records | int8 | Общее число записей WAL, сгенерированных при выполнении операторов |
wal_fpi | int8 | Общее число образов полных страниц в WAL, сгенерированных при выполнении операторов |
wal_bytes | numeric | Общий объём WAL (в байтах), сгенерированный при выполнении операторов |
wait_stats | jsonb | Объект типа jsonb , содержащий статистику по событиям ожидания для каждого выполнения запроса. Все показатели представлены в миллисекундах и кратны параметру конфигурации pgpro_stats.profile_period. |
inval_msgs | pgpro_stats_inval_msgs | Число сообщений аннулирования кеша по типам, выданных при выполнении операторов (если это поддерживает сервер, иначе — 0). |
cache_resets | int4 | Число сбросов разделяемого кеша (только для кластера БД, баз данных и обслуживающих процессов). Увеличивается для обслуживающего процесса, когда он получает сообщение, вызывающее полный сброс кеша. |
F.42.4.3. Представление pgpro_stats_metrics
Метрики, собранные модулем pgpro_stats
, выводятся в представлении pgpro_stats_metrics
. В таблице ниже описаны столбцы этого представления.
Таблица F.91. Столбцы pgpro_stats_metrics
Имя | Тип | Описание |
---|---|---|
metric_number | int4 | Уникальный идентификатор собираемой метрики, назначаемый пользователем. Этот идентификатор входит в имена параметров, определяющих метрику. |
metric_name | text | Имя метрики, определённое параметром pgpro_stats.metric_ |
db_name | text | Имя базы данных, для которой была получена метрика |
ts | timestamptz | Время, когда было вычислено значение метрики |
value | jsonb | Результат запроса, производившего вычисление метрики. Он сериализуется в типе jsonb как массив объектов, полученных с помощью функции to_jsonb( . В случае ошибки возвращается один объект, содержащий поля code (код ошибки), message (сообщение), detail (подробности) и hint (подсказка). |
F.42.4.4. Представление pgpro_stats_vacuum_database
Представление pgpro_stats_vacuum_database
будет содержать по одной строке для каждой базы данных в текущем кластере, показывая статистику очистки этой конкретной БД. Эта статистика собирается ядром системы, как описано в Разделе 27.2. В таблице ниже описаны столбцы представления.
Таблица F.92. Представление pgpro_stats_vacuum_database
Столбец | Тип | Описание |
---|---|---|
dbid | oid | OID базы данных |
total_blks_read | int8 | Количество блоков базы данных, прочитанных операциями очистки для этой БД |
total_blks_hit | int8 | Количество попаданий в буферный кеш блоков базы данных в процессе операций очистки, выполненных для этой БД |
total_blks_dirtied | int8 | Количество блоков базы данных, загрязнённых операциями очистки для этой БД |
total_blks_written | int8 | Количество блоков базы данных, записанных операциями очистки для этой БД |
wal_records | int8 | Общее число записей WAL, сгенерированных операциями очистки для этой базы данных |
wal_fpi | int8 | Общее число образов полных страниц в WAL, сгенерированных операциями очистки для этой базы данных |
wal_bytes | numeric | Общий объём WAL (в байтах), сгенерированный операциями очистки для этой базы данных |
blk_read_time | float8 | Общее время, затраченное на чтение блоков базы данных операциями очистки, выполненными для этой БД, в миллисекундах (если включён параметр track_io_timing, или ноль в противном случае) |
blk_write_time | float8 | Общее время, затраченное на запись блоков базы данных операциями очистки, выполненными для этой БД, в миллисекундах (если включён параметр track_io_timing, или ноль в противном случае) |
delay_time | float8 | Время простоя в точке задержки при выполнении операций очистки для этой базы данных, в миллисекундах (за подробностями обратитесь к Подразделу 19.4.4). |
system_time | float8 | Время использования процессора в режиме ядра при очистке этой базы данных, в миллисекундах |
user_time | float8 | Время использования процессора в пользовательском режиме при очистке этой базы данных, в миллисекундах |
total_time | float8 | Общее время, затраченное на очистку этой базы данных, в миллисекундах |
interrupts | int4 | Сколько раз операции очистки для этой базы данных были прерваны из-за каких-либо ошибок |
F.42.4.5. Представление pgpro_stats_vacuum_tables
Представление pgpro_stats_vacuum_tables
будет содержать по одной строке для каждой таблицы в текущей базе данных (включая таблицы TOAST), показывая статистику очистки этой конкретной таблицы. Эта статистика собирается ядром системы, как описано в Разделе 27.2. В таблице ниже описаны столбцы представления.
Таблица F.93. Представление pgpro_stats_vacuum_tables
Столбец | Тип | Описание |
---|---|---|
relid | oid | OID таблицы |
schema | name | Имя схемы, в которой расположена эта таблица |
relname | name | Имя данной таблицы |
total_blks_read | int8 | Количество блоков БД, прочитанных операциями очистки для этой таблицы |
total_blks_hit | int8 | Количество попаданий в буферный кеш блоков базы данных в процессе операций очистки, выполненных для этой БД |
total_blks_dirtied | int8 | Количество блоков базы данных, загрязнённых операциями очистки для этой таблицы |
total_blks_written | int8 | Количество блоков базы данных, записанных операциями очистки для этой таблицы |
rel_blks_read | int8 | Количество блоков, прочитанных из этой таблицы операциями очистки |
rel_blks_hit | int8 | Сколько раз блоки этой таблицы уже обнаруживались в буферном кеше операциями очистки, так что чтение с диска не потребовалось (здесь учитываются только случаи обнаружения блоков в кеше Postgres Pro, а не в кеше операционной системы) |
pages_scanned | int8 | Количество страниц, к которым обращались операции очистки, выполненные для этой таблицы |
pages_removed | int8 | Количество страниц, удалённых из физического хранилища операциями очистки для этой таблицы |
pages_frozen | int8 | Сколько раз страницы этой таблицы были помечены операциями очистки в карте видимости как полностью замороженные |
pages_all_visible | int8 | Сколько раз страницы этой таблицы были помечены операциями очистки в карте видимости как полностью видимые |
tuples_deleted | int8 | Количество «мёртвых» кортежей, удалённых операциями очистки из этой таблицы |
tuples_frozen | int8 | Количество кортежей этой таблицы, помеченных операциями очистки как замороженные |
dead_tuples | int8 | Количество «мёртвых» кортежей, оставленных операциями очистки в этой таблице из-за видимости этих кортежей в транзакциях |
index_vacuum_count | int8 | Сколько раз была выполнена очистка индексов этой таблицы |
rev_all_frozen_pages | int8 | Сколько раз для страниц данной таблицы снималась метка полной заморозки в карте видимости |
rev_all_visible_pages | int8 | Сколько раз для страниц данной таблицы снималась метка полной видимости в карте видимости |
wal_records | int8 | Общее число записей WAL, сгенерированных операциями очистки для этой таблицы |
wal_fpi | int8 | Общее число образов полных страниц в WAL, сгенерированных операциями очистки для этой таблицы |
wal_bytes | numeric | Общий объём WAL (в байтах), сгенерированный операциями очистки для этой таблицы |
blk_read_time | float8 | Общее время, затраченное на чтение блоков БД операциями очистки, выполненными для этой таблицы, в миллисекундах (если включён параметр track_io_timing, или ноль в противном случае) |
blk_write_time | float8 | Общее время, затраченное на запись блоков БД операциями очистки, выполненными для этой таблицы, в миллисекундах (если включён параметр track_io_timing, или ноль в противном случае) |
delay_time | float8 | Время простоя в точке задержки при выполнении операций очистки для этой таблицы, в миллисекундах (за подробностями обратитесь к Подразделу 19.4.4). |
system_time | float8 | Время использования процессора в режиме ядра при очистке этой таблицы, в миллисекундах |
user_time | float8 | Время использования процессора в пользовательском режиме при очистке этой таблицы, в миллисекундах |
total_time | float8 | Общее время, затраченное на очистку этой таблицы, в миллисекундах |
interrupts | int4 | Сколько раз операции очистки для этой таблицы были прерваны из-за каких-либо ошибок |
Столбцы total_*
, wal_*
и blk_*
содержат данные об очистке индексов этой таблицы, а столбцы system_time
и user_time
содержат только данные об очистке кучи.
F.42.4.6. Представление pgpro_stats_vacuum_indexes
Представление pgpro_stats_vacuum_indexes
будет содержать одну строку для каждого индекса в текущей базе данных (включая индексы таблицы TOAST), показывая статистику очистки этого конкретного индекса. Эта статистика собирается ядром системы, как описано в Разделе 27.2. В таблице ниже описаны столбцы представления.
Таблица F.94. Представление pgpro_stats_vacuum_indexes
Столбец | Тип | Описание |
---|---|---|
relid | oid | OID индекса |
schema | name | Имя схемы, в которой расположен этот индекс |
relname | name | Имя этого индекса |
total_blks_read | int8 | Количество блоков БД, прочитанных операциями очистки для этого индекса |
total_blks_hit | int8 | Количество попаданий в буферный кеш блоков базы данных в процессе операций очистки, выполненных для этого индекса |
total_blks_dirtied | int8 | Количество блоков базы данных, загрязнённых операциями очистки для этого индекса |
total_blks_written | int8 | Количество блоков базы данных, записанных операциями очистки для этого индекса |
rel_blks_read | int8 | Количество блоков, прочитанных для этого индекса операциями очистки |
rel_blks_hit | int8 | Сколько раз блоки этого индекса уже обнаруживались в буферном кеше операциями очистки, так что чтение с диска не потребовалось (здесь учитываются только случаи обнаружения блоков в кеше Postgres Pro, а не в кеше операционной системы ОС) |
pages_deleted | int8 | Количество страниц, удалённых операциями очистки, выполненными для этого индекса |
tuples_deleted | int8 | Количество «мёртвых» кортежей, удалённых операциями очистки для этого индекса |
wal_records | int8 | Общее число записей WAL, сгенерированных операциями очистки для этого индекса |
wal_fpi | int8 | Общее число образов полных страниц в WAL, сгенерированных операциями очистки для этого индекса |
wal_bytes | numeric | Общий объём WAL (в байтах), сгенерированный операциями очистки для этого индекса |
blk_read_time | float8 | Общее время, затраченное на чтение блоков БД операциями очистки, выполненными для этого индекса, в миллисекундах (если включён параметр track_io_timing, или ноль в противном случае) |
blk_write_time | float8 | Общее время, затраченное на запись блоков БД операциями очистки, выполненными для этой таблицы, в миллисекундах (если включён параметр track_io_timing, или ноль в противном случае) |
delay_time | float8 | Время простоя в точке задержки при выполнении операций очистки для этого индекса, в миллисекундах (за подробностями обратитесь к Подразделу 19.4.4). |
system_time | float8 | Время использования процессора в режиме ядра при очистке этого индекса, в миллисекундах |
user_time | float8 | Время использования процессора в пользовательском режиме при очистке этого индекса, в миллисекундах |
total_time | float8 | Общее время, затраченное на очистку этого индекса, в миллисекундах |
interrupts | int4 | Сколько раз операции очистки для этого индекса были прерваны из-за каких-либо ошибок |
F.42.5. Типы данных
F.42.5.1. Тип pgpro_stats_rusage
Тип pgpro_stats_rusage
представляет собой запись, содержащую статистику использования ресурсов во время планирования и выполнения запросов. Поля этого типа показаны в Таблице F.95.
Таблица F.95. Поля pgpro_stats_rusage
Имя | Тип | Описание |
---|---|---|
reads | bigint | Количество байт, прочитанное на уровне файловой системы |
writes | bigint | Количество байт, записанное на уровне файловой системы |
user_time | double precision | Время использования процессора в пользовательском режиме |
system_time | double precision | Время использования процессора в режиме ядра |
minflts | bigint | Количество восстановленных страниц (мягких ошибок обращения к страницам) |
majflts | bigint | Количество ошибок обращения к страницам (жёстких) |
nswaps | bigint | Количество обращений к пространству подкачки |
msgsnds | bigint | Количество переданных сообщений IPC |
msgrcvs | bigint | Количество полученных сообщений IPC |
nsignals | bigint | Количество полученных сигналов |
nvcsws | bigint | Количество «добровольных» переключений контекста |
nivcsws | bigint | Количество принудительных переключений контекста |
F.42.6. Функции
-
pgpro_stats_statements_reset(userid Oid, dbid Oid, queryid bigint, planid bigint) returns void
Функция
pgpro_stats_statements_reset
очищает всю статистику, собранную к этому времени модулемpgpro_stats
для заданного пользователя (userid
), базы данных (dbid
), запроса (queryid
) и плана (planid
). В случае отсутствия одного из параметров для него подразумевается нулевое значение (неприменимое ограничение) и очищается статистика, соответствующая другим параметрам. Если никакой параметр не задан или все параметры имеют нулевое значение (неприменимое), очищается вся статистика. По умолчанию эту функцию могут выполнять только суперпользователи. Другим пользователям можно дать доступ к ней, используяGRANT
.Примечание
Поскольку статистика в представлениях
pgpro_stats_vacuum_database
,pgpro_stats_vacuum_tables
иpgpro_stats_vacuum_indexes
собирается ядром системы, для её сброса вызовите функциюpg_stat_reset( )
(за подробностями обратитесь к Подразделу 27.2.3).-
pgpro_stats_statements(showtext boolean) returns setof record
Представление
pgpro_stats_statements
определяется как результат вызова одноимённой функции. Функциюpgpro_stats_statements
можно также вызывать непосредственно, а с аргументомshowtext := false
можно получить результат без текста запроса (то есть в выходном аргументе, соответствующем столбцу представленияquery
, будет выдаваться null). Эта возможность предусмотрена для того, чтобы внешние средства мониторинга могли не загружать каждый раз текст запросов, который может быть довольно объёмным. Средство мониторинга может просто один раз запомнить текст запросов для каждой записи в представлении (как это и делает сам модульpgpro_stats
) и затем запрашивать текст для новых запросов только при необходимости. Так как сервер сохраняет текст запросов в файле, при таком подходе постоянное чтение содержимогоpgpro_stats_statements
будет создавать меньшую нагрузку на ввод/вывод.-
pgpro_stats_totals_reset(type text, id bigint) returns void
Функция
pgpro_stats_totals_reset
очищает всю статистику, собранную к этому времени модулемpgpro_stats
для заданного типа (type
) и идентификатора (id
) объекта. В случае отсутствия параметров или когда параметрtype
равен0
, очищается вся статистика. Если в параметреtype
передаётся корректный тип объекта, то в случае указанияid
очищается статистика только для объекта с заданным идентификатором, а в отсутствие такого указания — для всех объектов заданного типа. Если же параметрtype
не задаёт существующий тип объекта, никакая статистика не очищается. По умолчанию эту функцию могут выполнять только суперпользователи. Другим пользователям можно дать доступ к ней, используяGRANT
.-
pgpro_stats_totals() returns setof record
Представление
pgpro_stats_totals
построено на базе одноимённой функции, которую пользователи также могут вызывать непосредственно.-
pgpro_stats_metrics(showtext boolean) returns setof record
Определяет представление
pgpro_stats_metrics
, описанное подробно в Таблице F.91.-
pgpro_stats_wal_sender_crc_errors() returns bigint
pgpro_stats_wal_sender_crc_errors
возвращает количество ошибок, обнаруженных процессом-передатчиком WAL, когда параметр wal_sender_check_crc включён (on
. Обратите внимание, что этот счётчик обнуляется при перезапуске кластера.-
pgpro_stats_vacuum_tables(dboid oid, relid oid) returns setof record
Определяет строку представления
pgpro_stats_vacuum_tables
, которое подробно описано в Таблице F.93, для базы данных, указанной вdboid
, и таблицы, указанной вreloid
. Еслиreloid
= 0, возвращается статистика для каждой таблицы в указанной базе данных.-
pgpro_stats_vacuum_indexes(dboid oid, relid oid) returns setof record
Определяет строку представления
pgpro_stats_vacuum_indexes
, которое подробно описано в Таблице F.94, для базы данных, указанной вdboid
, и таблицы, указанной вreloid
. Еслиreloid
= 0, возвращается статистика для каждого индекса в указанной базе данных.
F.42.7. Параметры конфигурации
F.42.7.1. Основные параметры
pgpro_stats.max
(integer
)Параметр
pgpro_stats.max
задаёт максимальное число операторов, отслеживаемых модулем (то есть максимальное число строк в представленииpgpro_stats_statements
). Когда на обработку поступает больше, чем заданное число различных операторов, информация о редко выполняемых операторах отбрасывается. Значение по умолчанию — 5000. Этот параметр можно задать только при запуске сервера.pgpro_stats.max_totals
(integer
)Параметр
pgpro_stats.max_totals
задаёт максимальное число объектов, отслеживаемых модулем (то есть максимальное число строк в представленииpgpro_stats_totals
). Когда количество наблюдаемых объектов превышает заданное, информация о наименее активно используемых объектах удаляется. Значение по умолчанию — 1000. Этот параметр можно задать только при запуске сервера.pgpro_stats.track
(enum
)Параметр
pgpro_stats.track
определяет, какие операторы будут отслеживаться модулем. Со значениемtop
отслеживаются операторы верхнего уровня (те, что непосредственно выполняются клиентами), со значениемall
также отслеживаются вложенные операторы (например, операторы, вызываемые внутри функций), а значениеnone
полностью отключает сбор статистики по операторам. Значение по умолчанию —top
. Изменять этот параметр могут только суперпользователи.pgpro_stats.track_utility
(boolean
)Параметр
pgpro_stats.track_utility
определяет, будет ли этот модуль отслеживать служебные команды. Служебными командами считаются команды, отличные отSELECT
,INSERT
,UPDATE
иDELETE
. Значение по умолчанию —on
(вкл.). Изменить этот параметр могут только суперпользователи.pgpro_stats.track_planning
(boolean
)Параметр
pgpro_stats.track_planning
определяет, будет ли этот модуль отслеживать операции планирования и их длительность. При включении этого параметра возможно заметное снижение производительности, особенно когда параллельно выполняется большое количество практически однотипных запросов. Значение по умолчанию —off
(выкл.). Изменить этот параметр могут только суперпользователи.pgpro_stats.track_totals
(boolean
)Параметр
pgpro_stats.track_totals
определяет, будет ли агрегироваться статистика по объектам (на уровне кластера, баз, пользователей и т. д.). Значение по умолчанию —on
(вкл.). Изменить этот параметр могут только суперпользователи.pgpro_stats.track_cluster
(boolean
)Параметр
pgpro_stats.track_cluster
определяет, будет ли агрегироваться статистика по кластеру в целом. Значение по умолчанию —on
(вкл.). Изменить этот параметр могут только суперпользователи.pgpro_stats.track_databases
(boolean
)Параметр
pgpro_stats.track_databases
определяет, будет ли агрегироваться статистика по базам данных. Значение по умолчанию —on
(вкл.). Изменить этот параметр могут только суперпользователи.pgpro_stats.track_users
(boolean
)Параметр
pgpro_stats.track_users
определяет, будет ли агрегироваться статистика по пользователям. Значение по умолчанию —on
(вкл.). Изменить этот параметр могут только суперпользователи.pgpro_stats.track_applications
(boolean
)Параметр
pgpro_stats.track_applications
определяет, будет ли агрегироваться статистика по приложениям (по именам, задаваемым в application_name). Значение по умолчанию —on
(вкл.). Изменить этот параметр могут только суперпользователи.pgpro_stats.track_client_addr
(boolean
)Параметр
pgpro_stats.track_client_addr
определяет, будет ли агрегироваться статистика по IP-адресам клиентов. Значение по умолчанию —on
(вкл.). Изменить этот параметр могут только суперпользователи.pgpro_stats.track_backends
(boolean
)Параметр
pgpro_stats.track_backends
определяет, будет ли агрегироваться статистика по обслуживающим процессам. Значение по умолчанию —on
(вкл.). Изменить этот параметр могут только суперпользователи.pgpro_stats.track_sessions
(boolean
)Параметр
pgpro_stats.track_sessions
определяет, будет ли агрегироваться статистика по сеансам. Значение по умолчанию —on
(вкл.). Изменить этот параметр могут только суперпользователи.pgpro_stats.save
(boolean
)Параметр
pgpro_stats.save
определяет, должна ли статистика операторов сохраняться после перезагрузки сервера. Если он отключён (имеет значениеoff
), статистика не сохраняется при остановке сервера и не перезагружается при запуске. Значение по умолчанию —on
(вкл.). Этот параметр можно задать только вpostgresql.conf
или в командной строке сервера.pgpro_stats.plan_format
(text
)Параметр
pgpro_stats.plan_format
выбирает формат плана запроса в выводеEXPLAIN
. Возможные значения:text
,xml
,json
иyaml
. Значение по умолчанию:text
. При изменении этого параметра требуется перезапустить сервер.pgpro_stats.enable_profile
(boolean
)Параметр
pgpro_stats.enable_profile
включает профилирование событий ожидания по отдельным операторам. Значение по умолчанию:true
(вкл.). При изменении этого параметра требуется перезапустить сервер.pgpro_stats.query_sample_rate
(float
)Параметр
pgpro_stats.query_sample_rate
задаёт долю запросов, которые будут выбираться случайным образом для подсчёта статистики. Возможные значения лежат в диапазоне от0.0
(пропускать все запросы) до1.0
(обрабатывать все запросы). Значение по умолчанию:1.0
. При изменении этого параметра требуется перезапустить сервер.pgpro_stats.profile_period
(integer
)Параметр
pgpro_stats.profile_period
задаёт интервал (в миллисекундах) для сбора информации о событиях ожидания. Значение по умолчанию:10
. Изменить этот параметр могут только суперпользователи.pgpro_stats.metrics_buffer_size
(integer
)Параметр
pgpro_stats.metrics_buffer_size
задаёт размер кольцевого буфера для сбора статистических метрик. Значение по умолчанию:16kB
. При изменении этого параметра требуется перезапустить сервер.pgpro_stats.metrics_workers
(integer
)Параметр
pgpro_stats.metrics_workers
задаёт количество рабочих процессов, которые будут собирать статистические метрики. Если этот параметр больше или равен 2, один из рабочих процессов будет главным, распределяющим запросы между всеми остальными. Если количество рабочих процессов ограничивается одним, он будет перезапускаться для подключения к разным базам данных. Когда этот параметр равен0
, сбор метрик отключается. Значение по умолчанию:2
. При изменении этого параметра требуется перезапустить сервер.
F.42.7.2. Параметры, определяющие метрики
Следующие параметры предназначены для определения дополнительных метрик, которые будет собирать pgpro_stats
. Номер N
в имени параметра служит уникальным идентификатором метрики, к которой будет применяться задаваемое значение; он должен быть положительным и уникальным среди всех метрик.
Если вы добавляете параметры для определения новой метрики, необходимо перезапустить сервер, чтобы это определение начало действовать. Когда метрика уже добавлена, её параметры можно изменять без перезапуска сервера, просто перезагружая файл конфигурации postgresql.conf
.
pgpro_stats.metric_
(N
_nametext
)Имя метрики с номером
N
. Это имя будет выводиться в столбцеmetric_name
представленияpgpro_stats_metrics
.pgpro_stats.metric_
(N
_querytext
)Текст запроса, определяющий значение собираемой метрики.
pgpro_stats.metric_
(N
_periodinteger
)Интервал, с которым будет собираться метрика
N
, в миллисекундах. Значение по умолчанию: 60000 mspgpro_stats.metric_
(N
_dbtext
)Список баз данных, в которых будет собираться метрика
N
. Имена баз данных должны разделяться запятыми. Чтобы выбрать все базы данных в кластере, за исключением баз-шаблонов, можно указать значение*
. Если вы также хотите анализировать запросы в базах-шаблонах, их нужно перечислить явно.pgpro_stats.metric_
(N
_usertext
)Имя пользователя, от имени которого будет собираться метрика
N
. Этот пользователь должен иметь доступ к базе данных, в которой будет выполняться запрос для сбора метрики.
F.42.8. Метрики аннулирования кеша
Помимо прочего, pgpro_stats может собирать статистику аннулирования кеша. Представленная в этом разделе общая информация поможет лучше понимать показатели, связанные с этой статистикой.
У каждого обслуживающего процесса есть свой локальный кеш, что позволяет минимизировать обращения к метаинформации таблиц, в частности к системным каталогам. Если какой-либо обслуживающий процесс изменяет метаинформацию некоторого объекта, она должна обновиться в кешах других обслуживающих процессов. Для этого первый обслуживающий процесс отправляет сообщение аннулирования в специальную очередь для таких сообщений.
Все обслуживающие процессы получают сообщения аннулирования из очереди. Если объект, для которого получено сообщение аннулирования, находится в кеше, его метаданные в кеше обновляются, иначе это сообщение просто игнорируется. В pgpro_stats значения большинства счётчиков сообщений аннулирования, если явно не указано иное, увеличиваются, когда обслуживающие процессы только генерируют сообщения, которые попадут в очередь после фиксации соответствующей транзакции. Обратите внимание, что при откате транзакции счётчики не уменьшаются, хотя сообщения в этом случае не доходят до очереди и аннулирование не производится.
Когда обслуживающий процесс, добавляющий сообщения в очередь, обнаруживает, что размер очереди достиг некоторого предела, он запускает очистку, удаляя сообщения, уже обработанные всеми обслуживающими процессами. Если какие-то обслуживающие процессы не успевают обрабатывать сообщения и, таким образом, задерживают очистку, им передаётся сигнал, чтобы они сбросили свои кеши.
F.42.8.1. Представление pgpro_stats_inval_status
Представление pgpro_stats_inval_status
содержит одну строку, показывающую текущее состояние глобальной очереди аннулирования кеша. Столбцы представления показаны в Таблице F.96.
Таблица F.96. Столбцы pgpro_stats_inval_status
Имя | Тип | Описание |
---|---|---|
num_inval_messages | int8 | Текущее число сообщений аннулирования в очереди |
num_inval_queue_cleanups | int8 | Количество очисток очереди аннулирования, выполненных во избежание её переполнения |
num_inval_queue_resets | int4 | Число операций сброса кеша для обслуживающих процессов, не успевающих обрабатывать сообщения достаточно быстро |
В работающей системе num_inval_messages
обычно имеет значение около 4000, то есть очередь почти полностью заполнена. Увеличение num_inval_queue_cleanups
говорит о том, что в очередь поступает много сообщений аннулирования кеша. Обычно счётчик num_inval_queue_resets
не увеличивается, а его увеличение свидетельствует о слишком быстром поступлении таких сообщений или о задержках в их обработке со стороны обслуживающих процессов. Отслеживание значений num_inval_queue_cleanups
и num_inval_queue_resets
в некоторых случаях может позволить обнаружить проблемные обслуживающие процессы, как описано ниже.
Если на протяжении некоторого времени счётчик num_inval_queue_cleanups
заметно увеличивается, а num_inval_queue_resets
— нет, это говорит о том, что обслуживающие процессы обрабатывают сообщения аннулирования медленнее, чем они генерируются, но всё же достаточно быстро для того, чтобы очередь не переполнялась.
Если на протяжении некоторого времени счётчик num_inval_queue_cleanups
значительно не увеличивается, а счётчик num_inval_queue_resets
— увеличивается, это определённо указывает на задержку обработки сообщений обслуживающими процессами. Какие именно обслуживающие процессы виноваты в задержке, позволяет определить столбец cache_resets
представления pgpro_stats_totals
.
Если же на протяжении некоторого времени оба счётчика значительно увеличиваются, это указывает на то, что обслуживающие процессы обрабатывают сообщения аннулирования настолько медленно, что происходит переполнение очереди. Какие именно процессы задерживают обработку сообщений, позволяет определить столбец cache_reset
представления pgpro_stats_total
. Что является причиной увеличения значения num_inval_queue_resets
, большая скорость генерирования сообщений или слишком медленная их обработка, непосредственно определить нельзя. Однако можно проанализировать счётчик total
из представления pgpro_stats_inval_msgs
. Если в данном интервале времени счётчик изменился примерно на ту же величину, что и в предыдущем интервале той же длительности, увеличение счётчиков определённо вызвано задержками обслуживающих процессов.
F.42.8.2. Тип pgpro_stats_inval_msgs
Представления pgpro_stats_statements
и pgpro_stats_totals
для каждого соответствующего объекта показывают запись типа pgpro_stats_inval_msgs
со счётчиками сообщений аннулирования кеша. Поля этой записи показаны в Таблице F.97.
Таблица F.97. Поля pgpro_stats_inval_msgs
Имя | Тип | Описание |
---|---|---|
total | bigint | Общее число сообщений аннулирования |
catcache | bigint | Число сообщений избирательного аннулирования кеша каталога |
catalog | bigint | Число сообщений полного аннулирования кеша каталога |
relcache | bigint | Число сообщений избирательного аннулирования кеша отношений |
relcache_all | bigint | Число сообщений полного аннулирования кеша отношений |
smgr | bigint | Число сообщений, вызывающих аннулирование открытых файлов отношений. Увеличивается, когда сообщения попадают в очередь. |
relmap | bigint | Число сообщений аннулирования кеша карты отношений. Увеличивается, когда сообщения отправляются в очередь. |
snapshot | bigint | Число сообщений аннулирования снимков каталога |
F.42.9. Авторы
Postgres Professional, Москва, Россия