Мониторинг активности базы данных

Администратор базы данных часто задается вопросом: «Что сейчас делает система?». В этой главе рассказывается, как это выяснить.

Для мониторинга активности базы данных и анализа производительности доступно несколько инструментов. Большая часть этой главы посвящена описанию сборщика статистики QHB, но не стоит пренебрегать и обычными программами мониторинга Unix, такими как ps, top, iostat и vmstat. Кроме того, после выявления неэффективного запроса может потребоваться дополнительное исследование с помощью команды QHB EXPLAIN. В разделе Использование EXPLAIN рассматривается EXPLAIN и другие методы для изучения поведения отдельного запроса.



Стандартные инструменты Unix

В большинстве платформ Unix QHB изменяет заголовок своей команды, выводимый на экран программой ps, поэтому отдельные процессы сервера можно легко идентифицировать. Пример вывода:

$ ps auxww | grep ^qhb
qhb  15551  0.0  0.1  57536  7132 pts/0    S    18:02   0:00 qhb -i
qhb  15554  0.0  0.0  57536  1184 ?        Ss   18:02   0:00 qhb: background writer
qhb  15555  0.0  0.0  57536   916 ?        Ss   18:02   0:00 qhb: checkpointer
qhb  15556  0.0  0.0  57536   916 ?        Ss   18:02   0:00 qhb: walwriter
qhb  15557  0.0  0.0  58504  2244 ?        Ss   18:02   0:00 qhb: autovacuum launcher
qhb  15582  0.0  0.0  58772  3080 ?        Ss   18:04   0:00 qhb: joe runbug 127.0.0.1 idle
qhb  15606  0.0  0.0  58772  3052 ?        Ss   18:07   0:00 qhb: tgl regression [local] SELECT waiting
qhb  15610  0.0  0.0  58772  3056 ?        Ss   18:07   0:00 qhb: tgl regression [local] idle in transaction

(Допустимый формат вызова ps, как и детали отображаемой информации, отличаются на разных платформах. Этот пример приведен для одной из последних версий системы Linux.) Первым из перечисленных здесь процессов является процесс главного сервера. Выведенные для него аргументы команды те же, что использовались при запуске. Следующие четыре процесса являются фоновыми рабочими процессами, автоматически запускаемыми главным процессом. (Процесса «autovacuum launcher» (фоновый процесс «Автовакуум») не будет в этом списке, если в системе выключена автоочистка.) Каждый из оставшихся процессов — это серверный процесс, обрабатывающий одно клиентское подключение. Для каждого такого процесса устанавливается отображение командной строки в виде

qhb: пользователь база_данных хост активность

Элементы пользователь, база данных и хост остаются неизменными на протяжении всего жизненного цикла клиентского соединения, а индикатор активности меняется. Он может принимать значение idle (т. е. ожидание команды клиента), idle in transaction (ожидание клиента внутри блока BEGIN) или имя типа команды, например SELECT. Кроме того, если в настоящее время серверный процесс ожидает освобождения блокировки, которую удерживает другой сеанс, то к индикатору активности добавляется waiting. В приведенном выше примере мы можем сделать вывод, что процесс 15606 ожидает, пока процесс 15610 завершит свою транзакцию и тем самым освободит некоторую блокировку. (Процесс 15610 должен быть блокирующим, потому что нет другого активного сеанса. В более сложных случаях для определения, кто кого блокирует, понадобилось бы обратиться к системному представлению pg_locks.)

Если установлен параметр cluster_name, имя кластера также будет показано в выводе ps:

$ psql -c 'SHOW cluster_name'
 cluster_name
--------------
 server1
(1 row)


$ ps aux|grep server1
qhb   27093  0.0  0.0  30096  2752 ?        Ss   11:34   0:00 qhb: server1: background writer
...

Если выключить параметр update_process_title, то индикатор активности не меняется; заголовок процесса устанавливается только один раз при запуске нового процесса. На некоторых платформах это существенно снижает затраты на выполнение команды, на других это влияние незначительно.

Совет
Solaris требует особого обращения. Вместо /bin/ps нужно использовать /usr/ucb/ps. Также нужно использовать не один, а два флага w. Кроме того, у исходного вызова команды qhb отображение статуса в ps должно быть короче, чем у предоставляемого каждым серверным процессом. Если не сделать все эти три вещи, выводом ps для каждого серверного процесса будет исходная командная строка qhb.



Система накопительной статистики

Система накопительной статистики QHB поддерживает сбор и передачу информации о работе сервера. В настоящее время она учитывает обращения к таблицам и индексам как по дисковым блокам, так и по отдельным строкам. Также она отслеживает общее количество строк в каждой таблице и информацию о выполнении очистки и анализа для каждой таблицы. Кроме того, она может подсчитывать вызовы пользовательских функций и общее время, потраченное на каждую из них.

QHB также поддерживает выдачу динамической информации о том, что именно происходит в системе в данный момент, например, о том, какая именно команда выполняется в настоящее время другими серверными процессами, и о том, какие другие соединения существуют в системе. Эта возможность не зависит от системы накопительной статистики.


Конфигурация сбора статистики

Поскольку сбор статистики несколько увеличивает затраты на выполнение запроса, систему можно настроить так, чтобы она собирала или не собирала информацию. Это контролируется параметрами конфигурации, которые обычно устанавливаются в qhb.conf. (Подробную информацию об установке параметров конфигурации см. в главе Конфигурация сервера).

Параметр track_activities включает мониторинг текущих команд, выполняемых любым серверным процессом.

Параметр track_counts определяет, будет ли собираться статистика по обращениям к таблицам и индексам.

Параметр track_functions включает отслеживание использования пользовательских функций.

Параметр track_io_timing включает мониторинг времени чтения и записи блоков.

Параметр track_wal_io_timing включает мониторинг времени записи WAL.

Обычно эти параметры устанавливаются в qhb.conf так, чтобы они применялись ко всем процессам сервера, но с помощью команды SET их можно включить или выключить в отдельных сеансах. (Чтобы обычные пользователи не могли скрывать свою активность от администратора, изменять эти параметры с помощью SET могут только суперпользователи.)

Кумулятивная статистика собирается в разделяемой памяти. Каждый процесс QHB собирает статистику локально, а затем обновляет разделяемые данные с оптимальными интервалами. Когда сервер, включая физическую реплику, завершает работу в штатном режиме, постоянная копия статистических данных сохраняется в подкаталоге pg_stat, так что статистику можно хранить при перезапусках сервера. И наоборот, когда сервер запускается после аварийного выключения (например, после немедленного отключения, сбоя сервера, запуска из базовой резервной копии и восстановления на определенный момент времени), все счетчики статистики сбрасываются.


Просмотр статистики

Для отображения текущего состояния системы имеется несколько предопределенных представлений, перечисленных в Таблице 1. Кроме того, имеется несколько других представлений, перечисленных в Таблице 2, отображающих накопленную статистику. В качестве альтернативы с помощью нижележащих функций накопительной статистики можно создавать собственные представления, как описано в подразделе Функции статистики.

При использовании представлений и функций накопительной статистики для мониторинга собранных данных важно понимать, что информация обновляется не мгновенно. Каждый отдельный процесс сервера сбрасывает накопленную статистику в разделяемую память непосредственно перед тем, как перейти в режим ожидания, но не чаще одного раза в PGSTAT_MIN_INTERVAL миллисекунд (1 секунда, если значение переменной не было изменено при сборке сервера); поэтому запрос или транзакция, которые все еще находятся в процессе выполнения, не влияют на отображаемые статистические данные, а отображаемая информация отстает от фактической активности. Однако информация о текущем запросе, собираемая с параметром track_activities, всегда актуальна.

Другим важным моментом является то, что когда у серверного процесса запрашивают отображение накопленной статистики, в конфигурации по умолчанию запрашиваемые значения кэшируются до окончания текущей транзакции. Таким образом, статистическая информация не изменится, пока выполняется текущая транзакция. Точно так же собирается информация о текущих запросах всех сеансов, когда она запрашивается в рамках транзакции, и эта же информация будет отображаться в течение всей транзакции. Это особенность, а не дефект, поскольку она позволяет выполнять несколько запросов статистических данных и сопоставлять результаты, не беспокоясь о том, что цифры за кадром меняются. При интерактивном анализе статистики или выполнении высокозатратных запросов задержка между обращениями к отдельным статистическим данным может привести к значительной погрешности в кэшируемой статистике. Установив в параметре stats_fetch_consistency значение snapshot, можно минимизировать эту погрешность ценой увеличения использования памяти для кэширования ненужных статистических данных. И наоборот, если известно, что обращения к статистике единичны, в кэшировании статистики, к которой уже обращались, нет необходимости, и его можно избежать, установив в stats_fetch_consistency значение none. Также можно вызвать функцию pg_stat_clear_snapshot(), которая сбросит снимок статистики или кэшируемые значения (если таковые имеются) текущей транзакции. При следующем обращении к статистической информации будет получен новый снимок (в режиме снимка) или запрошенная статистика сохранится в кэше (в режиме кэширования).

Кроме того, транзакция может видеть свою собственную статистику (пока еще не сброшенную в разделяемую память) в представлениях pg_stat_xact_all_tables, pg_stat_xact_sys_tables, pg_stat_xact_user_tables и pg_stat_xact_user_functions. Эти данные ведут себя не так, как описано выше; напротив, они постоянно обновляются на протяжении всей транзакции.

Некоторая информация в представлениях динамической статистики, показанных в Таблице 1, имеет ограничения по безопасности. Обычные пользователи могут видеть только всю информацию о своих собственных сеансах (сеансах, принадлежащих роли, членами которой они являются). В строках о других сеансах многие столбцы будут содержать NULL. Однако обратите внимание, что существование сеанса и его общие свойства, такие как пользователь сеанса и база данных, видны всем пользователям. Суперпользователи и члены встроенной роли pg_read_all_stats (см. также раздел Предопределенные роли) могут видеть всю информацию обо всех сеансах.

Таблица 1. Представления динамической статистики

Имя представленияОписание
pg_stat_activityПо одной строке для каждого серверного процесса, отображающей информацию, связанную с текущей активностью этого процесса, например состояние и текущий запрос. Подробную информацию см. в справке по pg_stat_activity.
pg_stat_replicationПо одной строке для каждого процесса отправителя WAL, отображающей статистику по репликации на подключенном резервном сервере этого отправителя. Подробную информацию см. в справке по pg_stat_replication.
pg_stat_wal_receiverТолько одна строка, отображающая статистику о получателе WAL с подключенного сервера этого получателя. Подробную информацию см. в справке по pg_stat_wal_receiver.
pg_stat_recovery_prefetchТолько одна строка, отображающая статистику о блоках, предварительно извлеченных во время восстановления Подробную информацию см. в справке по pg_stat_recovery_prefetch.
pg_stat_subscriptionКак минимум по одной строке для каждой подписки, отображающей информацию о рабочих процессах подписки. Подробную информацию см. в справке по pg_stat_subscription.
pg_stat_sslПо одной строке для каждого подключения (обычного и реплицирующего), отображающей информацию о SSL, используемом для этого соединения. Подробную информацию см. в справке по pg_stat_ssl.
pg_stat_gssapiПо одной строке для каждого подключения (обычного и реплицирующего), отображающей информацию об аутентификации и шифровании GSSAPI, используемых в этом соединении. Подробную информацию см. в справке по pg_stat_gssapi.
pg_stat_progress_analyzeПо одной строке, отображающей текущий прогресс, для каждого обслуживающего процесса (включая рабочие процессы «Автовакуум»), в котором выполняется ANALYZE. См. подраздел Отчет о ходе выполнения ANALYZE.
pg_stat_progress_create_indexПо одной строке, отображающей текущий прогресс, для каждого обслуживающего процесса, в котором выполняется CREATE INDEX или REINDEX. См. подраздел Отчет о ходе выполнения CREATE INDEX.
pg_stat_progress_vacuumПо одной строке, отображающей текущий прогресс, для каждого обслуживающего процесса (включая рабочие процессы «Автовакуум»), в котором выполняется VACUUM. См. подраздел Отчет о ходе выполнения VACUUM.
pg_stat_progress_clusterПо одной строке, отображающей текущий прогресс, для каждого обслуживающего процесса, в котором выполняется CLUSTER или VACUUM FULL. См. подраздел Отчет о ходе выполнения CLUSTER.
pg_stat_progress_basebackupПо одной строке, отображающей текущий прогресс, для каждого процесса отправителя WAL, поточно передающего базовую копию. См. подраздел Отчет о ходе выполнения базового резервного копирования.
pg_stat_progress_copyПо одной строке, отображающей текущий прогресс, для каждого обслуживающего процесса, в котором выполняется COPY. См. подраздел Отчет о ходе выполнения COPY.

Таблица 2. Представления собранной статистики

Имя представленияОписание
pg_stat_archiverТолько одна строка, отображающая статистику о работе процесса архиватора WAL. Подробную информацию см. в справке по pg_stat_archiver.
pg_stat_bgwriterТолько одна строка, отображающая статистику о работе фонового процесса записи. Подробную информацию см. в справке по pg_stat_bgwriter.
pg_stat_walТолько одна строка, отображающая статистику о работе WAL. Подробную информацию см. в справке по pg_stat_wal.
pg_stat_databaseПо одной строке на каждую базу данных, отображающей статистику на уровне базы данных. Подробную информацию см. в справке по pg_stat_database.
pg_stat_database_conflictsПо одной строке на каждую базу данных, отображающей статистику на уровне базы данных по отменам запросов из-за конфликта с восстановлением на резервных серверах. Подробную информацию см. в справке по pg_stat_database_conflicts.
pg_stat_all_tablesПо одной строке для каждой таблицы в текущей базе данных, отображающей статистику обращений к этой конкретной таблице. Подробную информацию см. в справке по pg_stat_all_tables.
pg_stat_sys_tablesТо же, что и pg_stat_all_tables, за исключением того, что отображаются только системные таблицы.
pg_stat_user_tablesТо же, что и pg_stat_all_tables, за исключением того, что отображаются только пользовательские таблицы.
pg_stat_xact_all_tablesПохоже на pg_stat_all_tables, но подсчитывает действия, совершенные к настоящему моменту в текущей транзакции (которые еще не включены в pg_stat_all_tables и связанные представления). Столбцы с количеством активных и неиспользуемых строк, а также с данными по операциям очистки и анализа в этом представлении отсутствуют.
pg_stat_xact_sys_tablesТо же, что и pg_stat_xact_all_tables, за исключением того, что отображаются только системные таблицы.
pg_stat_xact_user_tablesТо же, что и pg_stat_xact_all_tables, за исключением того, что отображаются только пользовательские таблицы.
pg_stat_all_indexesПо одной строке для каждого индекса в текущей базе данных, отображающей статистику обращений к этому конкретному индексу. Подробную информацию см. в справке по pg_stat_all_indexes.
pg_stat_sys_indexesТо же, что и pg_stat_all_indexes, за исключением того, что отображаются только индексы по системным таблицам.
pg_stat_user_indexesТо же, что и pg_stat_all_indexes, за исключением того, что отображаются только индексы по пользовательским таблицам.
pg_statio_all_tablesПо одной строке для каждой таблицы в текущей базе данных, отображающей статистику операций ввода/вывода для этой конкретной таблицы. Подробную информацию см. в справке по pg_statio_all_tables.
pg_statio_sys_tablesТо же, что и pg_statio_all_tables, за исключением того, что отображаются только системные таблицы.
pg_statio_user_tablesТо же, что и pg_statio_all_tables, за исключением того, что отображаются только пользовательские таблицы.
pg_statio_all_indexesПо одной строке для каждого индекса в текущей базе данных, отображающей статистику операций ввода/вывода для этого конкретного индекса. Подробную информацию см. в справке по pg_statio_all_indexes.
pg_statio_sys_indexesТо же, что и pg_statio_all_indexes, за исключением того, что отображаются только индексы по системным таблицам.
pg_statio_user_indexesТо же, что и pg_statio_all_indexes, за исключением того, что отображаются только индексы по пользовательским таблицам.
pg_statio_all_sequencesПо одной строке для каждой последовательности в текущей базе данных, отображающей статистику операций ввода/вывода для этой конкретной последовательности. Подробную информацию см. в справке по pg_statio_all_sequences.
pg_statio_sys_sequencesТо же, что и pg_statio_all_sequences, за исключением того, что отображаются только системные последовательности. (В настоящее время системные последовательности не определены, поэтому это представление всегда пусто.)
pg_statio_user_sequencesТо же, что и pg_statio_all_sequences, за исключением того, что отображаются только пользовательские последовательности.
pg_stat_user_functionsПо одной строке для каждой отслеживаемой функции, отображающей статистику выполнения этой функции. Подробную информацию см. в справке по pg_stat_user_functions.
pg_stat_xact_user_functionsПохоже на pg_stat_user_functions, но подсчитывает только вызовы во время текущей транзакции (которые еще не включены в pg_stat_user_functions).
pg_stat_slruПо одной строке для каждого SLRU-кэша, отображающей статистику операций. Подробную информацию см. в справке по pg_stat_slru.
pg_stat_replication_slotsПо одной строке для каждого слота репликации, отображающей статистику по использованию этого слота. Подробную информацию см. в справке по pg_stat_replication_slots.
pg_stat_subscription_statsПо одной строке для каждой подписки, отображающей статистику по ошибкам. Подробную информацию см. в справке по pg_stat_subscription_stats.

Статистика по каждому индексу особенно полезна для определения того, какие индексы используются и насколько они эффективны.

Представления pg_statio_ в первую очередь полезны для определения эффективности буферного кэша. Когда количество фактических операций чтения с диска гораздо меньше числа обращений к буферу, кэш удовлетворяет большинству запросов на чтение без вызова ядра. Однако эти статистические данные не дают полной картины: по причине способа, которым QHB обрабатывает дисковый ввод/вывод, данные, которых нет в буферном кэше QHB, могут по-прежнему находиться в кэше ввода/вывода ядра и поэтому все еще могут извлекаться без необходимости физического чтения. Пользователям, заинтересованным в получении более подробной информации о поведении ввода/вывода QHB, рекомендуется использовать сборщик статистики QHB в сочетании с утилитами операционной системы, позволяющими лучше понять, как ядро обрабатывает ввод/вывод.


pg_stat_activity

В представлении pg_stat_activity для каждого серверного процесса будет находиться по одной строке, отображающей информацию, касающуюся текущей активности этого процесса.

Таблица 3. Представление pg_stat_activity

Столбец Тип
Описание
datid oid
OID базы данных, к которой подключен этот обслуживающий процесс
datname name
Имя базы данных, к которой подключен этот обслуживающий процесс
pid integer
PID этого обслуживающего процесса
leader_pid integer
PID ведущего процесса параллельной группы, если этот процесс является рабочим процессом параллельного запроса. NULL, если этот процесс является ведущим процессом параллельной группы или не участвует в параллельном запросе.
usesysid oid
OID пользователя, подсоединившегося к этому обслуживающему процессу
usename name
Имя пользователя, подсоединившегося к этому обслуживающему процессу
application_name text
Имя приложения, подключенного к этому обслуживающему процессу
client_addr inet
IP-адрес клиента, подключенного к этому обслуживающему процессу. Если данное поле равно NULL, это показывает, что клиент подключен через сокет домена Unix на компьютере сервера или что это внутренний процесс, например процесс «Автовакуум».
client_hostname text
Имя хоста подключенного клиента, получаемое обратным поиском в DNS по client_addr. Это поле будет отлично от NULL только для IP-соединений и только когда включен параметр log_hostname.
client_port integer
Номер TCP-порта, который клиент использует для взаимодействия с этим обслуживающим процессом, или -1, если используется сокет домена Unix. Если данное поле равно NULL, это показывает, что это внутренний серверный процесс.
backend_start timestamp with time zone
Время запуска этого процесса. Для обслуживающих процессов клиента это время подключения клиента к серверу.
xact_start timestamp with time zone
Время начала текущей транзакции этого процесса или NULL, если активная транзакция отсутствует. Если текущий запрос является первым в своей транзакции, значение в этом столбце равно значению столбца query_start.
query_start timestamp with time zone
Время запуска текущего активного запроса или, если значение state не active, то время запуска последнего запроса
state_change timestamp with time zone
Время последнего изменения поля state
wait_event_type text
Тип события, которого ждет обслуживающий процесс, если таковое ожидание имеется; в противном случае NULL. См. Таблицу 4.
wait_event text
Имя ожидаемого события, если обслуживающий процесс в настоящий момент находится в ожидании, в противном случае NULL. См. с Таблицы 5 по Таблицу 13.
state text
Общее текущее состояние этого обслуживающего процесса. Возможные значения:
  • active: Обслуживающий процесс выполняет запрос.
  • idle: Обслуживающий процесс ожидает новой команды от клиента.
  • idle in transaction: Обслуживающий процесс находится внутри транзакции, но в настоящее время не выполняет запрос.
  • idle in transaction (aborted): Этот состояние схоже с idle in transaction, за исключением того, что один из операторов в транзакции вызвал ошибку.
  • fastpath function call: Обслуживающий процесс выполняет функцию по быстрому пути (fast-path).
  • disabled: Это состояние отображается, если в этом обслуживающем процессе отключен параметр track_activities.
backend_xid xid
Идентификатор транзакции верхнего уровня этого серверного процесса, если таковая имеется.
backend_xmin xid
Граница xmin текущего обслуживающего процесса.
query_id bigint
Идентификатор последнего запроса этого обслуживающего процесса. Если state имеет значение active, в этом поле отображается идентификатор запроса, выполняемого в настоящий момент. При всех остальных состояниях в нем отображается идентификатор последнего выполненного запроса. По умолчанию идентификаторы запросов не вычисляются, поэтому если не включен параметр compute_query_id или не сконфигурирован сторонний модуль, вычисляющий идентификаторы запросов, данное поле будет равно NULL.
query text
Текст последнего запроса этого обслуживающего процесса. Если state имеет значение active, в этом поле отображается запрос, выполняемый в настоящий момент. При всех остальных состояниях в нем отображается последний выполненный запрос. По умолчанию текст запроса усекается до 1024 байт; это значение можно изменить с помощью параметра track_activity_query_size.
backend_type text
Тип текущего обслуживающего процесса. Возможные типы: autovacuum launcher, autovacuum worker, logical replication launcher, logical replication worker, parallel worker, background writer, client backend, checkpointer, archiver, startup, walreceiver, walsender и walwriter. Кроме того, у фоновых рабочих процессов, регистрируемых расширениями, могут быть дополнительные типы.

Примечание
Столбцы wait_event и state независимы друг от друга. Если обслуживающий процесс находится в активном состоянии (active), он может ожидать (waiting) какое-нибудь событие или не ожидать никакое. Если состояние active и поле wait_event не равно NULL, это означает, что запрос выполняется, но заблокирован где-то в системе.

Таблица 4. Типы событий ожидания

Тип события ожиданияОписание
ActivityСерверный процесс бездействует. Этот тип события показывает, что процесс ожидает активности в своем основном цикле обработки. В wait_event будет указана конкретная точка ожидания; см. Таблицу 5.
BufferPinСерверный процесс ожидает эксклюзивного доступа к буферу данных. Ожидание закрепления буфера может затянуться, если другой процесс удерживает открытый курсор, который последним читал данные из указанного буфера. См. Таблицу 6.
ClientСерверный процесс ожидает активность в сокете, подключенном к пользовательскому приложению. Таким образом, сервер ожидает, что произойдет событие, не зависящее от его внутренних процессов. В wait_event будет указана конкретная точка ожидания; см. Таблицу 7.
ExtensionСерверный процесс ожидает некоторого условия, определяемого модулем расширения. См. Таблицу 8.
IOСерверный процесс ожидает завершения операции ввода/вывода. В wait_event будет указана конкретная точка ожидания; см. Таблицу 9.
IPCСерверный процесс ожидает некоторого взаимодействия с другим серверным процессом. В wait_event будет указана конкретная точка ожидания; см. Таблицу 10.
LockСерверный процесс ожидает тяжелую блокировку. Тяжелые блокировки, также известные как блокировки менеджера блокировок или просто блокировки, в основном защищают видимые SQL объекта, например, таблицы. Однако они также используются для обеспечения взаимного исключения некоторых внутренних операций, например, расширения отношений. В wait_event будет указан тип ожидаемой блокировки; см. Таблицу 11.
LWLockСерверный процесс ожидает легкую блокировку. Большинство таких блокировок защищают конкретные структуры данных в разделяемой памяти. В wait_event будет содержаться имя, указывающее на цель этой легкой блокировки. (Некоторые блокировки имеют особые имена; другие являются частью группы блокировок с похожим предназначением.) См. Таблицу 12.
TimeoutСерверный процесс ожидает истечения тайм-аута. В wait_event будет указана конкретная точка ожидания; см. Таблицу 13.

Таблица 5. События ожидания типа Activity

Событие ожидания ActivityОписание
ArchiverMainОжидание в основном цикле процесса архиватора.
AutoVacuumMainОжидание в основном цикле процесса запуска автовакуума.
BgWriterHibernateОжидание в фоновом процессе записи, переход в спящий режим.
BgWriterMainОжидание в основном цикле фонового процесса записи.
CheckpointerMainОжидание в основном цикле процесса контрольной точки.
LogicalApplyMainОжидание в основном цикле процесса применения логической репликации.
LogicalLauncherMainОжидание в основном цикле процесса запуска логической репликации.
RecoveryWalStreamОжидание поступления WAL в основном цикле процесса запуска во время потокового восстановления.
SysLoggerMainОжидание в основном цикле процесса системного журнала (syslogger).
WalReceiverMainОжидание в основном цикле процесса-получателя WAL.
WalSenderMainОжидание в основном цикле процесса-отправителя WAL.
WalWriterMainОжидание в основном цикле процесса записи WAL.

Таблица 6. События ожидания типа BufferPin

Событие ожидания BufferPinОписание
BufferPinОжидание при получении эксклюзивного закрепления буфера.

Таблица 7. События ожидания типа Client

Событие ожидания ClientОписание
ClientReadОжидание при чтении данных, получаемых от клиента.
ClientWriteОжидание при записи данных, передаваемых клиенту.
GSSOpenServerОжидание при чтении данных, получаемых от клиента, при установлении сеанса GSSAPI.
LibPQWalReceiverConnectОжидание в получателе WAL при установлении подключения к удаленному серверу.
LibPQWalReceiverReceiveОжидание в получателе WAL при получении данных от удаленного сервера.
SSLOpenServerОжидание SSL при попытке подключения.
WalSenderWaitForWALОжидание сброса WAL на диск в процессе-отправителе WAL.
WalSenderWriteDataОжидание какой-либо активности при обработке ответов от получателя WAL в процессе-отправителе WAL.

Таблица 8. События ожидания типа Extension

Событие ожидания ExtensionОписание
ExtensionОжидание в расширении.

Таблица 9. События ожидания типа IO

Событие ожидания IOОписание
BaseBackupReadОжидание чтения базовой резервной копии из файла.
BaseBackupSyncОжидание помещения данных, записанных процессом базового резервного копирования, в надежное хранилище.
BaseBackupWriteОжидание записи базовой резервной копии в файл.
BufFileReadОжидание чтения из буферизованного файла.
BufFileWriteОжидание записи в буферизованный файл.
BufFileTruncateОжидание усечения буферизованного файла.
ControlFileReadОжидание чтения из файла pg_control.
ControlFileSyncОжидание помещения файла pg_control в долговременное хранилище.
ControlFileSyncUpdateОжидание помещения изменений файла pg_control в долговременное хранилище.
ControlFileWriteОжидание записи в файл pg_control.
ControlFileWriteUpdateОжидание записи изменения файла pg_control.
CopyFileReadОжидание чтения во время операции копирования файла.
CopyFileWriteОжидание записи во время операции копирования файла.
DSMFillZeroWriteОжидание заполнения нулями поддерживающего файла динамической разделяемой памяти.
DataFileExtendОжидание расширения файла данных отношения.
DataFileFlushОжидание помещения файла данных отношения в долговременное хранилище.
DataFileImmediateSyncОжидание немедленной синхронизации файла данных отношения с долговременным хранилищем.
DataFilePrefetchОжидание асинхронной предварительной выборки из файла данных отношения.
DataFileReadОжидание чтения из файла данных отношения.
DataFileSyncОжидание помещения изменений файла данных отношения в долговременное хранилище.
DataFileTruncateОжидание усечения файла данных отношения.
DataFileWriteОжидание записи в файл данных отношения.
LockFileAddToDataDirReadОжидание чтения при добавлении строки в файл блокировки каталога данных.
LockFileAddToDataDirSyncОжидание помещения данных в долговременное хранилище при добавлении строки в файл блокировки каталога данных.
LockFileAddToDataDirWriteОжидание записи при добавлении строки в файл блокировки каталога данных.
LockFileCreateReadОжидание чтения при создании файла блокировки каталога данных.
LockFileCreateSyncОжидание помещения данных в долговременное хранилище при создании файла блокировки каталога данных.
LockFileCreateWriteОжидание записи при создании файла блокировки каталога данных.
LockFileReCheckDataDirReadОжидание чтения во время повторной проверки файла блокировки каталога данных.
LogicalRewriteCheckpointSyncОжидание помещения сопоставлений логической перезаписи в долговременное хранилище во время контрольной точки.
LogicalRewriteMappingSyncОжидание помещения данных сопоставлений в долговременное хранилище во время логической перезаписи.
LogicalRewriteMappingWriteОжидание записи данных сопоставлений во время логической перезаписи.
LogicalRewriteSyncОжидание помещения сопоставлений логической перезаписи в долговременное хранилище.
LogicalRewriteTruncateОжидание усечения данных сопоставлений во время логической перезаписи.
LogicalRewriteWriteОжидание записи сопоставлений логической перезаписи.
RelationMapReadОжидание чтения из файла карты отношений.
RelationMapSyncОжидание помещения файла карты отношений в долговременное хранилище.
RelationMapWriteОжидание записи в файл карты отношений.
ReorderBufferReadОжидание чтения во время работы с буфером переупорядочивания.
ReorderBufferWriteОжидание записи во время работы с буфером переупорядочивания.
ReorderLogicalMappingReadОжидание чтения логического сопоставления во время работы с буфером переупорядочивания.
ReplicationSlotReadОжидание чтения из управляющего файла слота репликации.
ReplicationSlotRestoreSyncОжидание помещения управляющего файла слота репликации в долговременное хранилище при восстановлении его в памяти.
ReplicationSlotSyncОжидание помещения управляющего файла слота репликации в долговременное хранилище.
ReplicationSlotWriteОжидание записи в управляющий файл слота репликации.
SLRUFlushSyncОжидание помещения данных SLRU в долговременное хранилище во время контрольной точки или выключения базы данных.
SLRUReadОжидание чтения из страницы SLRU.
SLRUSyncОжидание помещения данных SLRU в долговременное хранилище после записи страницы.
SLRUWriteОжидание записи на страницу SLRU.
SnapbuildReadОжидание чтения сериализованного исторического снимка каталога.
SnapbuildSyncОжидание помещения сериализованного исторического снимка каталога в долговременное хранилище.
SnapbuildWriteОжидание записи сериализованного исторического снимка каталога.
TimelineHistoryFileSyncОжидание помещения файла истории временной шкалы, полученного посредством потоковой репликации, в долговременное хранилище.
TimelineHistoryFileWriteОжидание записи в файл истории временной шкалы, полученного посредством потоковой репликации.
TimelineHistoryReadОжидание чтения из файла истории временной шкалы.
TimelineHistorySyncОжидание помещения только что созданного файла истории временной шкалы в долговременное хранилище.
TimelineHistoryWriteОжидание записи в только что созданный файл истории временной шкалы.
TwophaseFileReadОжидание чтения из файла двухфазного состояния.
TwophaseFileSyncОжидание помещения файла двухфазного состояния в долговременное хранилище.
TwophaseFileWriteОжидание записи в файл двухфазного состояния.
VersionFileWriteОжидание записи файла версии во время создания базы данных.
WALBootstrapSyncОжидание помещения WAL в долговременное хранилище во время начальной загрузки.
WALBootstrapWriteОжидание записи в WAL во время начальной загрузки.
WALCopyReadОжидание чтения при создании нового сегмента WAL путем копирования существующего.
WALCopySyncОжидание помещения нового сегмента WAL, созданного путем копирования существующего, в долговременное хранилище.
WALCopyWriteОжидание записи при создании нового сегмента WAL путем копирования существующего.
WALInitSyncОжидание помещения только что инициализированного файла WAL в долговременное хранилище.
WALInitWriteОжидание записи при инициализации нового файла WAL.
WALReadОжидание чтения из файла WAL.
WALSenderTimelineHistoryReadОжидание чтения из файла истории временной шкалы во время обработки команды временной шкалы процессом-отправителем WAL.
WALSyncОжидание помещения файла WAL в долговременное хранилище.
WALSyncMethodAssignОжидание помещения данных в долговременное хранилище при назначении нового метода синхронизации WAL.
WALWriteОжидание записи в файл WAL.

Таблица 10. События ожидания типа IPC

Событие ожидания IPCОписание
AppendReadyОжидание готовности вложенных узлов планового узла Append.
ArchiveCleanupCommandОжидание завершения archive_cleanup_command.
ArchiveCommandОжидание завершения archive_command.
BackendTerminationОжидание завершения другого обслуживающего процесса.
BackupWaitWalArchiveОжидание файлов WAL, необходимых для успешного архивирования резервной копии.
BgWorkerShutdownОжидание завершения фонового рабочего процесса.
BgWorkerStartupОжидание запуска фонового рабочего процесса.
BtreePageОжидание доступности номера страницы, необходимого для продолжения параллельного сканирования B-дерева.
BufferIOОжидание завершения буферного ввода/вывода.
CheckpointDoneОжидание завершения контрольной точки.
CheckpointStartОжидание запуска контрольной точки.
ExecuteGatherОжидание активности от дочернего процесса при выполнении планового узла Gather.
HashBatchAllocateОжидание выделения хеш-таблицы выбранным участником параллельного хеширования.
HashBatchElectОжидание при выборе участника параллельного хеширования для выделения хеш-таблицы.
HashBatchLoadОжидание завершения загрузки хеш-таблицы другими участниками параллельного хеширования.
HashBuildAllocateОжидание выделения начальной хеш-таблицы выбранным участником параллельного хеширования.
HashBuildElectОжидание при выборе участника параллельного хеширования для выделения начальной хеш-таблицы.
HashBuildHashInnerОжидание завершения хеширования внутреннего отношения другими участниками параллельного хеширования.
HashBuildHashOuterОжидание завершения хеширования внешнего отношения другими участниками параллельного хеширования.
HashGrowBatchesAllocateОжидание выделения дополнительных пакетов выбранным участником параллельного хеширования.
HashGrowBatchesDecideОжидание при выборе участника параллельного хеширования для принятия решения о предстоящем увеличении числа пакетов.
HashGrowBatchesElectОжидание при выборе участника параллельного хеширования для выделения дополнительных пакетов.
HashGrowBatchesFinishОжидание принятия решения о предстоящем увеличении числа пакетов выбранным участником параллельного хеширования.
HashGrowBatchesRepartitionОжидание завершения повторного партиционирования другими участниками параллельного хеширования.
HashGrowBucketsAllocateОжидание завершения выделения дополнительных блоков выбранным участником параллельного хеширования.
HashGrowBucketsElectОжидание при выборе участника параллельного хеширования для выделения дополнительных блоков.
HashGrowBucketsReinsertОжидание завершения добавления кортежей в новые блоки другими участниками параллельного хеширования.
LogicalSyncDataОжидание передачи данных для начальной синхронизации таблиц удаленным сервером логической репликации.
LogicalSyncStateChangeОжидание изменения состояния удаленного сервера логической репликации.
MessageQueueInternalОжидание присоединения другого процесса к общей очереди сообщений.
MessageQueuePutMessageОжидание при записи сообщения протокола в общую очередь сообщений.
MessageQueueReceiveОжидание при получении байтов из общей очереди сообщений.
MessageQueueSendОжидание при передаче байтов в общую очередь сообщений.
ParallelBitmapScanОжидание инициализации параллельного сканирования по битовой карте.
ParallelCreateIndexScanОжидание завершения сканирования кучи параллельными рабочими процессами CREATE INDEX.
ParallelFinishОжидание завершения вычислений параллельными рабочими процессами.
ProcArrayGroupUpdateОжидание обнуления идентификатора транзакции ведущим процессом группы в конце параллельной операции.
ProcSignalBarrierОжидание обработки события барьера всеми обслуживающими процессами.
PromoteОжидание повышения резервного сервера.
RecoveryConflictSnapshotОжидание разрешения конфликта восстановления для проведения очистки.
RecoveryConflictTablespaceОжидание разрешения конфликта восстановления для удаления табличного пространства.
RecoveryEndCommandОжидание завершения recovery_end_command.
RecoveryPauseОжидание возобновления восстановления.
ReplicationOriginDropОжидание перехода источника репликации в неактивное состояние, чтобы его можно было удалить.
ReplicationSlotDropОжидание перехода слота репликации в неактивное состояние, чтобы его можно было удалить.
RestoreCommandОжидание завершения restore_command.
SafeSnapshotОжидание при получении допустимого снимка для транзакции READ ONLY DEFERRABLE.
SyncRepОжидание подтверждения от удаленного сервера во время синхронной репликации.
WalReceiverExitОжидание завершения процесса-получателя WAL.
WalReceiverWaitStartОжидание передачи процессом запуска начальных данных для потоковой репликации.
XactGroupUpdateОжидание изменения состояния транзакции ведущим процессом группы в конце параллельной операции.

Таблица 11. События ожидания типа Lock

Событие ожидания LockОписание
advisoryОжидание при получении рекомендательной пользовательской блокировки.
extendОжидание при расширении отношения.
frozenidОжидание при изменении полей pg_database.datfrozenxid и pg_database.datminmxid.
objectОжидание при получении блокировки для нереляционного объекта базы данных.
pageОжидание при получении блокировки для страницы отношения.
relationОжидание при получении блокировки для отношения.
spectokenОжидание при получении блокировки спекулятивного добавления.
transactionidОжидание завершения транзакции.
tupleОжидание при получении блокировки для кортежа.
userlockОжидание при получении пользовательской блокировки.
virtualxidОжидание при получении блокировки виртуального идентификатора транзакции.

Таблица 12. События ожидания типа LWLock

Событие ожидания LWLockОписание
AddinShmemInitОжидание при обработке выделения области в разделяемой памяти для расширений.
AutoFileОжидание при изменении файла qhb.auto.conf.
AutovacuumОжидание при чтении или изменении текущего состояния рабочих процессов автовакуума.
AutovacuumScheduleОжидание при подтверждении, что таблице, выбранной для автоочистки, все еще необходима очистка.
BackgroundWorkerОжидание при чтении или изменении состояния фонового рабочего процесса.
BtreeVacuumОжидание при чтении или изменении информации, связанной с очисткой, для индекса B-дерева.
BufferContentОжидание при обращении к странице данных в памяти.
BufferMappingОжидание при связывании блока данных с буфером в пуле буферов.
CheckpointerCommОжидание при обработке запросов fsync.
CommitTsОжидание при чтении или записи последнего значения, установленного для времени фиксирования транзакции.
CommitTsBufferОжидание ввода/вывода с SLRU-буфером данных о времени фиксирования.
CommitTsSLRUОжидание при обращении к SLRU-кэшу данных о времени фиксирования.
ControlFileОжидание при чтении или изменении файла pg_control или создании нового файла WAL.
DynamicSharedMemoryControlОжидание при чтении или изменении информации о выделении динамической разделяемой памяти.
LockFastPathОжидание при чтении или изменении информации процесса о блокировке по быстрому пути.
LockManagerОжидание при чтении или изменении информации о «тяжелых» блокировках.
LogicalRepWorkerОжидание при чтении или изменении состояния рабочих процессов логической репликации.
MultiXactGenОжидание при чтении или изменении общего состояния мультитранзакций.
MultiXactMemberBufferОжидание ввода/вывода с SLRU-буфером данных о членах мультитранзакций.
MultiXactMemberSLRUОжидание при обращении к SLRU-кэшу данных о членах мультитранзакций.
MultiXactOffsetBufferОжидание ввода/вывода с SLRU-буфером данных о смещениях мультитранзакций.
MultiXactOffsetSLRUОжидание при обращении к SLRU-кэшу данных о смещениях мультитранзакций.
MultiXactTruncationОжидание при чтении или усечении информации мультитранзакции.
NotifyBufferОжидание ввода/вывода с SLRU-буфером сообщений NOTIFY.
NotifyQueueОжидание при чтении или изменении сообщений NOTIFY.
NotifyQueueTailОжидание изменения границы хранилища сообщений NOTIFY.
NotifySLRUОжидание при обращении к SLRU-кэшу сообщений NOTIFY.
OidGenОжидание при выделении нового OID.
OldSnapshotTimeMapОжидание при чтении или изменении информации по управлению старым снимком.
ParallelAppendОжидание при выборе следующего подплана во время выполнения плана параллельного добавления (Parallel Append).
ParallelHashJoinОжидание при синхронизации рабочих процессов во время выполнения плана параллельного соединения по хешу (Parallel Hash Join).
ParallelQueryDSAОжидание выделения динамической разделяемой памяти для параллельного запроса.
PerSessionDSAОжидание выделения динамической разделяемой памяти для параллельного запроса.
PerSessionRecordTypeОжидание при обращении к информации параллельного запроса о составных типах.
PerSessionRecordTypmodОжидание при обращении к информации параллельного запроса о модификаторах типа, определяющих типы анонимных записей.
PerXactPredicateListОжидание при обращении к списку предикатных блокировок, удерживаемых текущей сериализуемой транзакцией, во время параллельного запроса.
PredicateLockManagerОжидание при обращении к информации о предикатных блокировках, используемых сериализуемыми транзакциями.
ProcArrayОжидание при обращении к общим структурам данных в рамках процесса (обычно при получении снимка или отображении идентификатора транзакции в сеансе).
RelationMappingОжидание при чтении или изменении файла pg_filenode.map (используемого для отслеживания назначений файловых узлов определенных системных каталогов).
RelCacheInitОжидание при чтении или изменении файла инициализации кэша отношения (pg_internal.init).
ReplicationOriginОжидание при создании, удалении или использовании источника репликации.
ReplicationOriginStateОжидание при чтении или изменении состояния одного источника репликации.
ReplicationSlotAllocationОжидание при выделении или освобождении слота репликации.
ReplicationSlotControlОжидание при чтении или изменении состояния слота репликации.
ReplicationSlotIOОжидание ввода/вывода со слотом репликации.
SerialBufferОжидание ввода/вывода с SLRU-буфером данных о конфликтах сериализуемых транзакций.
SerializableFinishedListОжидание при обращении к списку завершенных сериализуемых транзакций.
SerializablePredicateListОжидание при обращении к списку предикатных блокировок, удерживаемых сериализуемыми транзакциями.
PgStatsDSAОжидание выделения динамической разделяемой памяти для статистики.
PgStatsHashОжидание доступа к хеш-таблице в разделяемой памяти.
PgStatsDataОжидание доступа к данным статистики в разделяемой памяти.
SerializableXactHashОжидание при чтении или изменении информации о сериализуемых транзакциях.
SerialSLRUОжидание при обращении к SLRU-кэшу данных о конфликтах сериализуемых транзакций.
SharedTidBitmapОжидание при обращении к разделяемой битовой карте TID во время параллельного сканирования индекса по битовой карте.
SharedTupleStoreОжидание при обращении к разделяемому хранилищу кортежей во время параллельного запроса.
ShmemIndexОжидание при поиске или выделении области в разделяемой памяти.
SInvalReadОжидание при получении сообщений из общей очереди сообщений аннулирования каталогов.
SInvalWriteОжидание при добавлении сообщения в общую очередь сообщений аннулирования каталогов.
SubtransBufferОжидание ввода-вывода с SLRU-буфером данных о субтранзакциях.
SubtransSLRUОжидание при обращении к к SLRU-кэшу данных о субтранзакциях.
SyncRepОжидание при чтении или записи информации о состоянии синхронной репликации.
SyncScanОжидание при выборе начального положения для синхронизированного сканирования таблицы.
TablespaceCreateОжидание при создании или удалении табличного пространства.
TwoPhaseStateОжидание при чтении или записи состояния подготовленных транзакций.
WALBufMappingОжидание при замене страницы в буферах WAL.
WALInsertОжидание при добавлении данных WAL в буфер памяти.
WALWriteОжидание записи буферов WAL на диск.
WrapLimitsVacuumОжидание при изменении пределов потребления идентификаторов транзакций и мультитранзакций.
XactBufferОжидание ввода/вывода с SLRU-буфером данных о статусе транзакций.
XactSLRUОжидание при обращении к SLRU-кэшу данных о статусе транзакций.
XactTruncationОжидание при выполнении pg_xact_status или изменении самого старого доступного ей идентификатора транзакции.
XidGenОжидание при выделении нового идентификатора транзакции.

Примечание
Расширения могут добавлять типы LWLock в список, приведенный в Таблице 12. В некоторых случаях имя, назначенное расширением, станет невидимым во всех серверных процессах; поэтому событие ожидания LWLock может отображаться с именем «extension», а не тем, что было назначено расширением.

Таблица 13. События ожидания типа Timeout

Событие ожидания TimeoutОписание
BaseBackupThrottleОжидание во время базового резервного копирования, когда ограничена активность.
CheckpointWriteDelayОжидание между операциями записи при выполнении контрольной точки.
PgSleepОжидание в результате вызова pg_sleep или родственной ей функции.
RecoveryApplyDelayОжидание при применении WAL во время восстановления вследствие установленной задержки.
RecoveryRetrieveRetryIntervalОжидание во время восстановления, когда данные WAL нельзя получить ни из какого источника (каталога pg_wal, архива или потока).
RegisterSyncRequestОжидание при передаче запросов синхронизации процессу контрольной точки вследствие переполнения очереди запросов.
VacuumDelayОжидание в точке задержки очистки по стоимости.
VacuumTruncateОжидание при получении эксклюзивной блокировки для усечения пустых страниц в конце очищаемой таблицы.

Вот пример того, как можно просмотреть события ожидания:

SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event is NOT NULL;
 pid  | wait_event_type | wait_event
------+-----------------+------------
 2540 | Lock            | relation
 6644 | LWLock          | ProcArray
(2 rows)

pg_stat_replication

Представление pg_stat_replication будет содержать для каждого процесса- отправителя WAL по одной строке, отображающей статистику по репликации на резервный сервер, к которому подключен этот отправитель. Перечисляются только резервные сервера, подключенные напрямую; информация о резервных серверах, подключенных опосредованно, не представлена.

Таблица 14. Представление pg_stat_replication

Столбец Тип
Описание
pid integer
PID процесса-отправителя WAL
usesysid oid
OID пользователя, подсоединившегося к этому процессу-отправителю WAL
usename name
Имя пользователя, подсоединившегося к этому процессу-отправителю WAL
application_name text
Имя приложения, подключенного к этому отправителю WAL
client_addr inet
IP-адрес клиента, подключенного к этому отправителю WAL. Если данное поле равно NULL, это показывает, что клиент подключен через сокет домена Unix на компьютере сервера.
client_hostname text
Имя хоста подключенного клиента, получаемое обратным поиском в DNS по client_addr. Это поле будет отлично от NULL только для IP-соединений и только когда включен параметр log_hostname.
client_port integer
Номер TCP-порта, который клиент использует для взаимодействия с этим отправителем WAL, или -1, если используется сокет домена Unix
backend_start timestamp with time zone
Время запуска этого процесса, т. е. время подключения клиента к этому отправителю WAL
backend_xmin xid
Граница xmin этого резервного сервера, отображаемая при включенном параметре hot_standby_feedback.
state text
Текущее состояние этого отправителя WAL. Возможные значения:
  • startup: Этот отправитель WAL запускается.
  • catchup: Резервный сервер, к которому подключен этот отправитель WAL, догоняет основной сервер.
  • streaming: Этот отправитель WAL передает в потоке изменения после того, как резервный сервер, к которому он подключен, догнал основной сервер.
  • backup: Этот отправитель WAL передает резервную копию.
  • stopping: Этот отправитель WAL останавливается.
sent_lsn pg_lsn
Последняя позиция в журнале упреждающей записи, переданная через это соединение
write_lsn pg_lsn
Последняя позиция в журнале упреждающей записи, записанная на диск этим резервным сервером
flush_lsn pg_lsn
Последняя позиция в журнале упреждающей записи, сброшенная на диск этим резервным сервером
replay_lsn pg_lsn
Последняя позиция в журнале упреждающей записи, воспроизведенная в базу данных с этого резервного сервера
write_lag interval
Время, прошедшее с момента локального сброса последних данных WAL до получения уведомления о том, что этот резервный сервер их записал (но еще не сбросил на диск и не применил). Это можно использовать для оценки задержки при фиксации, вызываемой установкой в параметре synchronous_commit уровня remote_write, если этот сервер был сконфигурирован как синхронный резервный.
flush_lag interval
Время, прошедшее с момента локального сброса последних данных WAL до получения уведомления о том, что этот резервный сервер их записал и сбросил на диск (но еще не применил). Это можно использовать для оценки задержки при фиксации, вызываемой установкой в параметре synchronous_commit уровня on, если этот сервер был сконфигурирован как синхронный резервный.
replay_lag interval
Время, прошедшее с момента локального сброса последних данных WAL до получения уведомления о том, что этот резервный сервер их записал, сбросил на диск и применил. Это можно использовать для оценки задержки при фиксации, вызываемой установкой в параметре synchronous_commit уровня remote_apply, если этот сервер был сконфигурирован как синхронный резервный.
sync_priority integer
Приоритет этого резервного сервера для выбора в качестве синхронного резервного сервера при синхронной репликации на основе приоритетов. Не влияет на синхронную репликацию на основе кворума.
sync_state text
Состояние синхронизации этого резервного сервера. Возможные значения:
  • async: Этот резервный сервер является асинхронным.
  • potential: Сейчас этот резервный сервер является асинхронным, но потенциально может стать синхронным, если откажет один из текущих синхронных серверов.
  • sync: Этот резервный сервер является синхронным.
  • quorum: Этот резервный сервер считается кандидатом в кворум резервных серверов.
reply_time timestamp with time zone
Время передачи последнего ответного сообщения, полученного от резервного сервера

Время задержки, отображаемое в представлении pg_stat_replication, включает в себя суммарное время, затраченное на запись, сброс и воспроизведение последних данных WAL, а также на то, чтобы отправитель узнал об этом. Эта длительность представляет задержку фиксирования, которая была (или должна была быть) добавлена каждым уровнем синхронного фиксирования, если удаленный сервер был сконфигурирован как синхронный резервный сервер. Для асинхронного резервного сервера столбец replay_lag приблизительно определяет задержку перед тем, как последние транзакции стали видимыми для запросов. Если резервный сервер полностью догнал передающий и активность WAL больше не наблюдается, последнее измеренное значение времени задержки будет отображаться еще в течение короткого времени, а затем сменится на NULL.

Время задержки для физической репликации определяется автоматически. Плагины логического декодирования могут не отправлять сообщения отслеживания; в этом случае механизм отслеживания просто отобразит задержку, равную NULL.

Примечание
Выводимые длительности задержки не предсказывают, сколько времени потребуется резервному серверу, чтобы догнать передающий сервер, исходя из текущей скорости воспроизведения. Такая система будет показывать схожие значения времени при генерировании новых данных WAL, но не при переходе передающего сервера в режим ожидания. В частности, когда резервный сервер полностью догоняет основной, pg_stat_replication показывает время, затраченное на запись, сброс на диск и воспроизведение самой последней переданной позиции WAL, а не ноль, как могут ожидать некоторые пользователи. Это соответствует целям измерения задержек синхронного фиксирования и видимости транзакций для недавних записанных транзакций. Чтобы меньше сбивать с толку пользователей, ожидающих другую модель задержек, значения столбцов задержек вскоре возвращаются в NULL в воспроизведшей все изменения простаивающей системе. Системы мониторинга должны выбрать, следует ли представлять это как отсутствующие данные или ноль или продолжать отображать последнее известное значение.


pg_stat_replication_slots

Представление pg_stat_replication_slots будет содержать для каждого слота логической репликации по одной строке, отображающей статистику его использования.

Таблица 15. Представление pg_stat_replication_slots

Столбец Тип
Описание
slot_name text
Уникальный на уровне кластера идентификатор для слота репликации
spill_txns bigint
Количество транзакций, вытесненных на диск после того, как объем памяти, используемый при логическом декодировании изменений из WAL, превысил logical_decoding_work_mem. Этот счетчик прирастает с учетом как транзакций верхнего уровня, так и субтранзакций.
spill_count bigint
Сколько раз транзакции были вытеснены на диск при декодировании изменений из WAL для этого слота. Этот счетчик прирастает каждый раз, когда транзакция вытесняется, и одна и та же транзакция может вытесняться несколько раз.
spill_bytes bigint
Объем декодированных транзакционных данных, вытесненных на диск при проведении декодирования изменений из WAL для этого слота. Этот и другие счетчики вытеснения можно использовать для оценки ввода/вывода, происходящего во время логического декодирования и настройки параметра logical_decoding_work_mem.
stream_txns bigint
Количество текущих транзакций, передаваемых в потоке в плагин вывода декодирования после того, как объем памяти, используемый для логического декодирования изменений из WAL для этого слота, превысил logical_decoding_work_mem. Потоковая передача работает только для транзакций верхнего уровня (субтранзакции не могут передаваться в потоке независимо), поэтому счетчик прирастает без учета субтранзакций.
stream_count bigint
Сколько раз текущие транзакции передавались в потоке плагину вывода декодирования при декодировании изменений из WAL для этого слота. Этот счетчик прирастает каждый раз, когда транзакция передается в потоке, и одна и та же транзакция может передаваться в потоке несколько раз.
stream_bytes bigint
Объем транзакционных данных, декодированных для передачи текущих транзакций в потоке в плагин вывода декодирования при декодировании изменений из WAL для этого слота. Этот и другие счетчики потоковой передачи для этого слота можно использовать для настройки параметра logical_decoding_work_mem.
total_txns bigint
Количество декодированных транзакций, отправленных в плагин вывода декодирования для этого слота. Считаются только транзакции верхнего уровня, но не субтранзакции. Обратите внимание, что сюда входят передаваемые в потоке и/или вытесняемые транзакции.
total_bytes bigint
Объем транзакционных данных, декодированных для отправки транзакций в плагин вывода декодирования при декодировании изменений из WAL для этого слота. Обратите внимание, что сюда входят передаваемые в потоке и/или вытесняемые данные.
stats_reset timestamp with time zone
Время последнего сброса этих статистических данных

pg_stat_wal_receiver

Представление pg_stat_wal_receiver будет содержать только одну строку, отображающую статистику по процессу-получателю WAL от сервера, к которому подключен этот получатель.

Таблица 16. Представление pg_stat_wal_receiver

Столбец Тип
Описание
pid integer
PID процесса-получателя WAL
status text
Статус активности процесса-получателя WAL
receive_start_lsn pg_lsn
Первая позиция в журнале упреждающей записи, использованная в момент запуска получателя WAL
receive_start_tli integer
Первый номер временной шкалы, использованный в момент запуска получателя WAL
written_lsn pg_lsn
Последняя позиция в журнале упреждающей записи, уже полученная и записанная на диск, но еще не сброшенная. Эту позицию не следует использовать для проверки целостности данных.
flushed_lsn pg_lsn
Последняя позиция в журнале упреждающей записи, уже полученная и сброшенная на диск; начальным значением этого поля будет первая позиция в журнале, использованная в момент запуска получателя WAL
received_tli integer
Номер временной шкалы последней позиции в журнале упреждающей записи, уже полученной и сброшенной на диск; начальным значением этого поля будет номер временной шкалы первой позиции в журнале, использованной в момент запуска получателя WAL
last_msg_send_time timestamp with time zone
Время передачи последнего сообщения, полученного от исходного отправителя WAL
last_msg_receipt_time timestamp with time zone
Время приема последнего сообщения, полученного от исходного отправителя WAL
latest_end_lsn pg_lsn
Последняя позиция в журнале упреждающей записи, сообщенная исходному отправителю WAL
latest_end_time timestamp with time zone
Время последней позиции в журнале упреждающей записи, сообщенной исходному отправителю WAL
slot_name text
Имя слота репликации, используемого этим получателем WAL
sender_host text
Хост экземпляра QHB, к которому подключен этот получатель WAL. Это может быть имя хоста, IP-адрес или путь каталога (если подключение установлено через сокет домена Unix). (Вариант с путем можно распознать, поскольку это всегда будет абсолютный путь, начинающийся с /.)
sender_port integer
Номер порта экземпляра QHB, к которому подключен этот получатель WAL.
conninfo text
Строка подключения, используемая этим получателем WAL, со скрытыми полями повышенной секретности.

pg_stat_recovery_prefetch

Представление pg_stat_recovery_prefetch будет содержать только одну строку. В столбцах wal_distance, block_distance и io_depth выводятся текущие значения, а в остальных столбцах — накопительные счетчики, которые можно сбросить с помощью функции pg_stat_reset_shared.

Таблица 17. Представление pg_stat_recovery_prefetch

Столбец Тип
Описание
stats_reset timestamp with time zone
Время последнего сброса этих статистических данных
prefetch bigint
Количество блоков, извлеченных предварительно из-за того, что их не было в пуле буферов
hit bigint
Количество блоков, не извлеченных предварительно из-за того, что они уже были в пуле буферов
skip_init bigint
Количество блоков, не извлеченных предварительно из-за того, что они должны инициализироваться нулями
skip_new bigint
Количество блоков, не извлеченных предварительно из-за того, что они еще не существовали
skip_fpw bigint
Количество блоков, не извлеченных предварительно из-за того, что в WAL были включены образы полных страниц
skip_rep bigint
Количество блоков, не извлеченных предварительно из-за того, что недавно они уже извлекались предварительно
wal_distance int
Количество байтов, просматриваемых процессом предварительной выборки
block_distance int
Количество блоков, просматриваемых процессом предварительной выборки
io_depth int
Количество операций предварительной выборки, которые были инициированы, но еще не считаются завершенными

pg_stat_subscription

Таблица 18. Представление pg_stat_subscription

Столбец Тип
Описание
subid oid
Идентификатор подписки
subname name
Имя подписки
pid integer
PID рабочего процесса этой подписки
relid oid
Идентификатор отношения, которое синхронизирует этот рабочий процесс; NULL для основного задействованного рабочего процесса
received_lsn pg_lsn
Последняя полученная позиция в журнале упреждающей записи; начальным значением этого поля будет 0
last_msg_send_time timestamp with time zone
Время передачи последнего сообщения, полученного от исходного отправителя WAL
last_msg_receipt_time timestamp with time zone
Время приема последнего сообщения, полученного от исходного отправителя WAL
latest_end_lsn pg_lsn
Последняя позиция в журнале упреждающей записи, сообщенная исходному отправителю WAL
latest_end_time timestamp with time zone
Время последней позиции в журнале упреждающей записи, сообщенной исходному отправителю WAL

pg_stat_subscription_stats

Представление pg_stat_subscription_stats будет содержать по одной строке для каждой подписки.

Таблица 19. Представление pg_stat_subscription_stats

Столбец Тип
Описание
subid oid
Идентификатор подписки
subname name
Имя подписки
apply_error_count bigint
Сколько раз происходили ошибки при применении изменений
sync_error_count bigint
Сколько раз происходили ошибки во время начальной синхронизации таблиц
stats_reset timestamp with time zone
Время последнего сброса этих статистических данных

pg_stat_ssl

Представление pg_stat_ssl будет содержать для каждого обслуживающего процесса или процесса-отправителя WAL по одной строке, отображающей статистику использования SSL для этого подключения. Его можно объединить с pg_stat_activity или pg_stat_replication по столбцу pid, чтобы получить более подробную информацию о подключении.

Таблица 20. Представление pg_stat_ssl

Столбец Тип
Описание
pid integer
PID обслуживающего процесса или процесса-отправителя WAL
ssl boolean
True, если для этого подключения используется SSL
version text
Версия используемого SSL или NULL, если для этого подключения не используется SSL
cipher text
Имя используемого шифра SSL или NULL, если для этого подключения не используется SSL
bits integer
Количество битов в используемом алгоритме шифрования или NULL, если для этого подключения не используется SSL
client_dn text
Поле DN (Distinguished Name, уникальное имя) из используемого клиентского сертификата или NULL, если клиентский сертификат не предоставлен или если для этого подключения не используется SSL. Это поле усекается, если поле DN длиннее NAMEDATALEN (64 символа в стандартной сборке).
client_serial numeric
Серийный номер клиентского сертификата или NULL, если клиентский сертификат не предоставлен или если для этого подключения не используется SSL. Сочетание серийного номера сертификата и имени центра сертификации однозначно идентифицирует сертификат (если только центр сертификации по ошибке не использует серийные номера повторно).
issuer_dn text
DN центра сертификации, выдавшего клиентский сертификат, или NULL, если клиентский сертификат не предоставлен или если для этого подключения не используется SSL. Это поле усекается аналогично полю client_dn.

pg_stat_gssapi

Представление pg_stat_gssapi будет для каждого обслуживающего процесса содержать по одной строке, отображающей информацию об использовании GSSAPI для этого подключения. Его можно объединить с pg_stat_activity или pg_stat_replication по столбцу pid, чтобы получить более подробную информацию о подключении.

Таблица 21. Представление pg_stat_gssapi

Столбец Тип
Описание
pid integer
PID обслуживающего процесса
gss_authenticated boolean
True, если для этого подключения используется аутентификация GSSAPI
principal text
Администратор доступа, используемый для аутентификации этого подключения, или NULL, если для аутентификации этого подключения не использовалось GSSAPI. Это поле усекается, если имя администратора доступа длиннее NAMEDATALEN (64 символа в стандартной сборке).
encrypted boolean
True, если для этого подключения используется шифрование GSSAPI

pg_stat_archiver

Представление pg_stat_archiver всегда будет включать только одну строку, содержащую данные о процессе архивации кластера.

Таблица 22. Представление pg_stat_archiver

Столбец Тип
Описание
archived_count bigint
Количество файлов WAL, которые уже были успешно заархивированы
last_archived_wal text
Имя последнего успешно заархивированного файла WAL
last_archived_time timestamp with time zone
Время последней успешной операции архивирования
failed_count bigint
Число неудачных попыток архивирования файлов WAL
last_failed_wal text
Имя файла WAL последней неудачной операции архивирования
last_failed_time timestamp with time zone
Время последней неудачной операции архивирования
stats_reset timestamp with time zone
Время последнего сброса этих статистических данных

Обычно файлы WAL архивируются в порядке от самых старых к самым но это не гарантируется и не выполняется в особых обстоятельствах, например, при повышении резервного сервера или после восстановления после сбоя. Таким образом, небезопасно предполагать, что все файл старше last_archived_wal тоже были успешно заархивированы.


pg_stat_bgwriter

Представление pg_stat_bgwriter всегда будет включать только одну строку, содержащую глобальные данные по всему кластеру.

Таблица 23. Представление pg_stat_bgwriter

Столбец Тип
Описание
checkpoints_timed bigint
Количество запланированных контрольных точек, которые уже были выполнены
checkpoints_req bigint
Количество запрошенных контрольных точек, которые уже были выполнены
checkpoint_write_time double precision
Общее время, которое было затрачено на том этапе обработки контрольной точки, где файлы записываются на диск, в миллисекундах
checkpoint_sync_time double precision
Общее время, которое было затрачено на том этапе обработки контрольной точки, где файлы синхронизируются с диском, в миллисекундах
buffers_checkpoint bigint
Количество буферов, записанных во время контрольных точек
buffers_clean bigint
Количество буферов, записанных фоновым процессом записи
maxwritten_clean bigint
Сколько раз фоновый процесс записи останавливал сканирование с записью грязных данных из-за того, что записал слишком много буферов
buffers_backend bigint
Количество буферов, записанных непосредственно обслуживающим процессом
buffers_backend_fsync bigint
Сколько раз обслуживающему процессу пришлось выполнить вызов fsync самостоятельно (обычно эти вызовы обрабатывает фоновый процесс записи, даже когда обслуживающий процесс выполняет запись самостоятельно)
buffers_alloc bigint
Количество выделенных буферов
stats_reset timestamp with time zone
Время последнего сброса этих статистических данных

pg_stat_wal

Представление pg_stat_wal всегда будет включать только одну строку, содержащую данные об активности WAL в кластере.

Таблица 24. Представление pg_stat_wal

Столбец Тип
Описание
wal_records bigint
Общее количество сгенерированных записей WAL
wal_fpi bigint
Общее количество сгенерированных образов полных страниц в WAL
wal_bytes numeric
Общий сгенерированный объем WAL в байтах
wal_buffers_full bigint
Сколько раз данные WAL записывались на диск из-за переполнения буферов WAL
wal_write bigint
Сколько раз буферы WAL записывались на диск по запросу функции XLogWrite. Подробную информацию о внутренней функции WAL XLogWrite см. в разделе Конфигурация WAL.
wal_sync bigint
Сколько раз файлы WAL синхронизировались с диском по запросу функции issue_xlog_fsync (если параметр fsync равен on (включен), а параметр wal_sync_method равен fdatasync, fsync или fsync_writethrough, иначе будет выводиться ноль). Подробную информацию о внутренней функции WAL issue_xlog_fsync см. в разделе Конфигурация WAL.
wal_write_time double precision
Общее время, затраченное на запись буферов WAL на диск по запросу функции XLogWrite, в миллисекундах (если включен параметр track_wal_io_timing, иначе будет выводиться ноль). Когда параметр wal_sync_method равен open_datasync или open_sync, сюда же включается время синхронизации.
wal_sync_time double precision
Общее время, затраченное на синхронизацию файлов WAL с диском по запросу функции issue_xlog_fsync, в миллисекундах (если включен параметр track_wal_io_timing, параметр fsync равен on, а параметр wal_sync_methodfdatasync, fsync или fsync_writethrough, иначе будет выводиться ноль).
stats_reset timestamp with time zone
Время последнего сброса этих статистических данных

pg_stat_database

Представление pg_stat_database будет содержать для каждой базы данных в кластере по одной строке, отображающей общую статистику на уровне базы данных, плюс еще одну строку для общих объектов.

Таблица 25. Представление pg_stat_database

Столбец Тип
Описание
datid oid
OID этой базы данных или 0, если объекты принадлежат разделяемому отношению
datname name
Имя этой базы данных или NULL для разделяемых объектов
numbackends integer
Количество обслуживающих процессов, в настоящее время подключенных к этой базе данных, или NULL для разделяемых объектов. Это единственный столбец в данном представлении, который возвращает значение, отражающее текущее состояние; все остальные столбцы возвращают накопленные значения с момента последнего сброса статистических данных.
xact_commit bigint
Количество зафиксированных транзакций в этой базе данных
xact_rollback bigint
Количество откатившихся транзакций в этой базе данных
blks_read bigint
Количество прочитанных дисковых блоков в этой базе данных
blks_hit bigint
Сколько раз дисковые блоки были обнаружены уже в буферном кэше, благодаря чему в чтении не было необходимости (сюда включаются только случаи обнаружения в буферном кэше QHB, а не в кэше файловой системы операционной системы)
tup_returned bigint
Количество активных строк, извлеченных при последовательных сканированиях, и записей индекса, возвращенных при сканированиях индексов, в этой базе данных
tup_fetched bigint
Количество активных строк, извлеченных при сканированиях индексов, в этой базе данных
tup_inserted bigint
Количество строк, добавленных запросами в этой базе данных
tup_updated bigint
Количество строк, измененных запросами в этой базе данных
tup_deleted bigint
Количество строк, удаленных запросами в этой базе данных
conflicts bigint
Количество запросов, отмененных вследствие конфликтов с восстановлением в этой базе данных. (Конфликты случаются только на резервных серверах; подробную информацию см. в описании представления pg_stat_database_conflicts.)
temp_files bigint
Количество временных файлов, созданных запросами в этой базе данных. Учитываются все временные файлы, независимо от причины их создания (например, для сортировки или хеширования) и значения параметра log_temp_files.
temp_bytes bigint
Общий объем данных, записанных во временные файлы запросами в этой базе данных. Учитываются все временные файлы, независимо от причины их создания и значения параметра log_temp_files.
deadlocks bigint
Количество взаимных блокировок, выявленных в этой базе данных
checksum_failures bigint
Количество ошибок контрольных сумм в страницах данных в этой базе данных (или в разделяемом объекте) или NULL, если проверка контрольных сумм данных не включена.
checksum_last_failure timestamp with time zone
Время выявления последней ошибки контрольных сумм в страницах данных в этой базе данных (или в разделяемом объекте) или NULL, если проверка контрольных сумм данных не включена.
blk_read_time double precision
Время, затраченное обслуживающими процессами на чтение блоков из файлов данных в этой базе данных, в миллисекундах (если включен параметр track_io_timing; в противном случае ноль)
blk_write_time double precision
Время, затраченное обслуживающими процессами на запись блоков в файлы данных в этой базе данных, в миллисекундах (если включен параметр track_io_timing; в противном случае ноль)
session_time double precision
Продолжительность сеансов в этой базе данных, в миллисекундах (обратите внимание, что статистика обновляется только при изменении состояния сеанса, поэтому если сеансы долгое время простаивали, это время простоя сюда включено не будет)
active_time double precision
Время, затраченное на выполнение операторов SQL в этой базе данных, в миллисекундах (это соответствует состояниям active и fastpath function call в pg_stat_activity)
idle_in_transaction_time double precision
Время простоя в транзакциях в этой базе данных, в миллисекундах (это соответствует состояниям idle in transaction и idle in transaction (aborted) в pg_stat_activity)
sessions bigint
Общее количество сеансов, установленных в этой базе данных
sessions_abandoned bigint
Количество сеансов в этой базе данных, прерванных вследствие потери соединения с клиентом
sessions_fatal bigint
Количество сеансов в этой базе данных, прерванных вследствие критических ошибок
sessions_killed bigint
Количество сеансов в этой базе данных, прерванных вследствие вмешательства оператора
stats_reset timestamp with time zone
Время последнего сброса этих статистических данных

pg_stat_database_conflicts

Представление pg_stat_database_conflicts будет содержать для каждой базы данных по одной строке, отображающей статистику на уровне базы данных по отменам запросов, возникающим из-за конфликтов с восстановлением на резервных серверах. Это представление будет содержать информацию только по резервным серверам, поскольку на главных серверах конфликты не возникают.

Таблица 26. Представление pg_stat_database_conflicts

Столбец Тип
Описание
datid oid
OID базы данных
datname name
Имя этой базы данных
confl_tablespace bigint
Количество запросов в этой базе данных, отмененных из-за удаленного табличного пространства
confl_lock bigint
Количество запросов в этой базе данных, отмененных из-за тайм-аутов блокировок
confl_snapshot bigint
Количество запросов в этой базе данных, отмененных из-за устаревших снимков состояния
confl_bufferpin bigint
Количество запросов в этой базе данных, отмененных из-за закрепленных буферов
confl_deadlock bigint
Количество запросов в этой базе данных, отмененных из-за взаимоблокировок

pg_stat_all_tables

Представление pg_stat_all_tables будет содержать для каждой таблицы в текущей базе данных (включая таблицы TOAST) по одной строке, отображающей статистику по обращениям к этой конкретной таблице. Представления pg_stat_user_tables и pg_stat_sys_tables содержат ту же информацию, но отфильтрованную так, чтобы отображать только пользовательские и системные таблицы соответственно.

Таблица 27. Представление pg_stat_all_tables

Столбец Тип
Описание
relid oid
OID таблицы
schemaname name
Имя схемы, в которой находится эта таблица
relname name
Имя этой таблицы
seq_scan bigint
Количество последовательных сканирований, инициированных для этой таблицы
seq_tup_read bigint
Количество активных строк, извлеченных при последовательных сканированиях
idx_scan bigint
Количество сканирований по индексу, инициированных для этой таблицы
idx_tup_fetch bigint
Количество активных строк, извлеченных при сканированиях по индексу
n_tup_ins bigint
Количество добавленных строк
n_tup_upd bigint
Количество измененных строк (включая строки, измененные в режиме HOT)
n_tup_del bigint
Количество удаленных строк
n_tup_hot_upd bigint
Количество строк, измененных в режиме HOT (т. е. без необходимости в отдельном изменении индекса)
n_live_tup bigint
Расчетное количество активных строк
n_dead_tup bigint
Расчетное количество неиспользуемых строк
n_mod_since_analyze bigint
Расчетное количество строк, измененных в этой таблице с момента последнего анализа
n_ins_since_vacuum bigint
Расчетное количество строк, добавленных в эту таблицу с момента последней очистки
last_vacuum timestamp with time zone
Время последней очистки этой таблицы вручную (не учитывая VACUUM FULL)
last_autovacuum timestamp with time zone
Время последней очистки этой таблицы фоновым процессом «Автовакуум»
last_analyze timestamp with time zone
Время последнего анализа этой таблицы вручную
last_autoanalyze timestamp with time zone
Время последнего анализа этой таблицы фоновым процессом «Автовакуум»
vacuum_count bigint
Сколько раз эта таблица очищалась вручную (не учитывая VACUUM FULL)
autovacuum_count bigint
Сколько раз эта таблица очищалась фоновым процессом «Автовакуум»
analyze_count bigint
Сколько раз эта таблица анализировалась вручную
autoanalyze_count bigint
Сколько раз эта таблица анализировалась фоновым процессом «Автовакуум»

pg_stat_all_indexes

Представление pg_stat_all_indexes будет содержать для каждого индекса в текущей базе данных по одной строке, отображающей статистику по обращениям к этому конкретному индексу. Представления pg_stat_user_indexes и pg_stat_sys_indexes содержат ту же информацию, но отфильтрованную так, чтобы отображать только пользовательские и системные индексы соответственно.

Таблица 28. Представление pg_stat_all_indexes

Столбец Тип
Описание
relid oid
OID таблицы для этого индекса
indexrelid oid
OID этого индекса
schemaname name
Имя схемы, в которой находится этот индекс
relname name
Имя таблицы для этого индекса
indexrelname name
Имя этого индекса
idx_scan bigint
Количество сканирований, инициированных по этому индексу
idx_tup_read bigint
Количество записей индекса, возвращенных при сканировании по этому индексу
idx_tup_fetch bigint
Количество активных строк таблицы, извлеченных при простых сканированиях по этому индексу

Индексы могут использоваться при простых сканированиях по индексу, сканированиях «битовой карты» индекса и в работе оптимизатора. При сканировании битовых карт выходные данные нескольких индексов можно комбинировать с помощью правил И или ИЛИ, поэтому при использовании битовых карт сложно связать выборки отдельных строк кучи с конкретными индексами. Поэтому при сканировании битовых карт увеличиваются счетчики pg_stat_all_indexes.idx_tup_read для индексов, которые оно использует, и счетчик pg_stat_all_tables.idx_tup_fetch для таблицы, но при этом оно не влияет на pg_stat_all_indexes.idx_tup_fetch. Оптимизатор также обращается к индексам для проверки предоставленных констант, значения которых находятся за пределами записанного диапазона статистики оптимизатора, поскольку статистика оптимизатора может быть устаревшей.

Примечание
Значения счетчиков idx_tup_read и idx_tup_fetch могут отличаться даже без использования сканирований битовых карт, поскольку idx_tup_read подсчитывает записи индекса, извлеченные из индекса, тогда как idx_tup_fetch подсчитывает количество активных строк, извлеченных из таблицы. Последнее значение будет меньше, если какие-либо неиспользуемые или еще не зафиксированные строки извлекаются с использованием индекса или если какие-либо выборки из кучи не производятся посредством сканирования только по индексу.


pg_statio_all_tables

Представление pg_statio_all_tables будет содержать для каждой таблицы в текущей базе данных (включая таблицы TOAST) по одной строке, отображающей статистику по вводу/выводу для этой конкретной таблицы. Представления pg_statio_user_tables и pg_statio_sys_tables содержат ту же информацию, но отфильтрованную так, чтобы отображать только пользовательские и системные таблицы соответственно.

Таблица 29. Представление pg_statio_all_tables

Столбец Тип
Описание
relid oid
OID таблицы
schemaname name
Имя схемы, в которой находится эта таблица
relname name
Имя этой таблицы
heap_blks_read bigint
Количество дисковых блоков, прочитанных из этой таблицы
heap_blks_hit bigint
Количество попаданий в буфер в этой таблице
idx_blks_read bigint
Количество дисковых блоков, прочитанных из всех индексов этой таблицы
idx_blks_hit bigint
Количество попаданий в буфер во всех индексах этой таблицы
toast_blks_read bigint
Количество дисковых блоков, прочитанных из таблицы TOAST (если таковая имеется) для этой таблицы
toast_blks_hit bigint
Количество попаданий в буфер в таблице TOAST (если таковая имеется) для этой таблицы
tidx_blks_read bigint
Количество дисковых блоков, прочитанных из индексов таблицы TOAST (если таковая имеется) для этой таблицы
tidx_blks_hit bigint
Количество попаданий в буфер в индексах таблицы TOAST (если таковая имеется) для этой таблицы

pg_statio_all_indexes

Представление pg_statio_all_indexes будет содержать для каждого индекса в текущей базе данных по одной строке, отображающей статистику по вводу/выводу для этого конкретного индекса. Представления pg_statio_user_indexes и pg_statio_sys_indexes содержат ту же информацию, но отфильтрованы так, чтобы отображать только пользовательские и системные индексы соответственно.

Таблица 30. Представление pg_statio_all_indexes

Столбец Тип
Описание
relid oid
OID таблицы для этого индекса
indexrelid oid
OID этого индекса
schemaname name
Имя схемы, в которой находится этот индекс
relname name
Имя таблицы для этого индекса
indexrelname name
Имя этого индекса
idx_blks_read bigint
Количество дисковых блоков, прочитанных из этого индекса
idx_blks_hit bigint
Количество попаданий в буфер в этом индексе

pg_statio_all_sequences

Представление pg_statio_all_sequences будет содержать для каждой последовательности в текущей базе данных по одной строке, отображающей статистику по вводу/выводу для этой конкретной последовательности.

Таблица 31. Представление pg_statio_all_sequences

Столбец Тип
Описание
relid oid
OID последовательности
schemaname name
Имя схемы, в которой находится эта последовательность
relname name
Имя этой последовательности
blks_read bigint
Количество дисковых блоков, прочитанных из этой последовательности
blks_hit bigint
Количество попаданий в буфер в этой последовательности

pg_stat_user_functions

Представление pg_stat_user_functions будет содержать для каждой отслеживаемой функции по одной строке, отображающей статистику по выполнениям этой функции. Параметр track_functions определяет, какие именно функции отслеживаются.

Таблица 32. Представление pg_stat_user_functions

Столбец Тип
Описание
funcid oid
OID функции
schemaname name
Имя схемы, в которой находится эта функция
funcname name
Имя этой функции
calls bigint
Сколько раз вызывалась эта функция
total_time double precision
Общее время, затраченное на выполнение этой функции и всех других функций, вызванных ею, в миллисекундах
self_time double precision
Общее время, затраченное на выполнение самой этой функции, без учета других функций, вызванных ею, в миллисекундах

pg_stat_slru

QHB обращается к некоторой информации на диске посредством кэшей с алгоритмом SLRU (simple least-recently-used, простое вытеснение по давности использования). Представление pg_stat_slru будет содержать для каждого отслеживаемого кэша SLRU по одной строке, отображающей статистику по обращениям к кэшированным страницам.

Таблица 31. Представление pg_stat_slru

Столбец Тип
Описание
name text
Имя кэша SLRU
blks_zeroed bigint
Количество блоков, обнуленных во время инициализации
blks_hit bigint
Сколько раз дисковые блоки были обнаружены уже в кэше SLRU, благодаря чему в чтении не было необходимости (сюда включаются только попадания в кэш SLRU, а не в кэш файловой системы операционной системы)
blks_read bigint
Количество прочитанных дисковых блоков для этого кэша SLRU
blks_written bigint
Количество записанных дисковых блоков для этого кэша SLRU
blks_exists bigint
Количество проверенных на существование дисковых блоков для этого кэша SLRU
flushes bigint
Количество операций сброса грязных данных для этого кэша SLRU
truncates bigint
Количество операций усечения для этого кэша SLRU
stats_reset timestamp with time zone
Время последнего сброса этих статистических данных

Функции статистики

Другие способы просмотра статистики можно настроить, написав запросы, использующие те же лежащие в основе функции доступа к статистике, которые используются стандартными представлениями, приведенными выше. Подробную информацию, например, имена этих функций, см. в определениях этих стандартных представлений (например, в psql можно выполнить \d+ pg_stat_activity). Функции доступа к статистике на уровне базы данных принимают в качестве аргумента OID базы данных, чтобы определить, по какой именно базе собирать информацию. Функции на уровне таблиц и индексов принимают OID таблицы или индекса. Функции, выдающие статистику на уровне функций принимают OID функции. Обратите внимание, что с помощью этих функций можно видеть таблицы, индексы и функции только в текущей базе данных.

Дополнительные функции, связанные со сбором статистики, перечислены в Таблице 34.

Таблица 34. Дополнительные статистические функции

Функция
Описание
pg_backend_pid () → integer
Возвращает PID серверного процесса, закрепленного за текущим сеансом.
pg_stat_get_activity ( integer ) → setof record
Возвращает запись с информацией об обслуживающем процессе с заданным идентификатором процесса или по одной записи для каждого активного обслуживающего процесса в системе, если указан NULL. Возвращаемые поля являются подмножеством полей представления pg_stat_activity.
pg_stat_get_snapshot_timestamp () → timestamp with time zone
Возвращает временную метку текущего снимка статистики или NULL, если снимок статистики не делался. Снимок создается при первом обращении к накопительной статистике в транзакции, если параметр stats_fetch_consistency имеет значение snapshot.
pg_stat_get_xact_blocks_fetched ( oid ) → bigint
Возвращает количество запросов на чтение блоков для таблицы или индекса в текущей транзакции. Это число минус pg_stat_get_xact_blocks_hit дает количество вызовов функции read() для ядра; количество фактических физических операций чтения обычно меньше вследствие буферизации на уровне ядра.
pg_stat_get_xact_blocks_hit ( oid ) → bigint
Возвращает количество запросов на чтение блоков для таблицы или индекса в текущей транзакции, обнаруженных в кэше (не провоцирует вызовы функции read() для ядра).
pg_stat_clear_snapshot () → void
Сбрасывает текущий снимок статистики или кэшированную информацию.
pg_stat_reset () → void
Обнуляет все статистические счетчики для текущей базы данных.
По умолчанию эту функцию могут вызывать только суперпользователи, но право EXECUTE на ее выполнение можно дать и другим пользователям.
pg_stat_reset_shared ( text ) → void
Обнуляет некоторые статистические счетчики на уровне кластера, в зависимости от аргумента. Значением аргумента может быть bgwriter для обнуления всех счетчиков, отображаемых в представлении pg_stat_bgwriter, archiver для обнуления всех счетчиков, отображаемых в представлении pg_stat_archiver, wal для обнуления всех счетчиков, отображаемых в представлении pg_stat_wal, или recovery_prefetch для обнуления всех счетчиков, отображаемых в представлении pg_stat_recovery_prefetch.
По умолчанию эту функцию могут вызывать только суперпользователи, но право EXECUTE на ее выполнение можно дать и другим пользователям.
pg_stat_reset_single_table_counters ( oid ) → void
Обнуляет статистику для отдельной таблицы или индекса в текущей базе данных или для совместно используемых всеми базами данных в кластере.
По умолчанию эту функцию могут вызывать только суперпользователи, но право EXECUTE на ее выполнение можно дать и другим пользователям.
pg_stat_reset_single_function_counters ( oid ) → void
Обнуляет статистику для отдельной функции в текущей базе данных.
По умолчанию эту функцию могут вызывать только суперпользователи, но право EXECUTE на ее выполнение можно дать и другим пользователям.
pg_stat_reset_slru ( text ) → void
Обнуляет статистику для отдельного кэша SLRU или для всех кэшей SLRU в кластере. Если аргумент имеет значение NULL, сбрасываются все счетчики, отображаемые в представлении pg_stat_slru, для всех кэшей SLRU. Аргументом также может быть CommitTs, MultiXactMember, MultiXactOffset, Notify, Serial, Subtrans или Xact для сброса счетчиков только для соответствующей записи. При значении other (или даже любом нераспознаваемом имени) сбрасываются счетчики для всех остальных кэшей SLRU, например для определенных расширением.
По умолчанию эту функцию могут вызывать только суперпользователи, но право EXECUTE на ее выполнение можно дать и другим пользователям.
pg_stat_reset_replication_slot ( text ) → void
Сбрасывает статистику слота репликации, определенного в аргументе. Если аргумент имеет значение NULL, сбрасывает статистику для всех слотов репликации.
По умолчанию эту функцию могут вызывать только суперпользователи, но право EXECUTE на ее выполнение можно дать и другим пользователям.
pg_stat_reset_subscription_stats ( oid ) → void
Обнуляет статистику для отдельной подписки, отображаемую в представлении pg_stat_subscription_stats. Если аргумент имеет значение NULL, обнуляет статистику для всех подписок.
По умолчанию эту функцию могут вызывать только суперпользователи, но право EXECUTE на ее выполнение можно дать и другим пользователям.

ПРЕДУПРЕЖДЕНИЕ
При вызове функции pg_stat_reset() также сбрасываются счетчики, которые процесс «Автовакуум» использует для определения времени запуска очистки или анализа. В результате сброса этих счетчиков процесс «Автовакуум» может не выполнить необходимую работу, что может привести к таким проблемам, как раздувание таблиц или потеря актуальности статистическими данными по таблицам. В связи с этим после сброса статистики рекомендуется выполнить ANALYZE на уровне базы данных.

Лежащая в основе представления pg_stat_activity функция pg_stat_get_activity возвращает набор записей, содержащих всю доступную информацию о каждом обслуживающем процессе. Иногда бывает удобнее получить только часть этой информации. В таких случаях можно воспользоваться более старым набором функций доступа к статистике на уровне обслуживающих процессов; они перечислены в Таблице 35. Эти функции доступа используют идентификатор обслуживающего процесса, значение которого варьирует от единицы до количества текущих активных обслуживающих процессов. Функция pg_stat_get_backend_idset предоставляет удобный способ генерации по одной строке для каждого активного обслуживающего процесса, что требуется для вызова этих функций. Например, чтобы вывести PID и текущие запросы всех обслуживающих процессов, можно выполнить:

SELECT pg_stat_get_backend_pid(s.backendid) AS pid,
       pg_stat_get_backend_activity(s.backendid) AS query
    FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;

Таблица 35. Статистические функции на уровне обслуживающих процессов

Функция
Описание
pg_stat_get_backend_idset () → setof integer
Возвращает набор идентификаторов активных на данный момент обслуживающих процессов (в диапазоне от 1 до количества активных обслуживающих процессов).
pg_stat_get_backend_activity ( integer ) → text
Возвращает текст последнего запроса этого обслуживающего процесса.
pg_stat_get_backend_activity_start ( integer ) → timestamp with time zone
Возвращает время начала выполнения последнего запроса этого обслуживающего процесса.
pg_stat_get_backend_client_addr ( integer ) → inet
Возвращает IP-адрес клиента, подключенного к этому обслуживающему процессу.
pg_stat_get_backend_client_port ( integer ) → integer
Возвращает номер TCP-порта, который клиент использует для взаимодействия.
pg_stat_get_backend_dbid ( integer ) → oid
Возвращает идентификатор базы данных, к которой подключен этот обслуживающий процесс.
pg_stat_get_backend_pid ( integer ) → integer
Возвращает PID этого обслуживающего процесса.
pg_stat_get_backend_start ( integer ) → timestamp with time zone
Возвращает время запуска этого процесса.
pg_stat_get_backend_userid ( integer ) → oid
Возвращает идентификатор пользователя, подсоединившегося к этому обслуживающему процессу.
pg_stat_get_backend_wait_event_type ( integer ) → text
Возвращает имя типа ожидаемого события, если этот обслуживающий процесс в данный момент находится в состоянии ожидания, или NULL в противном случае. Подробную информацию см. в Таблице 4.
pg_stat_get_backend_wait_event ( integer ) → text
Возвращает имя ожидаемого события, если этот обслуживающий процесс в данный момент находится в состоянии ожидания, или NULL в противном случае. См. с Таблицы 5 по Таблицу 13.
pg_stat_get_backend_xact_start ( integer ) → timestamp with time zone
Возвращает время начала текущей транзакции этого обслуживающего процесса.


Просмотр информации о блокировках

Еще одним полезным инструментом для мониторинга активности базы данных является системная таблица pg_locks. Она позволяет администратору базы данных просматривать информацию о блокировках в менеджере блокировок. Например, эту возможность можно использовать для того, чтобы:

  • Просмотреть все имеющиеся на данный момент блокировки, все блокировки на отношения в конкретной базе данных, все блокировки на определенном отношении или все блокировки, удерживаемые определенным сеансом QHB.

  • Определить отношение в текущей базе данных с наибольшим количеством неразрешенных блокировок (которые могут быть источником конкуренции среди клиентов базы данных).

  • Определить влияние конкуренции за блокировку на общую производительность базы данных, а также то, до каких пределов меняется конкуренция в зависимости от общего трафика базы данных.

Подробная информации о представлении pg_locks находится в разделе pg_locks. Дополнительную информации о блокировках и управлении параллельным доступом в QHB см. в главе Управление параллельным доступом.



Отчеты о ходе выполнения команд

QHB имеет возможность сообщать о ходе выполнения определенных команд во время их выполнения. В настоящее время командами, которые поддерживают отображение текущего состояния, являются ANALYZE, CLUSTER, CREATE INDEX, VACUUM, COPY и BASE_BACKUP (т. е. команда репликации, которую запускает qhb_basebackup для создания базовой резервной копии). В будущем этот список может быть расширен.


Отчет о ходе выполнения ANALYZE

При каждом выполнении ANALYZE представление pg_stat_progress_analyze будет содержать по одной строке для каждого обслуживающего процесса, который в данный момент выполняет эту команду. В таблицах ниже описываются предоставляемые сведения и поясняется, как их интерпретировать.

Таблица 36. Представление pg_stat_progress_analyze

Столбец Тип
Описание
pid integer
PID обслуживающего процесса.
datid oid
Идентификатор базы данных, к которой подключен этот обслуживающий процесс.
datname name
Имя базы данных, к которой подключен этот обслуживающий процесс.
relid oid
Идентификатор анализируемой таблицы.
phase text
Текущая фаза обработки. См. Таблицу 37.
sample_blks_total bigint
Общее количество блоков кучи, которые будут отобраны.
sample_blks_scanned bigint
Количество просканированных блоков кучи.
ext_stats_total bigint
Количество объектов расширенной статистики.
ext_stats_computed bigint
Количество вычисленных объектов расширенной статистики. Этот счетчик увеличивается только в фазе computing extended statistics.
child_tables_total bigint
Количество дочерних таблиц.
child_tables_done bigint
Количество просканированных дочерних таблиц. Этот счетчик увеличивается только в фазе acquiring inherited sample rows.
current_child_table_relid oid
Идентификатор дочерней таблицы, сканируемой в настоящий момент. Это поле актуально только в фазе acquiring inherited sample rows.

Таблица 37. Фазы ANALYZE

ФазаОписание
initializingКоманда готовится начать сканирование кучи. Предполагается, что эта фаза будет очень короткой.
acquiring sample rowsВ данный момент команда сканирует таблицу с указанным relid, чтобы получить строки выборки.
acquiring inherited sample rowsВ данный момент команда сканирует дочерние таблицы, чтобы получить строки выборки. В столбцах child_tables_total, child_tables_done и current_child_table_relid содержится информация о ходе выполнения этой фазы.
computing statisticsКоманда вычисляет статистику по строкам выборки, полученным во время сканирования таблицы.
computing extended statisticsКоманда вычисляет объекты расширенной статистики по строкам выборки, полученным во время сканирования таблицы.
finalizing analyzeКоманда обновляет каталог pg_class. По окончании этой фазы ANALYZE завершит работу.

Примечание
Обратите внимание, что когда ANALYZE обрабатывает партиционированную таблицу, все ее партиции тоже рекурсивно анализируются. В этом случае сначала выводится информация о ходе ANALYZE для родительской таблицы, во время выполнения которой собирается ее наследуемая статистика, затем выводится такая же информация по каждой партиции.


Отчет о ходе выполнения CREATE INDEX

При каждом выполнении CREATE INDEX или REINDEX представление pg_stat_progress_create_index будет содержать по одной строке для каждого обслуживающего процесса, который в данный момент создает индексы. В таблицах ниже описываются предоставляемые сведения и поясняется, как их интерпретировать.

Таблица 38. Представление pg_stat_progress_create_index

Столбец Тип
Описание
pid integer
PID обслуживающего процесса.
datid oid
Идентификатор базы данных, к которой подключен этот обслуживающий процесс.
datname name
Имя базы данных, к которой подключен этот обслуживающий процесс.
relid oid
Идентификатор таблицы, в которой создается индекс.
index_relid oid
Идентификатор создаваемого или перестраиваемого индекса. Во время выполнения CREATE INDEX в непараллельном режиме содержит 0.
command text
Выполняемая команда: CREATE INDEX, CREATE INDEX CONCURRENTLY, REINDEX или REINDEX CONCURRENTLY.
phase text
Текущая фаза создания индекса. См. Таблицу 39.
lockers_total bigint
Общее количество блокирующих процессов, потребовавших ожидания, если применимо.
lockers_done bigint
Количество блокирующих процессов, ожидание которых уже завершено.
current_locker_pid bigint
PID блокирующего процесса, ожидание которого происходит в данный момент.
blocks_total bigint
Общее количество блоков, которые будут обработаны в текущей фазе.
blocks_done bigint
Количество блоков, уже обработанных в текущей фазе.
tuples_total bigint
Общее количество кортежей, которые будут обработаны в текущей фазе.
tuples_done bigint
Количество кортежей, уже обработанных в текущей фазе.
partitions_total bigint
При создании индекса в партиционированной таблице в этом столбце выводится общее количество партиций, в которых будет создаваться индекс. Во время выполнения REINDEX это поле содержит 0.
partitions_done bigint
При создании индекса в партиционированной таблице в этом столбце выводится общее количество партиций, в которых уже был создан индекс. Во время выполнения REINDEX это поле содержит 0.

Таблица 39. Фазы CREATE INDEX

ФазаОписание
initializingCREATE INDEX или REINDEX готовится к созданию индекса. Предполагается, что эта фаза будет очень короткой.
waiting for writers before buildCREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидает завершения транзакций, удерживающих блокировки записи, которые потенциально могут видеть таблицу. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах lockers_total, lockers_done и current_locker_pid содержится информация о ходе выполнения этой фазы.
building indexИндекс строится с помощью кода, реализующего метод доступа. На этом этапе методы доступа, поддерживающие отчеты о ходе выполнения, передают собственные данные о ходе выполнения, и в этом столбце указывается внутренняя фаза. Как правило, данные о ходе выполнения содержат столбцы blocks_total и blocks_done и потенциально столбцы tuples_total и tuples_done.
waiting for writers before validationCREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидает завершения транзакций, удерживающих блокировки записи, которые потенциально могут записывать данные в таблицу. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах lockers_total, lockers_done и current_locker_pid содержится информация о ходе выполнения этой фазы.
index validation: scanning indexCREATE INDEX CONCURRENTLY сканирует индекс в поисках кортежей, которые необходимо проверить. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах blocks_total (отображает общий размер индекса) и blocks_done содержится информация о ходе выполнения этой фазы.
index validation: sorting tuplesCREATE INDEX CONCURRENTLY сортирует выходные данные фазы сканирования индекса.
index validation: scanning tableCREATE INDEX CONCURRENTLY сканирует таблицу для проверки кортежей индексов, собранных в предыдущих двух фазах. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах blocks_total (отображает общий размер индекса) и blocks_done содержится информация о ходе выполнения этой фазы.
waiting for old snapshotsCREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидает освобождения снимков транзакциями, которые потенциально могут видеть таблицу. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах lockers_total, lockers_done и current_locker_pid содержится информация о ходе выполнения этой фазы.
waiting for readers before marking deadREINDEX CONCURRENTLY ожидает завершения транзакций, удерживающих блокировки чтения, прежде чем пометить старый индекс как неиспользуемый. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах lockers_total, lockers_done и current_locker_pid содержится информация о ходе выполнения этой фазы.
waiting for readers before droppingREINDEX CONCURRENTLY ожидает завершения транзакций, удерживающих блокировки чтения, прежде чем удалить старый индекс. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах lockers_total, lockers_done и current_locker_pid содержится информация о ходе выполнения этой фазы.

Отчет о ходе выполнения VACUUM

При каждом выполнении VACUUM представление pg_stat_progress_vacuum будет содержать по одной строке для каждого обслуживающего процесса (включая рабочие процессы автовакуума), который в данный момент производит очистку. В таблицах ниже описываются предоставляемые сведения и поясняется, как их интерпретировать. Информация о ходе выполнения команд VACUUM FULL выводится в представлении pg_stat_progress_cluster поскольку VACUUM FULL и CLUSTER перезаписывают таблицу, в то время как простая команда VACUUM только модифицирует ее саму. См. подраздел Отчет о ходе выполнения CLUSTER.

Таблица 40. Представление pg_stat_progress_vacuum

Столбец Тип
Описание
pid integer
PID обслуживающего процесса.
datid oid
Идентификатор базы данных, к которой подключен этот обслуживающий процесс.
datname name
Имя базы данных, к которой подключен этот обслуживающий процесс.
relid oid
Идентификатор очищаемой таблицы.
phase text
Текущая фаза очистки. См. Таблицу 41.
heap_blks_total bigint
Общее количество блоков кучи в этой таблице. Это число отображает состояние на начало сканирования; блоки, добавленные позже, не будут (и не должны) обрабатываться этой командой VACUUM.
heap_blks_scanned bigint
Количество просканированных блоков кучи. Поскольку для оптимизации сканирования используется карта видимости, некоторые блоки будут пропущены без проверки; пропущенные блоки включаются в это общее количество, поэтому данное число в итоге по завершении очистки сравняется со значением heap_blks_total. Этот счетчик увеличивается только в фазе scanning heap.
heap_blks_vacuumed bigint
Количество очищенных блоков кучи. Если в таблице имеются индексы, этот счетчик увеличивается только в фазе vacuuming heap. Блоки, не содержащие неиспользуемые кортежи, пропускаются, поэтому иногда этот счетчик может резко увеличиваться с большими приращениями.
index_vacuum_count bigint
Количество завершенных циклов очистки индекса.
max_dead_tuples bigint
Количество неиспользуемых кортежей, которые мы можем хранить, прежде чем возникнет необходимость выполнить цикл очистки индекса, исходя из значения maintenance_work_mem.
num_dead_tuples bigint
Количество неиспользуемых кортежей, собранных с момента последнего цикла очистки индекса.

Таблица 41. Фазы VACUUM

ФазаОписание
initializingVACUUM готовится начать сканирование кучи. Предполагается, что эта фаза будет очень короткой.
scanning heapВ данный момент VACUUM сканирует кучу. Команда будет по мере необходимости обрезать и дефрагментировать каждую страницу и, возможно, замораживать активность. Для отслеживания хода сканирования можно использовать столбец heap_blks_scanned.
vacuuming indexesВ данный момент VACUUM очищает индексы. Если в таблице есть какие-либо индексы, это будет происходить как минимум один раз за очистку после полного сканирования кучи. Это может происходить и несколько раз за очистку, если значения maintenance_work_mem (или, в случае автоочистки, autovacuum_work_mem, если этот параметр установлен) оказывается недостаточно для хранения всех найденных неиспользуемых кортежей.
vacuuming heapВ данный момент VACUUM очищает кучу. Очистка кучи отличается от сканирования кучи и выполняется после каждого эпизода очистки индексов. Если heap_blks_scanned меньше, чем heap_blks_total, то после завершения этой фазы система вернется к сканированию кучи; в противном случае она начнет приводить в порядок индексы.
cleaning up indexesВ данный момент VACUUM приводит в порядок индексы. Это происходит после того, как была полностью отсканирована куча и завершена вся очистка индексов и кучи.
truncating heapВ данный момент VACUUM опустошает кучу, чтобы вернуть пустые страницы в конце отношения в операционную систему. Это происходит после приведения индексов в порядок.
performing final cleanupVACUUM выполняет окончательную ликвидацию последствий. На этом этапе VACUUM будет очищать карту свободного пространства, обновлять статистику в каталоге pg_class и передавать статистические данные сборщику статистики. Когда эта фаза закончится, VACUUM завершит работу.

Отчет о ходе выполнения CLUSTER

При каждом выполнении CLUSTER или VACUUM FULL представление pg_stat_progress_cluster будет содержать по одной строке для каждого обслуживающего процесса, который в данный момент выполняет любую из этих команд. В таблицах ниже описываются предоставляемые сведения и поясняется, как их интерпретировать.

Таблица 42. Представление pg_stat_progress_cluster

Столбец Тип
Описание
pid integer
PID обслуживающего процесса.
datid oid
Идентификатор базы данных, к которой подключен этот обслуживающий процесс.
datname name
Имя базы данных, к которой подключен этот обслуживающий процесс.
relid oid
Идентификатор кластеризуемой таблицы.
command text
Выполняемая команда. Либо CLUSTER, либо VACUUM FULL.
phase text
Текущая фаза обработки. См. Таблицу 43.
cluster_index_relid oid
Если таблица сканируется с использованием индекса, здесь отображается идентификатор данного индекса; в противном случае ноль.
heap_tuples_scanned bigint
Количество просканированных кортежей кучи. Этот счетчик увеличивается только в фазе seq scanning heap, index scanning heap или writing new heap.
heap_tuples_written bigint
Количество записанных кортежей кучи. Этот счетчик увеличивается только в фазе seq scanning heap, index scanning heap или writing new heap.
heap_blks_total bigint
Общее количество блоков кучи в таблице. Это число отображает состояние на начало фазы seq scanning heap.
heap_blks_scanned bigint
Количество просканированных блоков кучи. Этот счетчик увеличивается только в фазе seq scanning heap.
index_rebuild_count bigint
Количество перестроенных индексов. Этот счетчик увеличивается только в фазе rebuilding index.

Таблица 43. Фазы CLUSTER и VACUUM FULL

ФазаОписание
initializingКоманда готовится начать сканирование кучи. Предполагается, что эта фаза будет очень короткой.
seq scanning heapВ данный момент команда сканирует таблицу с помощью последовательного сканирования.
index scanning heapВ данный момент CLUSTER сканирует таблицу по индексу.
sorting tuplesВ данный момент CLUSTER сортирует кортежи.
writing new heapВ данный момент CLUSTER записывает новую кучу.
swapping relation filesВ данный момент команда переставляет вновь построенные файлы на место.
rebuilding indexВ данный момент команда перестраивает индекс.
performing final cleanupКоманда выполняет окончательную ликвидацию последствий. Когда эта фаза заканчивается, CLUSTER или VACUUM FULL завершает работу.

Отчет о ходе выполнения базового резервного копирования

Каждый раз, когда приложение вроде qhb_basebackup создает базовую резервную копию, представление pg_stat_progress_basebackup будет содержать по одной строке для каждого процесса-отправителя WAL, который в настоящий момент выполняет команду репликации BASE_BACKUP и поточно передает копируемые данные. В таблицах ниже описываются предоставляемые сведения и поясняется, как их интерпретировать.

Таблица 44. Представление pg_stat_progress_basebackup

Столбец Тип
Описание
pid integer
PID процесса-отправителя WAL.
phase text
Текущая фаза обработки. См. Таблицу 45.
backup_total bigint
Общий объем данных, которые будут передаваться в потоке. Это значение является оценочным и отображает состояние на начало фазы streaming database files (потоковая передача файлов базы данных). Обратите внимание, что это только приблизительная оценка, поскольку база данных может измениться во время фазы streaming database files, и позже в резервную копию может быть добавлен журнал WAL. Это значение всегда становится равным backup_streamed, как только объем переданных данных превысит ожидаемое значение. Если предварительная оценка в qhb_basebackup отключена (т. е. задан параметр --no-estimate-size), это поле содержит NULL.
backup_streamed bigint
Объем переданных в потоке данных. Этот счетчик увеличивается только в фазе streaming database files или transferring wal files.
tablespaces_total bigint
Общее количество табличных пространств, которые будут передаваться в потоке.
tablespaces_streamed bigint
Количество переданных в потоке табличных пространств. Этот счетчик увеличивается только в фазе streaming database files.

Таблица 45. Фазы базового резервного копирования

ФазаОписание
initializingПроцесс-отправитель WAL готовится начать резервное копирование. Предполагается, что эта фаза будет очень короткой.
waiting for checkpoint to finishВ данный момент процесс-отправитель WAL выполняет pg_start_backup, чтобы подготовиться к созданию базовой резервной копии, и ожидает завершения контрольной точки начала резервного копирования.
estimating backup sizeВ данный момент процесс-отправитель WAL оценивает общий объем файлов базы данных, которые будут переданы в потоке в качестве базовой резервной копии.
streaming database filesВ данный момент процесс-отправитель WAL передает в потоке файлы базы данных в качестве базовой резервной копии.
waiting for wal archiving to finishВ данный момент процесс-отправитель WAL выполняет pg_stop_backup, чтобы завершить резервное копирование, и ожидает успешного архивирования всех файлов WAL, требуемых для базовой резервной копии. Если в qhb_basebackup задан параметр --wal-method=none или --wal-method=stream, резервное копирование завершится по окончании этой фазы.
transferring wal filesВ данный момент процесс-отправитель WAL переносит все журналы WAL, сгенерированные во время резервного копирования. Эта фаза наступает после фазы waiting for wal archiving to finish, если в qhb\basebackup задан параметр --wal-method=fetch. Резервное копирование завершится по окончании этой фазы.

Отчет о ходе выполнения COPY

При каждом выполнении COPY представление pg_stat_progress_copy будет содержать по одной строке для каждого обслуживающего процесса, который в данный момент выполняет команду COPY. В таблице ниже описываются предоставляемые сведения и поясняется, как их интерпретировать.

Таблица 46. Представление pg_stat_progress_copy

Столбец Тип
Описание
pid integer
PID обслуживающего процесса.
datid oid
Идентификатор базы данных, к которой подключен этот обслуживающий процесс.
datname name
Имя базы данных, к которой подключен этот обслуживающий процесс.
relid oid
Идентификатор таблицы, в которой выполняется команда COPY. Если копирование производится из запроса SELECT, это поле содержит 0.
command text
Выполняемая команда: COPY FROM или COPY TO.
type text
Тип ввода/вывода, посредством которого считываются или записываются данные: FILE, PROGRAM, PIPE (для COPY FROM STDIN и COPY TO STDOUT) или CALLBACK (используется, например, во время начальной синхронизации таблицы при логической репликации).
bytes_processed bigint
Количество байтов, уже обработанных командой COPY.
bytes_total bigint
Размер исходного файла для команды COPY FROM в байтах. Если это неприменимо, данное поле содержит 0.
tuples_processed bigint
Количество кортежей, уже обработанных командой COPY.
tuples_excluded bigint
Количество кортежей, которые не были обработаны из-за того, что были исключены предложением WHERE команды COPY.


Динамическая трассировка

QHB предоставляет средства для поддержки динамической трассировки сервера баз данных. Это позволяет вызывать внешнюю утилиту в определенных точках кода и тем самым отслеживать его выполнение.

Несколько зондов или точек трассировки уже встроено в исходный код. Предполагается, что эти зонды будут использоваться разработчиками и администраторами базы данных. По умолчанию зонды не скомпилированы в QHB; пользователю необходимо явно указать скрипту конфигурации, чтобы тот обеспечил наличие этих зондов.

В настоящее время поддерживается утилита DTrace, которая на момент составления этой документации доступна для Solaris, macOS, FreeBSD, NetBSD и Linux. Проект SystemTap для Linux представляет собой эквивалент DTrace и также может быть использован. Теоретически возможна поддержка и других утилит динамической трассировки, для чего нужно изменить определения для макроса.


Компиляция для динамической трассировки

По умолчанию зонды недоступны, поэтому необходимо явно указать скрипту конфигурации, чтобы тот обеспечил их наличие в QHB. Чтобы добавить поддержку DTrace, укажите --enable-dtrace в файле конфигурации.


Встроенные зонды

В исходном коде имеется несколько встроенных зондов, представленных в Таблице 47; в Таблице 48 перечислены типы данных, используемые в этих зондах. Конечно, для улучшения наблюдаемости QHB можно добавить дополнительные зонды.

Таблица 47. Встроенные зонды DTrace

ИмяПараметрыОписание
transaction-start(LocalTransactionId)Зонд, который срабатывает в начале новой транзакции. В arg0 передается идентификатор этой транзакции.
transaction-commit(LocalTransactionId)Зонд, который срабатывает при успешном завершении транзакции. В arg0 передается идентификатор этой транзакции.
transaction-abort(LocalTransactionId)Зонд, который срабатывает при завершении транзакции с ошибкой. В arg0 передается идентификатор этой транзакции.
query-start(const char *)Зонд, который срабатывает в начале обработки запроса. В arg0 передается строка запроса.
query-done(const char *)Зонд, который срабатывает по завершении обработки запроса. В arg0 передается строка запроса.
query-parse-start(const char *)Зонд, который срабатывает в начале анализа запроса. В arg0 передается строка запроса.
query-parse-done(const char *)Зонд, который срабатывает по завершении анализа запроса. В arg0 передается строка запроса.
query-rewrite-start(const char *)Зонд, который срабатывает в начале перезаписи запроса. В arg0 передается строка запроса.
query-rewrite-done(const char *)Зонд, который срабатывает по завершении перезаписи запроса. В arg0 передается строка запроса.
query-plan-start()Зонд, который срабатывает в начале планирования запроса.
query-plan-done()Зонд, который срабатывает по завершении планирования запроса.
query-execute-start()Зонд, который срабатывает в начале выполнения запроса.
query-execute-done()Зонд, который срабатывает по завершении выполнения запроса.
statement-status(const char *)Зонд, который срабатывает каждый раз, когда серверный процесс изменяет свой pg_stat_activity.status. В arg0 передается новая строка состояния.
checkpoint-start(int)Зонд, который срабатывает в начале контрольной точки. arg0 содержит битовые флаги, используемые для дифференциации разных типов контрольных точек, например, shutdown, immediate или force.
checkpoint-done(int, int, int, int, int)Зонд, который срабатывает по завершении контрольной точки. (Зонды, перечисленные далее, срабатывают последовательно во время обработки контрольной точки.) В arg0 передается количество записанных буферов. В arg1 — общее количество буферов. arg2, arg3 и arg4 содержат количество добавленных, удаленных и переработанных файлов WAL соответственно.
clog-checkpoint-start(bool)Зонд, который срабатывает в начале этапа записи контрольной точки в CLOG. arg0 равен true для обычной контрольной точки и false для контрольной точки типа shutdown.
clog-checkpoint-done(bool)Зонд, который срабатывает по завершении этапа записи контрольной точки в CLOG. arg0 имеет то же значение, что и для clog-checkpoint-start.
subtrans-checkpoint-start(bool)Зонд, который срабатывает в начале этапа записи контрольной точки в SUBTRANS. arg0 равен true для обычной контрольной точки и false для контрольной точки типа shutdown.
subtrans-checkpoint-done(bool)Зонд, который срабатывает по завершении этапа записи контрольной точки в SUBTRANS. arg0 имеет то же значение, что и для subtrans-checkpoint-start.
multixact-checkpoint-start(bool)Зонд, который срабатывает в начале этапа записи контрольной точки в MultiXact. arg0 равен true для обычной контрольной точки и false для контрольной точки типа shutdown.
multixact-checkpoint-done(bool)Зонд, который срабатывает по завершении этапа записи контрольной точки в MultiXact. arg0 имеет то же значение, что и для multixact-checkpoint-start.
buffer-checkpoint-start(int)Зонд, который срабатывает в начале записи буферов контрольной точки. arg0 содержит битовые флаги, используемые для дифференциации разных типов контрольных точек, например, shutdown, immediate или force.
buffer-sync-start(int, int)Зонд, который срабатывает в начале записи грязных буферов во время контрольной точки (после определения, какие буферы должны быть записаны). В arg0 передается общее количество буферов. В arg1 — количество буферов, которые в данный момент являются грязными и должны быть записаны.
buffer-sync-written(int)Зонд, который срабатывает после записи каждого буфера во время контрольной точки. В arg0 передается идентификатор этого буфера.
buffer-sync-done(int, int, int)Зонд, который срабатывает после записи всех грязных буферов. В arg0 передается общее количество буферов. В arg1 — количество буферов, фактически записанных процессом контрольной точки. В arg2 — количество буферов, которое должно было быть записано (arg1 в buffer-sync-start); любое различие говорит о том, что во время контрольной точки другие процессы сбрасывали буферы на диск.
buffer-checkpoint-sync-start()Зонд, который срабатывает после записи грязных буферов в ядро и до начала выдачи запросов fsync.
buffer-checkpoint-done()Зонд, который срабатывает по завершении синхронизации буферов с диском.
twophase-checkpoint-start()Зонд, который срабатывает в начале двухфазного этапа контрольной точки.
twophase-checkpoint-done()Зонд, который срабатывает по завершении двухфазного этапа контрольной точки.
buffer-read-start(ForkNumber, BlockNumber, Oid, Oid, Oid, int, bool)Зонд, который срабатывает в начале чтения из буфера. arg0 и arg1 содержат номера ветви и блока этой страницы (но arg1 будет равен -1, если это запрос на расширение отношения). arg2, arg3 и arg4 содержат идентификаторы табличного пространства, базы данных и отношения, которые определяют это отношение. В arg5 передается идентификатор обслуживающего процесса, создавшего временной отношение для локального буфера, или InvalidBackendId (-1) для разделяемого буфера. arg6 равен true для запроса на расширение отношения и false для обычного чтения.
buffer-read-done(ForkNumber, BlockNumber, Oid, Oid, Oid, int, bool, bool)Зонд, который срабатывает по завершении чтения из буфера. arg0 и arg1 содержат номера ветви и блока этой страницы (если это запрос на расширение отношения, то arg1 будет содержать номер только что добавленного блока). arg2, arg3 и arg4 содержат идентификаторы табличного пространства, базы данных и отношения, которые определяют это отношение. В arg5 передается идентификатор обслуживающего процесса, создавшего временной отношение для локального буфера, или InvalidBackendId (-1) для разделяемого буфера. arg6 равен true для запроса на расширение отношения и false для обычного чтения. arg7 равен true, если буфер был обнаружен в пуле, и false, если нет.
buffer-flush-start(ForkNumber, BlockNumber, Oid, Oid, Oid)Зонд, который срабатывает перед выдачей любого запроса на запись в разделяемый буфер. arg0 и arg1 содержат номера ветви и блока этой страницы. arg2, arg3 и arg4 содержат идентификаторы табличного пространства, базы данных и отношения, которые определяют это отношение.
buffer-flush-done(ForkNumber, BlockNumber, Oid, Oid, Oid)Зонд, который срабатывает по завершении запроса на запись. (Обратите внимание, что это отражает только время передачи данных ядру; обычно они еще не записаны на диск.) Аргументы те же, что и для buffer-flush-start.
buffer-write-dirty-start(ForkNumber, BlockNumber, Oid, Oid, Oid)Зонд, который срабатывает, когда серверный процесс начинает записывать в грязный буфер. (Если это происходит часто, значит, значение shared_buffers слишком мало или нужно настроить параметры, управляющие фоновым процессом записи.) arg0 и arg1 содержат номера ветви и блока этой страницы. arg2, arg3 и arg4 содержат идентификаторы табличного пространства, базы данных и отношения, которые определяют это отношение.
buffer-write-dirty-done(ForkNumber, BlockNumber, Oid, Oid, Oid)Зонд, который срабатывает по завершении записи в грязный буфер. Аргументы те же, что и для buffer-write-dirty-start.
wal-buffer-write-dirty-start()Зонд, который срабатывает, когда серверный процесс начинает запись в грязный буфер WAL, потому что в буферах WAL не осталось места. (Если это происходит часто, значит, значение wal_buffers слишком мало.)
wal-buffer-write-dirty-done()Зонд, который срабатывает по завершении записи в грязный буфер WAL.
wal-insert(unsigned char, unsigned char)Зонд, который срабатывает при добавлении записи в WAL. В arg0 передается идентификатор менеджера ресурсов (rmid) для записи. arg1 содержит информационные флаги.
wal-switch()Зонд, который срабатывает при запросе на переключение сегмента WAL.
smgr-md-read-start(ForkNumber, BlockNumber, Oid, Oid, Oid, int)Зонд, который срабатывает в начале чтения блока из отношения. arg0 и arg1 содержат номера ветви и блока этой страницы. arg2, arg3 и arg4 содержат идентификаторы табличного пространства, базы данных и отношения, которые определяют это отношение. В arg5 передается идентификатор обслуживающего процесса, создавшего временной отношение для локального буфера, или InvalidBackendId (-1) для разделяемого буфера.
smgr-md-read-done(ForkNumber, BlockNumber, Oid, Oid, Oid, int, int, int)Зонд, который срабатывает по завершении чтения блока. arg0 и arg1 содержат номера ветви и блока этой страницы. arg2, arg3 и arg4 содержат идентификаторы табличного пространства, базы данных и отношения, которые определяют это отношение. В arg5 передается идентификатор обслуживающего процесса, создавшего временной отношение для локального буфера, или InvalidBackendId (-1) для разделяемого буфера. В arg6 передается количество фактически прочитанных байтов, тогда как в arg7 — количество запрошенных байтов (если эти значения различаются, это говорит о наличии проблем).
smgr-md-write-start(ForkNumber, BlockNumber, Oid, Oid, Oid, int)Зонд, который срабатывает в начале записи блока в отношение. arg0 и arg1 содержат номера ветви и блока этой страницы. arg2, arg3 и arg4 содержат идентификаторы табличного пространства, базы данных и отношения, которые определяют это отношение. В arg5 передается идентификатор обслуживающего процесса, создавшего временной отношение для локального буфера, или InvalidBackendId (-1) для разделяемого буфера.
smgr-md-write-done(ForkNumber, BlockNumber, Oid, Oid, Oid, int, int, int)Зонд, который срабатывает по завершении записи блока. arg0 и arg1 содержат номера ветви и блока этой страницы. arg2, arg3 и arg4 содержат идентификаторы табличного пространства, базы данных и отношения, которые определяют это отношение. В arg5 передается идентификатор обслуживающего процесса, создавшего временной отношение для локального буфера, или InvalidBackendId (-1) для разделяемого буфера. В arg6 передается количество фактически записанных байтов, тогда как в arg7 — количество запрошенных байтов (если эти значения различаются, это говорит о наличии проблем).
sort-start(int, bool, int, int, bool, int)Зонд, который срабатывает в начале операции сортировки. В arg0 передается сортировка кучи, индекса или элемента данных. arg1 равен true для анализа уникальных данных. В arg2 передается количество ключевых столбцов. arg3 — количество килобайт доступной рабочей памяти. arg4 равен true, если требуется произвольный доступ к результату сортировки. В arg5 значение 0 указывает на последовательный рабочий процесс, 1 — на параллельный, а 2 — на ведущий процесс в параллельной группе.
sort-done(bool, long)Зонд, который срабатывает по завершении сортировки. arg0 равен true для внешней сортировки и false для внутренней. В arg1 передается количество дисковый блоков, использованных для внешней сортировки, или килобайтов памяти, использованных для внутренней сортировки.
lwlock-acquire(char *, LWLockMode)Зонд, который срабатывает при получении блокировки LWLock. В arg0 передается транш LWLock. В arg1 — запрошенный режим блокировки: эксклюзивная или совместная.
lwlock-release(char *)Зонд, который срабатывает при освобождении блокировки LWLock (но обратите внимание, что никакие освобожденные ждущие процессы еще не пробуждены). В arg0 передается транш LWLock.
lwlock-wait-start(char *, LWLockMode)Зонд, который срабатывает, когда блокировка LWLock не доступна моментально и серверный процесс начинает ждать ее освобождения. В arg0 передается транш LWLock. В arg1 — запрошенный режим блокировки: эксклюзивная или совместная.
lwlock-wait-done(char *, LWLockMode)Зонд, который срабатывает при освобождении серверного процесса от ожидания LWLock (но фактически он блокировку еще не получил). В arg0 передается транш LWLock. В arg1 — запрошенный режим блокировки: эксклюзивная или совместная.
lwlock-condacquire(char *, LWLockMode)Зонд, который срабатывает при успешном получении LWLock, когда запросивший ее процесс указал режим без ожидания. В arg0 передается транш LWLock. В arg1 — запрошенный режим блокировки: эксклюзивная или совместная.
lwlock-condacquire-fail(char *, LWLockMode)Зонд, который срабатывает, если LWLock не была успешно получена, когда запросивший ее процесс указал режим без ожидания. В arg0 передается транш LWLock. В arg1 — запрошенный режим блокировки: эксклюзивная или совместная.
lock-wait-start(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, LOCKMODE)Зонд, который срабатывает, когда запрос на тяжелую блокировку (блокировку lmgr) переходит в состояние ожидания, потому что эта блокировка недоступна. В аргументах с arg0 по arg3 передаются поля тегов, идентифицирующие блокируемый объект. arg4 указывает тип блокируемого объекта. arg5 указывает тип запрошенной блокировки.
lock-wait-done(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, LOCKMODE)Зонд, который срабатывает, когда запрос на тяжелую блокировку (lmgr lock) завершает ожидание (т. е. получил эту блокировку). Аргументы те же, что и для lock-wait-start.
deadlock-found()Зонд, который срабатывает при обнаружении взаимной блокировки детектором взаимоблокировок.

Таблица 48. Определенные типы, используемые в параметрах зондов

ТипОпределение
LocalTransactionIdunsigned int
LWLockModeint
LOCKMODEint
BlockNumberunsigned int
Oidunsigned int
ForkNumberint
boolunsigned int

Использование зондов

В приведенном ниже примере показан скрипт DTrace для анализа числа транзакций в системе, как альтернатива созданию снимка pg_stat_database до и после теста производительности:

#!/usr/sbin/dtrace -qs

qhb$1:::transaction-start
{
      @start["Start"] = count();
      self->ts  = timestamp;
}

qhb$1:::transaction-abort
{
      @abort["Abort"] = count();
}

qhb$1:::transaction-commit
/self->ts/
{
      @commit["Commit"] = count();
      @time["Total time (ns)"] = sum(timestamp - self->ts);
      self->ts=0;
}

После выполнения D-скрипт в этом примере выдает результат вида:

# ./txn_count.d `pgrep -n qhb` or ./txn_count.d <PID>
^C

Start                                          71
Commit                                         70
Total time (ns)                        2312105013

Примечание
В SystemTap используется отличная от DTrace запись для скриптов трассировки, хотя лежащие в их основе точки трассировки совместимы. Однако стоит отметить, что на момент написания этого раздела скрипты SystemTap должны обращаться к зондам, обрамляя их имена двойными подчеркиваниями, а не дефисами. Ожидается, что в будущих релизах SystemTap это будет исправлено.

Следует помнить, что скрипты DTrace должны быть аккуратно написаны и отлажены, иначе собранная трассировочная информация может оказаться бессмысленной. В большинстве случаев причиной обнаруженных проблем является инструментарий, а не лежащая в основе система. При обсуждении информации, полученной с использованием динамической трассировки, обязательно прилагайте скрипт, с помощью которого они были получены, чтобы его тоже можно было проверить и обсудить.


Определение новых зондов

Новые зонды можно определить в любом месте кода, где пожелает разработчик, однако это потребует перекомпиляции. Ниже приведены шаги, которые необходимо предпринять для добавления новых зондов:

  1. Определиться с именами проб и данными, которые должны стать доступными благодаря этим зондам

  2. Добавить описания зондов в /usr/local/qhb/backend/utils/probes.d

  3. Включить pg_trace.h, если его еще нет в модуле (или модулях), содержащих точки зондов, и добавить зондовый макрос TRACE_QHB в желаемые места в исходном коде

  4. Перекомпилировать и убедиться, что новые зонды доступны

Пример:

Ниже приведен пример того, как можно добавить зонд для трассировки всех новых транзакций по их идентификатору.

  1. Решаем, что зонд будет называться transaction-start и принимать параметр типа LocalTransactionId

  2. Добавляем определение зонда в /usr/local/qhb/backend/utils/probes.d:

    probe transaction__start(LocalTransactionId);
    

    Обратите внимание на использование двойного подчеркивания в имени зонда. В скрипте DTrace, использующем этот зонд, двойное подчеркивание следует заменить на дефис, поэтому в документации для пользователей именем этого зонда будет transaction-start.

  3. Во время компиляции transaction__start преобразуется в макрос с именем TRACE_QHB_TRANSACTION_START (заметьте, что здесь подчеркивание одинарное), который доступен в результате включения pg_trace.h. Добавляет вызов этого макроса в подходящее место в исходном коде. В данном случае это будет выглядеть примерно так:

    TRACE_QHB_TRANSACTION_START(vxid.localTransactionId);
    
  4. После перекомпиляции и запуска нового двоичного файла выполняем следующую команду DTrace для проверки, что только что добавленный зонд доступен. Вывод будет выглядеть примерно так:

    # dtrace -ln transaction-start
       ID    PROVIDER      MODULE           FUNCTION NAME
    18705    qhb49878       qhb     StartTransactionCommand transaction-start
    18755    qhb49877       qhb     StartTransactionCommand transaction-start
    18805    qhb49876       qhb     StartTransactionCommand transaction-start
    18855    qhb49875       qhb     StartTransactionCommand transaction-start
    18986    qhb49873       qhb     StartTransactionCommand transaction-start
    

При добавлении макросов трассировки в код на языке C/RUST следует позаботиться о нескольких вещах:

  • Следует позаботиться о том, чтобы типы данных, указанные в параметрах зонда, совпадали с типами данных переменных, используемых в макросе. Иначе вы получите ошибки при компиляции.

  • На большинстве платформ, если QHB собрана с указанием --enable-dtrace, аргументы макроса трассировки будут вычисляться каждый раз, когда макрос получает управление, даже если трассировка не производится. Обычно об этом не нужно беспокоиться, если вы просто возвращаете значения нескольких локальных переменных. Но избегайте помещения в эти аргументы затратных вызовов функций. Если это все-таки необходимо, попробуйте защитить макрос проверкой, чтобы понять, действительно ли включена трассировка:

    if (TRACE_QHB_TRANSACTION_START_ENABLED())
        TRACE_QHB_TRANSACTION_START(some_function(...));
    

    У каждого макроса трассировки есть соответствующий макрос ENABLED.



Метрики QHB

Общие сведения

В настоящее время все метрики в QHB собираются на уровне всего кластера баз данных и относятся ко всему набору процессов QHB независимо от того, являются ли они фоновыми или поддерживающими пользовательские подключения. Также часть метрик собирается на уровне баз данных и на уровне бэкендов. Данные метрик отсылаются на коллектор и агрегатор метрик metricsd, краткое описание которого можно найти в главе Сервер метрик. Далее метрики агрегируются и записываются в Graphite, в качестве интерфейса к которому выступает Grafana.


Типы метрик

  • Gauge — неотрицательное целое значение. Может быть установлено, увеличено или уменьшено на заданное число.
  • Counter — неотрицательное целое значение. Может быть только увеличено на заданное число.
  • Timer — неотрицательное целое значение, длительность в наносекундах. Значение может быть только записано; во время агрегации вычисляется ряд статистических характеристик:
    • sum — сумма значений
    • count — количество записанных значений
    • max — максимальное из записанных значений
    • min — минимальное из записанных значений
    • mean — среднее арифметическое
    • median — медиана
    • std — стандартное квадратичное отклонение
    • при необходимости список перцентилей

Группы метрик

sys

К группе sys относятся различные системные метрики.

Сбор системных метрик регулируется двумя глобальными константами:

  • qhb_os_monitoring — логическая константа, по умолчанию значение off (выключена). При значении on выполняется периодический сбор метрик.
  • qhb_os_stat_period — период сбора системной статистики в секундах, по умолчанию 30 секунд.

Таблица 49. Метрики загрузки и ЦП

ИмяОписаниеТип
sys.load_average.1minload average за последнюю минутуgauge
sys.load_average.5minТо же, но за последние 5 минутgauge
sys.load_average.15minТо же, но за последние 15 минутgauge
sys.cpu.1minПроцент загрузки процессоров за последнюю минутуgauge
sys.cpu.5minТо же, но за последние 5 минутgauge
sys.cpu.15minТо же, но за последние 15 минутgauge

Примечание
Значения метрик load average содержат значения с точностью до сотых, однако при передаче данных в силу технических особенностей исходные значения умножаются на 100 и передаются как целые числа. Поэтому при выводе данных следует учитывать эту особенность и делить значения на 100.

load average — усредненное количество исполняемых и ожидающих потоков за заданный интервал времени (1, 5 и 15 минут). Обычно соответствующие значения выводятся с помощью команд uptime, top или cat /proc/loadavg. Подробную информацию об особенностях, связанными с этим показателем, можно найти в переводе статьи Load Average в Linux.

Если значение этого показателя за последнюю минуту больше, чем за последние 5 и 15 минут, нагрузка растет, если меньше — падает. Однако этот показатель важен не сам по себе, а относительно общего числа процессоров. Дополнительные и производные от load average метрики по загрузке процессоров sys.cpu.Nmin показывают приблизительный процент загрузки процессоров с учетом их количества и рассчитываются по следующей упрощенной формуле:

sys.cpu.<N>min = sys.load_average.<N>min / cpu_count * 100

где cpu_count — количество процессоров в системе, а N принимает значения 1, 5 или 15.

Количество процессоров рассчитывается как произведение количества физических сокетов, ядер на сокет и нитей на ядро. Команда lscpu выводит все необходимые данные. Например:

Thread(s) per core:              2
Core(s) per socket:              4
Socket(s):                       1

В данном случае cpu_count = 2 * 4 * 1 = 8.

Альтернативным и более простым методом может быть получение этого значения через команду nproc.

Таким образом, в данном случае загрузка в 100% будет достигнута, если величина load average будет стремиться к 8. Однако эти расчеты и значения будут иметь довольно приблизительный и даже условный характер, что показывает приведенная выше по ссылке статья.

Таблица 50. Метрики использования памяти

ИмяОписаниеТип
sys.mem.totalОбщий размер установленной памяти RAMgauge
sys.mem.usedИспользуемая памятьgauge
sys.mem.freeНеиспользуемая памятьgauge
sys.mem.availableПамять, доступная для запускаемых приложений (не включая swap, но учитывая потенциально освобождаемую память, занимаемую страничным кэшем)gauge
sys.swap.totalОбщий размер файла подкачкиgauge
sys.swap.freeНеиспользуемая память файла подкачкиgauge

Значения метрик соответствуют полям из вывода утилиты free (значения отображаются в килобайтах, т. е. соответствуют выводу free -k).

Таблица 51. Соответствие значений метрик полям вывода утилиты free

МетрикаПоле утилиты free
sys.mem.totalMem:total
sys.mem.usedMem:used
sys.mem.freeMem:free
sys.mem.availableMem:available
sys.swap.totalSwap:total
sys.swap.freeSwap:free

Величину, соответствующую выводимому в утилите free значению Mem:buff/cache, можно рассчитать по формуле:

Mem:buff/cache = Mem:total - Mem:used - Mem:free

Таким образом, в Grafana можно, используя функцию diffSeries, рассчитывать и выводить это значение на основании других имеющихся данных.

Значение Mem:shared (данные виртуальной файловой системы tmpfs) через метрики не выводится.

Значение Swap:used можно рассчитать по формуле:

Swap:used = Swap:total - Swap:free

Это значение также можно выводить в Grafana в виде рассчитываемой величины через функцию diffSeries.

Более подробное описание этих показателей можно получить через справочную систему операционной системы для утилиты free (Для этого вызовите man free).

Таблица 52. Метрики использования дискового пространства

ИмяОписаниеТип
sys.disk_space.totalОбъем дисковой системы, на которой находится каталог с данными (в байтах)gauge
sys.disk_space.freeСвободное пространство в дисковой системе, на которой находится каталог с данными (в байтах)gauge

Метрики относятся к дисковой системе, на которой расположен каталог с файлами базы данных. Этот каталог определяется параметром командной строки -D при запуске базы данных либо переменной среды $PGDATA. Параметр data_directory в файле конфигурации qhb.conf может переопределять расположение каталога с данными.

Таблица 53. Другие системные метрики

ИмяОписаниеТип
sys.processesОбщее количество запущенных в системе процессовgauge
sys.uptimeКоличество секунд, прошедших с начала запуска системыgauge

db_stat

К группе db_stat относятся метрики чтения и записи блоков на уровне экземпляра QHB.

Таблица 54. Метрики чтения и записи блоков

ИмяОписаниеТип
qhb.db_stat.numbackendsКоличество активных серверных процессовgauge
qhb.db_stat.blocks_fetchedКоличество блоков, полученных при чтенииcounter
qhb.db_stat.blocks_hitКоличество блоков, найденных в кэше при чтенииcounter
qhb.db_stat.blocks_read_timeВремя чтения блоков, в миллисекундахcounter
qhb.db_stat.blocks_write_timeВремя записи блоков, в миллисекундахcounter
qhb.db_stat.conflicts.tablespaceКоличество запросов, отмененных из-за удаленных табличных пространствcounter
qhb.db_stat.conflicts.lockКоличество запросов, отмененных из-за тайм-аутов блокировокcounter
qhb.db_stat.checksum_failuresКоличество несовпадений контрольной суммы страницы данныхcounter
qhb.db_stat.conflicts.snapshotКоличество запросов, отмененных из-за устаревших снимков состоянияcounter
qhb.db_stat.conflicts.bufferpinКоличество запросов, отмененных из-за закрепленных буферовcounter
qhb.db_stat.conflicts.startup_deadlockКоличество запросов, отмененных из-за взаимных блокировокcounter
qhb.db_stat.tuples.returnedКоличество строк, полученных при последовательном сканированииcounter
qhb.db_stat.tuples.fetchedКоличество строк, полученных при сканировании по индексуcounter
qhb.db_stat.tuples.insertedКоличество строк, добавленных в базу данныхcounter
qhb.db_stat.tuples.updatedКоличество строк, измененных в базе данныхcounter
qhb.db_stat.tuples.deletedКоличество строк, удаленных из базы данныхcounter

Также генерируются версии этих метрик по базам данных и отдельным бэкендам. В имена метрик включается идентификатор базы данных, например, qhb.db_stat.db_16384.numbackends, или (для некоторых метрик) номер процесса, например: qhb.db_stat.34567.blocks_fetched. Данная группа метрик может генерировать большие объемы данных, поэтому администратор должен решить, действительно ли необходимо оставлять эту группу метрик включенной.

На основании метрик qhb.db_stat.blocks_fetched и qhb.db_stat.blocks_hit рассчитывается коэффициент попадания в кэш:

k = blocks_hit / blocks_fetched * 100%

Хорошим уровнем обычно считается значение более 90%. Если значение коэффициента существенно ниже этой отметки, желательно рассмотреть возможность увеличения объема буферного кэша.


bgwr

К группе bgwr относятся метрики фонового процесса записи.

Таблица 55. Метрики фонового процесса записи

ИмяОписаниеТип
qhb.bgwr.checkpoints_timedКоличество запланированных контрольных точек, которые были выполненыcounter
qhb.bgwr.checkpoints_reqКоличество запрошенных контрольных точек, выполненных вне очереди запланированныхcounter
qhb.bgwr.checkpoint_write_timeВремя, потраченное на этап обработки контрольной точки, где файлы записываются на диск, в миллисекундахcounter
qhb.bgwr.checkpoint_sync_timeВремя, потраченное на этап обработки контрольной точки, где файлы синхронизируются с диском, в миллисекундахcounter
qhb.bgwr.buffers_checkpointКоличество буферов, записанных во время контрольных точекcounter
qhb.bgwr.buffers_cleanКоличество буферов, записанных фоновым процессом записиcounter
qhb.bgwr.maxwritten_cleanСколько раз фоновый процесс записи останавливал сброс грязных страниц, поскольку записывал слишком много буферовcounter
qhb.bgwr.buffers_backendКоличество буферов, записанных непосредственно обслуживающим процессомcounter
qhb.bgwr.buffers_backend_fsyncСколько раз обслуживающий процесс вызывал fsync сам (обычно их обрабатывает фоновый процесс записи, даже когда обслуживающий процесс выполняет запись самостоятельно)counter
qhb.bgwr.buffers_allocКоличество выделенных буферовcounter

Данные по перечисленным метрикам отображаются в разделе «Контрольные точки и операции с буферами» информационной панели QHB. Обычно при выполнении запланированных контрольных точек сначала происходит запись информации о начале контрольной точки, затем в течение некоторого времени идет сброс блоков на диск и по окончании контрольной точки фиксируется информация о продолжительности записи и синхронизации данных. В случае обработки запланированной контрольной точки запись блоков равномерно распределяется во времени согласно параметрам настройки, чтобы снизить влияние этого процесса на общий ввод/вывод. При контрольных точках, запрошенных через команду, сброс блоков происходит сразу, без искусственной задержки.

Также генерируются версии этих метрик по базам данных. В имена метрик включается идентификатор базы данных, например: qhb.bgwr.db_16384.buffers_backend.


mem_stat

К группе mem_stat относятся метрики для отслеживания размера памяти work area.

Память work area может быть приблизительно описана как память, используемая внутренними операциями сортировки и хеш-таблицами. Размер этой памяти контролируется глобальным параметром конфигурации work_mem: при превышении лимита вместо оперативной памяти начинают использоваться временные файлы на диске. Параметр work_mem ограничивает память, используемую единичной операцией.

В группу mem_stat входит три разновидности метрик с общим именем work_area:

  • qhb.mem_stat.work_area — показывает общий размер work area в байтах всего кластера
  • qhb.mem_stat.db_<номер>.work_area — показывает размер work area в байтах для одной базы данных
  • qhb.mem_stat..work_area — показывает размер work area в байтах для одного рабочего процесса

Метрики второй и третьей разновидностей создаются динамически.

Все метрики типа gauge, то есть их значения могут уменьшаться по мере освобождения ранее занятой памяти.


temp_stat

К группе temp_stat относятся метрики по временным файлам и таблицам QHB.

Таблица 56. Метрики по временным файлам и таблицам

ИмяОписаниеТип
qhb.temp_stat.temp_filesКоличество временных файлов, созданных за период агрегацииcounter
qhb.temp_stat.temp_bytesОбщий объем временных файлов, созданных за период агрегации, в байтахcounter
qhb.temp_stat.temp_tablesКоличество временных таблиц, созданных за период агрегацииcounter
qhb.temp_stat.temp_table_bytesОбщий объем временных таблиц, созданных за период агрегации, в байтахcounter

Данные собираются за период агрегации коллектора метрик. Обновление данных происходит по окончании соответствующей операции, например, при создании временной таблицы с указанием DROP ON COMMIT обновление статистики произойдет после выполнения команды COMMIT при удалении временной таблицы. В некоторых случаях объем, занимаемый временными файлами и таблицами, может быть весьма существенным.

Также генерируются версии этих метрик по базам данных. В имена метрик включается идентификатор базы данных, например: qhb.temp_stat.db_16384.temp_bytes.


wal

К группе wal относятся метрики процесса архивации журнала упреждающей записи.

Таблица 57. Метрики процесса архивации WAL

ИмяОписаниеТип
qhb.wal.archivedКоличество успешно выполненных операций архивации файлов журнала упреждающей записиcounter
qhb.wal.failedКоличество попыток архивации, завершившихся сбоемcounter
qhb.wal.archive_timeВремя, потраченное на копирование файлов журналов, в наносекундахcounter

Эти метрики работают в том случае, если настроена архивация журнала упреждающей записи. Для этого необходимо установить параметр archive_mode в значение on (включен) и определить команду архивации в параметре archive_command.


transaction

К группе transaction относятся метрики по транзакциям.

Таблица 58. Метрики по транзакциям

ИмяОписаниеТип
qhb.transaction.commitКоличество фиксаций транзакцийcounter
qhb.transaction.rollbackКоличество откатов транзакцийcounter
qhb.transaction.deadlocksКоличество взаимоблокировокcounter

Данные метрик собираются непосредственно при выполнении команд завершения и отмены транзакций на уровне всего кластера баз данных, на уровне отдельных баз данных и на уровне бэкендов.

Коэффициент подтверждения транзакций рассчитывается как процентное отношение фиксаций транзакций к сумме фиксаций и откатов транзакций:

k = commit/(commit + rollback)*100%

Обычно значение стремится к 100%, поскольку чаще всего транзакции завершаются успешно. Существенная доля откатившихся транзакций может говорить о том, что в системе существуют проблемы.

Взаимоблокировки возникают, когда различные сеансы взаимно ожидают освобождения заблокированных данных. В этом случае после автоматического определения взаимоблокировки происходит откат одной из транзакций.


wait

К группе wait относятся метрики событий ожидания.

Данный набор метрик полностью соответствует набору стандартных событий ожидания. Метрики имеют префикс qhb.wait. Далее в наименовании идет класс события ожидания и через точку название события ожидания. В текущем релизе имена метрик ограничены в размере и имеют в наименовании максимум 31 символ. Все метрики по событиям ожидания имеют тип counter, однако значение отражает промежуток времени в микросекундах, который эти ожидания заняли в совокупности во всех сеансах за период сбора.

Примечание
Если в течение периода наблюдения работало множество пользовательских подключений, которые находились в состоянии ожидания, суммарное значение времени ожидания может многократно превысить этот период. Например, если в течение 10 секунд 1000 сеансов провели в ожиданиях по одной секунде, суммарное время ожидания составит 1000 секунд.

Метрики с типами событий ожидания Lock, LWLock, IO и IPC отображаются в разделе «События ожидания» информационной панели QHB. Значения метрик выводятся в микросекундах (автоматически переводясь в другие единицы при увеличении значений). На существующих графиках выводятся не все события ожиданий, а только по пять самых значимых по величине на каждом графике. Разные события ожиданий могут иметь сильно отличающиеся по величине продолжительности. Значительные колебания значений могут отражать возникающие проблемы.

Таблица 59. Наиболее значимые события ожидания

Имя события ожиданияОписание
Lock.extendОжидание расширения отношения. Становится заметным при активном росте таблиц. Необходимость выделения новых блоков приводит к некоторым задержкам, которые отражаются в этой метрике.
Lock.transactionidОжидание завершения транзакции. Событие ожидания возникает в том случае, если транзакция вынуждена ждать окончания обработки предыдущих транзакций, которые также получают подтверждение своего окончания.
Lock.tupleОжидание получения блокировки для кортежа. Возникает в случае одновременной работы с теми же данными нескольких транзакций.
LWLock.WALWriteLockОжидание записи буферов WAL на диск. Часто является лидером среди событий ожиданий этого типа, так как операции с диском являются наиболее медленными в этой группе событий ожидания.
LWLock.wal_insertОжидание вставки WAL в буфер памяти.
LWLock.buffer_contentОжидание чтения или записи страницы данных в памяти. Возникает и становится существенным при интенсивном вводе/выводе.
LWLock.buffer_mappingОжидание связывания блока данных с буфером в буферном пуле.
LWLock.lock_managerОжидание добавления или проверки блокировок для обслуживающих процессов. Событие становится значимым при частых транзакциях.

bufmgr

К группе bufmgr относятся метрики буферного менеджера, касающиеся механизмов управления памятью. Сбор метрик проводится при операциях чтения данных.

Таблица 60. Метрики буферного менеджера

ИмяОписаниеТипАгрегат
qhb.bufmgr.BufferAllocСколько раз проводился поиск буфераtimercount
qhb.bufmgr.BufferAllocОбщее время, потраченное на поиск буфераtimersum
qhb.bufmgr.happy_pathСколько раз буфер нашелся сразуtimercount
qhb.bufmgr.happy_pathОбщее время, потраченное на поиск, когда буфер нашелся сразуtimersum
qhb.bufmgr.cache_missКоличество промахов кэша буферовtimercount
qhb.bufmgr.cache_missОбщее время, потраченное на обработку промахов кэша буферовtimersum
qhb.bufmgr.disk_readКоличество чтений страницы с диска (асинхронно)timercount
qhb.bufmgr.flush_dirtyКоличество выгрузок страницы на диск (асинхронно)timercount
qhb.bufmgr.retry_counterКоличество повторных обработок промахаcounter
qhb.bufmgr.strategy_pop_cntСколько раз срабатывала специальная стратегия получения или вытеснения буфераcounter
qhb.bufmgr.strategy_reject_cntКоличество забракованных буферов, предложенных специальной стратегиейcounter
tarq_cache.allocateСколько раз проводился поиск в TARQtimercount
tarq_cache.allocateОбщее время, потраченное на поиск в TARQtimersum
tarq_cache.allocate_newСколько раз выбирался исключаемый блок в TARQtimercount
tarq_cache.rollbackКоличество откатов вытеснения в TARQtimercount
tarq_cache.rollbackОбщее время, потраченное на откаты вытеснения в TARQtimersum
tarq_cache.touchОбщее время, потраченное на учет популярных страниц в TARQtimersum

queryid

К группе queryid относятся метрики, предоставляющие возможность отслеживать статистику планирования и выполнения сервером всех (почти) операторов SQL.

Эта группа отличается тем, что входящие в нее метрики создаются динамически при начале обработки движком нового оператора. В имена новых метрик добавляется уникальное имя или ID запроса. Например, метрика qhb.queryid.c92e145f160e7b9e.exec_calls отражает количество исполнений некоторого оператора SQL. Текст самого оператора можно получить из новой системной таблицы qhb_queryid запросом вида SELECT * FROM qhb_queryid WHERE qid = 'c92e145f160e7b9e'.

Подробнее настройка метрик группы queryid описана в разделе Настройка метрик queryid.

Таблица 62. Метрики queryid

ИмяОписаниеТип
qhb.queryid.id.plan_callsЧисло планирований оператораcounter
qhb.queryid.id.total_plan_timeОбщее время, затраченное на планирование оператора, в наносекундахcounter
qhb.queryid.id.min_plan_timeМинимальное время, затраченное на планирование оператора, в наносекундахgauge
qhb.queryid.id.max_plan_timeМаксимальное время, затраченное на планирование оператора, в наносекундахgauge
qhb.queryid.id.mean_plan_timeСреднее время, затраченное на планирование оператора, в наносекундахgauge
qhb.queryid.id.stddev_plan_timeСтандартное отклонение времени, затраченного на планирование оператора, в наносекундахgauge
qhb.queryid.id.exec_callsЧисло выполнений оператораcounter
qhb.queryid.id.total_exec_timeОбщее время, затраченное на выполнение оператора, в наносекундахcounter
qhb.queryid.id.min_exec_timeМинимальное время, затраченное на выполнение оператора, в наносекундахgauge
qhb.queryid.id.max_exec_timeМаксимальное время, затраченное на выполнение оператора, в наносекундахgauge
qhb.queryid.id.mean_exec_timeСреднее время, затраченное на выполнение оператора, в наносекундахgauge
qhb.queryid.id.stddev_exec_timeСтандартное отклонение времени, затраченного на выполнение оператора, в наносекундахgauge
qhb.queryid.id.shared_blks_hitОбщее количество попаданий в разделяемый кэш блоков для этого оператораcounter
qhb.queryid.id.shared_blks_readОбщее количество прочтений разделяемых блоков для этого оператораcounter
qhb.queryid.id.shared_blks_dirtiedОбщее количество разделяемых блоков, «загрязненных» этим операторомcounter
qhb.queryid.id.shared_blks_writtenОбщее количество разделяемых блоков, записанных этим операторомcounter
qhb.queryid.id.local_blks_hitОбщее количество попаданий в локальный кэш блоков для этого оператораcounter
qhb.queryid.id.local_blks_readОбщее количество прочтений локальных блоков для этого оператораcounter
qhb.queryid.id.local_blks_dirtiedОбщее количество локальных блоков, «загрязненных» этим операторомcounter
qhb.queryid.id.local_blks_writtenОбщее количество локальных блоков, записанных этим операторомcounter
qhb.queryid.id.temp_blks_readОбщее количество прочтений временных блоков для этого оператораcounter
qhb.queryid.id.temp_blks_writtenОбщее количество временных блоков, записанных этим операторомcounter
qhb.queryid.id.exec_rowsОбщее количество строк, полученных или затронутых этим операторомcounter
qhb.queryid.id.blk_read_timeОбщее время, затраченное оператором на чтение блоков, в миллисекундах (если включен track_io_timing; иначе 0)counter
qhb.queryid.id.blk_write_timeОбщее время, затраченное оператором на запись блоков, в миллисекундах (если включен track_io_timing; иначе 0)counter
qhb.queryid.id.wal_recordsОбщее количество записей WAL, сгенерированных этим операторомcounter
qhb.queryid.id.wal_fpiОбщее количество образов полных страниц WAL, сгенерированных этим операторомcounter
qhb.queryid.id.wal_bytesОбщий объем WAL, сгенерированный этим оператором, в байтахcounter

Метрики пула соединений QCP

Ниже представлены метрики пула соединений, характеризующие работу пула. Сбор метрик проводится при операциях выполнения запроса.

Таблица 63. Метрики пула соединений QCP

ИмяОписаниеТип
qcp.queueКоличество запросов в очереди на данный моментgauge
qcp.obtain_backendВремя ожидания назначения обслуживающего процесса для исполнения запроса клиентаtimer
qcp.obtain_backend_failedПревышено максимальное время ожидания назначения обслуживающего процесса для исполнения запроса клиентаtimer
<адрес субд>.in_useКоличество используемых подключений (обслуживающих процессов) к СУБДgauge

Включение и выключение записи значений для групп метрик

В QHB имеется механизм, который позволяет включать и выключать отправку групп метрик. В каталоге данных расположен файл конфигурации metrics_config.toml, в котором каждая строка соответствует группе метрик:

[is_enabled]
default = true
sys = true
db_stat = true
bgwr = true
wal = true
transaction = true
wait = true
bufmgr = true
mem_stat = false
temp_stat = true
queryid = false

Переменные принимают значения true (отправка метрик группы разрешена) или false (отправка запрещена).

Таблица 64. Настройка записи значений для групп метрик

Группа метрикОписаниеЗначение по умолчанию
defaultГруппа по умолчанию (различные метрики, не выделенные в отдельные группы)true
sysМетрики операционной системыtrue
db_statМетрики чтения и записи блоковtrue
bgwrМетрики фонового процесса записиtrue
mem_statМетрики размера памяти «work area»true
temp_statМетрики по данным временных файлов и таблицtrue
walМетрики архивации файлов WALtrue
transactionМетрики транзакцийtrue
waitМетрики событий ожиданияtrue
bufmgrМетрики механизмов управления памятьюtrue
queryidМетрики планирования и выполнения сервером операторов SQLfalse

Примечание
Для сбора метрик операционной системы необходимо также установить в параметре qhb_os_monitoring значение on (включен).

Для просмотра списка групп метрик и их текущего состояния можно воспользоваться SQL-функцией metrics_config_show. Пример вывода этой функции:

SELECT * FROM metrics_config_show();
 group_name  | enabled
-------------+---------
 bgwr        | t
 bufmgr      | t
 db_stat     | t
 default     | t
 mem_stat    | f
 queryid     | f
 sys         | t
 temp_stat   | t
 transaction | t
 wait        | t
 wal         | t
(11 rows)

Помимо задания значений настроек через файл параметров, имеется возможность менять эти значения через функции. Изменения сразу же отображаются в файле конфигурации.

Таблица 65. Функции включения и выключения отправки метрик

Функция
Описание
metrics_config_enable_group ( group_name: cstring, respect_transient_settings: boolean ) → void
Включает отправку значений для метрик заданной группы.
metrics_config_disable_group ( group_name: cstring, respect_transient_settings: boolean ) → void
Выключает отправку значений для метрик заданной группы.
metrics_config_transient_set ( backend_pid: int4, group_name: cstring, option_value: boolean ) → void
Устанавливает временную возможность отправки значений группы метрик для заданного обслуживающего процесса.

С помощью второго параметра respect_transient_settings в функциях metrics_config_enable_group и metrics_config_disable_group можно указать, отдавать ли приоритет параметрам отправки групп метрик, установленным на уровне отдельных обслуживающих процессов.

С помощью функции metrics_config_transient_set можно включить или выключить отправку значений заданной группы метрик для конкретного обслуживающего процесса. Настройка будет действовать в течение всего времени жизни обслуживающего процесса либо до вызова функции metrics_config_enable_group или metrics_config_disable_group со вторым параметром respect_transient_settings = false, который в данном случае распространит действие команды также на те обслуживающие процессы, в которых устанавливалось собственное значение параметров.

При запуске обслуживающего процесса с идентификатором, использовавшимся ранее, для данного идентификатора обнуляются все временные настройки.

Примечание
Все сказанное о выключении записи групп метрик не касается метрик, которые передаются через SQL-функции. При использовании этих функций метрики записываются всегда.



Информационные панели метрик QHB для Grafana

Информационные панели (dashboards) QHB для Grafana расположены в репозитории по следующей ссылке.

QHB поставляется совместно с сервером метрик, который записывает данные метрик в Graphite. Интерфейсом к этим метрикам служит Grafana. Текущий набор информационных панелей для Grafana поставляется в качестве самодокументируемых образцов, на основе которых пользователи при необходимости могут самостоятельно создать панели, более соответствующие их потребностям. Разумеется, поставляемые панели можно использовать и в исходном виде.


Импорт информационных панелей

Экспорт JSON-описания информационных панелей выполнен в Grafana 6.7.2.

Перед импортом JSON-описания необходимо решить, будут ли названия метрик содержать в качестве префикса имя хоста. Именно таким образом устроены наименования метрик внутри панелей, и этот вариант рекомендуется оставить. В начале имен метрик добавлена переменная $server_name, по умолчанию для нее выбрано значение your_host_name. Перед импортом можно заменить в JSON-файлах это значение на наименование одного из хостов. В дальнейшем в этой переменной через интерфейс Grafana можно будет добавить через запятую все имена хостов, с которых будут собираться метрики. Это позволит быстро переключаться при просмотре метрик с одного хоста на другой. Если такая схема использоваться не будет (в случае, если будут просматриваться метрики с единственного хоста), можно удалить в файлах JSON во всех именах метрик префикс $server_name до проведения импорта описания JSON. Однако это более трудоемкий вариант и его выбирать не рекомендуется.

Для импорта описаний информационных панелей необходимо выполнить следующие шаги:

  1. В меню Dashboards вашего сайта Grafana выбрать пункт Manage.
  2. В открывшемся списке папок и панелей выбрать существующую или создать новую папку.
  3. Находясь в выбранной папке, выбрать в правой верхней части страницы пункт Import.
  4. На открывшейся странице можно либо нажать справа вверху кнопку Upload json file и загрузить файл, либо вставить содержимое JSON-файла в поле под заголовком Or paste JSON и нажать кнопку Load.
  5. После этого нужно заполнить необходимые параметры и выполнить загрузку JSON-описания.
  6. При необходимости, отредактируйте наименование источника данных в модели JSON, заменив в описаниях информационных панелей значение поля datasource с Graphite на корректное значение. Более простым вариантом может быть смена имени источника данных на Graphite. Такой вариант будет предпочтительным, если источник данных до этого нигде больше не использовался.

Перечисленные выше пункты нужно повторить для каждой импортируемой панели.

Информационная панель «Операционная система»

Информационная панель представляет основные системные показатели:

  • Время работы экземпляра QHB;
  • Средняя загрузка;
  • Использование ОЗУ;
  • Использование памяти;
  • Использование дисковой системы, на которой расположен каталог баз данных.

Информационная панель «QHB»

Информационная панель содержит несколько разделов:

  • Транзакции;
  • Чтение и запись блоков;
  • События ожидания;
  • Контрольные точки и операции с буферами;
  • Архивация WAL.

В каждом разделе представлены наборы тематических панелей, отражающие основные показатели.

Примечание
По умолчанию теги различных событий не заданы, поэтому необходимо самостоятельно настроить вывод дополнительных аннотаций:

  • добавить необходимые комментарии к данным метрик функцией qhb_annotation (см. раздел Аннотации);
  • настроить вывод доступных аннотаций в информационной панели Grafana.


QHB-мониторинг для Zabbix

Пример использования сервера Zabbix 6.2 для мониторинга узла сети с QHB и агентом Zabbix.

Необходимые файлы:

  • template_db_qhb.yaml — файл шаблона «QHB by Zabbix agent», который нужно импортировать на сервер Zabbix 6.2;
  • template_db_qhb.conf — файл с пользовательскими параметрами агента Zabbix для опроса QHB;
  • каталог qhb/, содержащий SQL-файлы, к которым обращаются пользовательские параметры.

Архив для Zabbix 6.2 или выше расположен в репозитории по следующей ссылке.

Установка

Примечание
Более подробную информации см. в документации Zabbix по работе с шаблонами агента.

  1. Установите Zabbix-агент на узле сети с QHB

  2. Скопируйте каталог qhb/ в домашний каталог Zabbix-агента /var/lib/ zabbix. Если в /var/lib/ отсутствует каталог zabbix/, то его необходимо создать. Каталог qhb/ содержит SQL-файлы, необходимые для получения метрик из QHB:

    # mkdir -p /var/lib/zabbix/qhb
    # cd /var/lib/zabbix/qhb
    # wget <сервер>/zabbix/qhb/qhb.tar
    # tar -xvf qhb.tar
    # chmod -R 707 /var/lib/zabbix/qhb
    # rm -rf qhb.tar
    
  3. Скопируйте файл template_db_qhb.conf в конфигурационную директорию Zabbix-агента /etc/zabbix/zabbix_agentd.d/:

    # wget <сервер>/zabbix/template_db_qhb.conf
    
  4. Создайте пользователя zbx_monitor с правами «только чтение» и доступом к кластеру QHB:

    CREATE USER zbx_monitor WITH PASSWORD '<PASSWORD>' INHERIT;
    GRANT pg_monitor TO zbx_monitor;
    
  5. Отредактируйте файл qhb_hba.conf, чтобы разрешить подключение к Zabbix. Для этого откройте его в текстовом редакторе nano и вставьте в него следующие строки:

    host all zbx_monitor 127.0.0.1/32 trust
    
  6. Перезагрузите QHB и Zabbix-агент:

    # systemctl restart qhb
    # systemctl restart zabbix_agentd   
    
  7. Импортируйте файл template_db_qhb.yaml шаблона «QHB by Zabbix agent» на сервере Zabbix. Подробнее об импорте шаблонов см. в документации Zabbix по работе с импортом шаблонов.

  8. Установите параметры макроса {$PG.HOST}, {$PG.PORT}, {$PG.USER}, {$PG.PASSWORD}, {$PG.DB} для узла сети с QHB.

  9. Присоедините шаблон «QHB by Zabbix agent» к узлу сети с QHB.

Собираемые параметры

Таблица 66. Собираемые параметры

ГруппаНазваниеОписание
QHBBgwriter: Buffers allocated per secondКоличество буферов, выделенных за секунду
QHBBgwriter: Buffers written directly by a backend per secondКоличество буферов, записанных за секунду непосредственно обслуживающим процессом
QHBBgwriter: Buffers backend fsync per secondСколько раз за секунду обслуживающему процессу пришлось самому выполнять вызов fsync (обычно этим занимается фоновый процесс записи, даже когда обслуживающий процесс проводит свои операции записи)
QHBBgwriter: Buffers written during checkpoints per secondКоличество буферов, записанных за секунду во время контрольных точек
QHBBgwriter: Buffers written by the background writer per secondКоличество буферов, записанных за секунду фоновым процессом записи
QHBBgwriter: Requested checkpoints per secondКоличество запрошенных контрольных точек, которые были выполнены за секунду
QHBBgwriter: Scheduled checkpoints per secondКоличество запланированных контрольных точек, которые были выполнены за секунду
QHBBgwriter: Checkpoint sync timeОбщее количество времени, затраченное на синхронизацию файлов с диском при обработке контрольных точек
QHBBgwriter: Checkpoint write timeОбщее количество времени, затраченное на запись файлов на диск при обработке контрольных точек, в миллисекундах
QHBBgwriter: Max written per secondСколько раз за секунду фоновый процесс записи останавливал очищающее сканирование из-за того, что записал слишком много буферов
QHBStatus: Cache hit ratio %Доля попаданий в кэш
QHBStatus: Config hashХеш конфигурации QHB
QHBConnections sum: ActiveОбщее количество соединений, выполняющих запросы
QHBConnections sum: IdleОбщее количество соединений, ожидающих от клиента новой команды
QHBConnections sum: Idle in transactionОбщее количество соединений в состоянии транзакции, но не выполняющих запрос
QHBConnections sum: PreparedОбщее количество подготовленных транзакций
QHBConnections sum: TotalОбщее количество соединений
QHBConnections sum: Total %Общее количество соединений в процентах
QHBConnections sum: WaitingОбщее количество ожидающих транзакций
QHBStatus: Ping timeВремя ответа
QHBStatus: PingПроверка связи
QHBReplication: standby countКоличество резервных серверов
QHBReplication: lag in secondsЗадержка репликации с основного сервера в секундах
QHBReplication: recovery roleРоль репликации: 1 — восстановление еще продолжается (режим резервного сервера), 0 — режим основного сервера
QHBReplication: statusСтатус репликации: 0 — потоковая передача снижается, 1 — потоковая передача возрастает, 2 — режим основного сервера
QHBTransactions: Max active transaction timeТекущая максимальная продолжительность активной транзакции
QHBTransactions: Max idle transaction timeТекущая максимальная продолжительность простаивающей транзакции
QHBTransactions: Max prepared transaction timeТекущая максимальная продолжительность подготовленной транзакции
QHBTransactions: Max waiting transaction timeТекущая максимальная продолжительность ожидающей транзакции
QHBStatus: UptimeПолное время работы системы
QHBStatus: VersionВерсия QHB
QHBWAL: Segments countКоличество сегментов WAL
QHBWAL: Bytes writtenОбъем записей WAL в байтах
QHBDB {#DBNAME}: Database sizeРазмер этой базы данных
QHBDB {#DBNAME}: Blocks hit per secondСколько раз дисковые блоки были обнаружены уже в буферном кэше, благодаря чему в чтении не было необходимости
QHBDB {#DBNAME}: Disk blocks read per secondОбщее количество дисковых блоков, прочитанных в этой базе данных
QHBDB {#DBNAME}: Detected conflicts per secondОбщее количество запросов, отмененных из-за конфликтов с восстановлением в этой базе данных
QHBDB {#DBNAME}: Detected deadlocks per secondОбщее количество выявленных взаимоблокировок в этой базе данных
QHBDB {#DBNAME}: Temp_bytes written per secondОбщий объем данных, записанных во временные файлы запросами в этой базе данных
QHBDB {#DBNAME}: Temp_files created per secondОбщее количество временных файлов, созданных запросами в этой базе данных
QHBDB {#DBNAME}: Tuples deleted per secondОбщее количество строк, удаленных запросами в этой базе данных
QHBDB {#DBNAME}: Tuples fetched per secondОбщее количество строк, выбранных запросами в этой базе данных
QHBDB {#DBNAME}: Tuples inserted per secondОбщее количество строк, добавленных запросами в этой базе данных
QHBDB {#DBNAME}: Tuples returned per secondОбщее количество строк, возвращенных запросами в этой базе данных
QHBDB {#DBNAME}: Tuples updated per secondОбщее количество строк, измененных запросами в этой базе данных
QHBDB {#DBNAME}: Commits per secondКоличество зафиксированных транзакций в этой базе данных
QHBDB {#DBNAME}: Rollbacks per secondОбщее количество откатившихся транзакций в этой базе данных
QHBDB {#DBNAME}: Frozen XID before autovacuum %Доля замороженных идентификаторов транзакций перед автоочисткой, в процентах
QHBDB {#DBNAME}: Frozen XID before stop %Доля замороженных идентификаторов транзакций перед остановкой, в процентах
QHBDB {#DBNAME}: Locks totalОбщее количество блокировок в этой базе данных
QHBDB {#DBNAME}: Queries slow maintenance countСчетчик медленных обслуживающих запросов
QHBDB {#DBNAME}: Queries max maintenance timeМаксимальная продолжительность обслуживающего запроса
QHBDB {#DBNAME}: Queries sum maintenance timeСуммарная продолжительность обслуживающих запросов
QHBDB {#DBNAME}: Queries slow query countСчетчик медленных запросов
QHBDB {#DBNAME}: Queries max query timeМаксимальная продолжительность запроса
QHBDB {#DBNAME}: Queries sum query timeСуммарная продолжительность запросов
QHBDB {#DBNAME}: Queries slow transaction countСчетчик медленных транзакционных запросов
QHBDB {#DBNAME}: Queries max transaction timeМаксимальная продолжительность транзакционного запроса
QHBDB {#DBNAME}: Queries sum transaction timeСуммарная продолжительность транзакционных запросов
QHBDB {#DBNAME}: Index scans per secondКоличество сканирований по индексу в этой базе данных
QHBDB {#DBNAME}: Sequential scans per secondКоличество последовательных сканирований в этой базе данных
Исходные элементы ZabbixQHB: Get bgwriterСтатистика по активности фонового процесса записи
Исходные элементы ZabbixQHB: Get connections sumСбор всех метрик из pg_stat_activity
Исходные элементы ZabbixQHB: Get dbstatСбор всех метрик из pg_stat_database для каждой базы данных
Исходные элементы ZabbixQHB: Get locksСбор всех метрик из pg_locks для каждой базы данных
Исходные элементы ZabbixQHB: Get queriesСбор всех метрик по времени выполнения запросов
Исходные элементы ZabbixQHB: Get transactionsСбор метрик по времени выполнения транзакций
Исходные элементы ZabbixQHB: Get WALОсновной элемент для сбора метрик WAL
Исходные элементы ZabbixDB {#DBNAME}: Get frozen XIDКоличество замороженных идентификаторов транзакций
Исходные элементы ZabbixDB {#DBNAME}: Get scansКоличество сканирований, проведенных для таблицы/индекса в этой базе данных

Триггеры

Таблица 67. Триггеры

НазваниеОписание
QHB: Required checkpoints occurs too frequentlyЗапрашиваемые контрольные точки происходят слишком часто
QHB: Cache hit ratio too lowСлишком низкая доля попаданий в кэш
QHB: Configuration has changedИзменилась конфигурация
QHB: Total number of connections is too highОбщее количество соединений слишком велико
QHB: Response too longСлишком большое время отклика
QHB: Service is downQHB не функционирует
QHB: Streaming lag with {#MASTER} is too highЗадержка репликации с основного сервера слишком велика
QHB: Replication is downРепликация не функционирует
QHB: Service has been restartedВремя функционирования QHB меньше 10 минут
QHB: Version has changedВерсия QHB изменилась
DB {#DBNAME}: Too many recovery conflictsСлишком много конфликтов между основным и резервным серверами при восстановлении
DB {#DBNAME}: Deadlock occurredПроизошла взаимоблокировка
DB {#DBNAME}: VACUUM FREEZE is required to prevent wraparoundДля предотвращения зацикливания идентификаторов транзакций требуется выполнить команду VACUUM FREEZE
DB {#DBNAME}: Number of locks is too highКоличество блокировок слишком велико
DB {#DBNAME}: Too many slow queriesСлишком много медленных запросов
QHB: Failed to get itemsZabbix не получал данные для элементов в течение последних 30 минут

Настройка сбора метрик

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

Настройка сервера метрик

Настройка сервера метрик описана в главе Сервер метрик.

Рекомендуется в параметре prefix конфигурационного файла /etc/metricsd/config.yaml сервера метрик прописать имя хоста, на котором он работает. Если сделать это для каждого сервера, все метрики будут организованы иерархически, и первый уровень иерархии будет уровнем серверов. В именах метрик в предлагаемых панелях для этих целей присутствует переменная $server_name. Подразумевается, что на хосте работает только один кластер баз данных.


Настройка параметров базы данных

Для настройки отправки метрик до релиза QHB 1.3.0 необходимо в qhb.conf установить параметр metrics_collector_id в значение, с которым запускается коллектор метрик, например 1001. Начиная с релиза QHB 1.3.0 вместо metrics_collector_id используется параметр metrics_collector_path, который по умолчанию имеет значение @metrics-collector (представляет собой путь к сокету домена Unix); сервер метрик по умолчанию запускается именно на этом адресе.

Для настройки отправки аннотаций необходимо в qhb.conf прописать следующие параметры:

  • grafana.address — адрес Grafana, например http://localhost:3000
  • grafana.token — необходимо указать токен, полученный в Grafana по адресу http://localhost:3000/org/apikeys

Пример настроек в qhb.conf для отправки метрик и аннотаций:

# До релиза QHB 1.3.0
# metrics_collector_id = 1001  

# С релиза QHB 1.3.0:
metrics_collector_path = '@metrics-collector'

grafana.address = 'http://localhost:3000'
grafana.token = 'eyJrIjoiNGxTaloxMUNTQkFUMTN0blZqUTN6REN6OWI5YjM1MzMiLCJuIjoidGVzdCIsImlkIjoxfQ=='

Примечание
При необходимости записи данных метрик в CSV-файлы в качестве значения параметра metrics_collector_path нужно указать путь к файлу сокета домена Unix, например /tmp/metrics-collector.sock. Это же значение нужно указать в параметре bind_addr раздела collection в настройках сервера метрик (/etc/metricsd/config.yaml).

Для сбора системных метрик (информационная панель «Операционная система») необходимо установить параметр qhb_os_monitoring в значение on (включен). Можно также задать период сбора системной статистики qhb_os_stat_period (значение по умолчанию — 30 секунд). Не рекомендуется задавать для этого параметра слишком низкое значение, поскольку сбор системной статистики требует некоторых затрат.

В файле параметров можно прописать:

qhb_os_monitoring = on
qhb_os_stat_period = 60 # если период по умолчанию в 30 секунд не устраивает

Либо выполнить команды:

ALTER SYSTEM SET qhb_os_monitoring = ON;
ALTER SYSTEM SET qhb_os_stat_period = 60;
SELECT pg_reload_conf();

Примеры использования метрик в функциях SQL

Помимо встроенных метрик пользователи могут использовать свои метрики через следующие функции SQL.

Тип метрик Timer

Используется при фиксации промежутка времени, единицы измерения — наносекунды.

SELECT qhb_timer_report('qhb.timer.nano',10000000000 /* 10 секунд в наносекундах */);

Тип метрик Counter

Используется, когда нужно зафиксировать количество произошедших за промежуток времени событий.

SELECT qhb_counter_increase_by('qhb.example.counter',10);

Тип метрик Gauge

Используется, когда нужно установить некий статичный показатель в определенное значение или изменить его.

SELECT qhb_gauge_update('qhb.gauge_example.value', 10); /* Установка значения */
SELECT qhb_gauge_add('qhb.gauge_example.value',1); /* Увеличение значения */
SELECT qhb_gauge_sub('qhb.gauge_example.value',1); /* Уменьшение значения */

Аннотации

Используются, если нужно добавить комментарий к данным метрик. Первый параметр функции — текст комментария, последующие параметры — теги.

SELECT qhb_annotation('Начало выполнения теста', 'test','billing'); /* Текст аннотации и два тега */