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

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

Доступны несколько инструментов для мониторинга активности базы данных и анализа производительности. Большая часть этой главы посвящена описанию сборщика статистики QHB , но не следует пренебрегать обычными программами мониторинга Unix, такими как ps, top, iostat и vmstat. Кроме того, как только вы определили неэффективный запрос, может потребоваться дальнейшее исследование с помощью команды EXPLAIN в QHB . В разделе Использование 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  15558  0.0  0.0  17512  1068 ?        Ss   18:02   0:00 qhb: stats collector
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.) Первым процессом из перечисленных здесь является процесс главного сервера. Аргументы команды, приведенные здесь для него, те же, что использовались при запуске. Следующие пять процессов являются фоновыми рабочими процессами, автоматически запускаемыми главным процессом. (Процесс «stats-collector» не будет показан, если его запуск отключен; аналогично процесс «autovacuum launcher» (фоновый процесс автоочистки) также можно отключить.) Каждый из оставшихся процессов является серверным процессом, обрабатывающим одно клиентское соединение. Для каждого такого процесса устанавливается отображение командной строки в виде

qhb: user database host activity

Элементы имени пользователя, базы данных и хоста остаются неизменными на протяжении всего жизненного цикла клиентского соединения, а индикатор активности изменяется. Он может принимать значение 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, то индикатор активности не обновляется; заголовок процесса устанавливается только один раз при запуске нового процесса. На некоторых платформах это снижает существенные накладные расходы, на других влияние обновления этого индикатора незначительно.

Сборщик статистики

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

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

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

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

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

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

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

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

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

Сборщик статистики передает собранные данные другим процессам QHB через временные файлы. Эти файлы хранятся в каталоге, название которого задается параметром stats_temp_directory, по умолчанию содержит значение pg_stat_tmp. Для повышения производительности stats_temp_directory может указывать на файловую систему на основе ОЗУ, что сокращает время физического ввода/вывода. Когда сервер отключается, постоянная копия статистических данных сохраняется в подкаталоге pg_stat, так что статистика может быть сохранена при перезапусках сервера. Когда восстановление выполняется при запуске сервера (например, после немедленного выключения, сбоя сервера и восстановления на определенный момент времени), все счетчики статистики сбрасываются.

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

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

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

Другим важным моментом является то, что когда серверный процесс запрашивает статистические данные, он сначала получает самый последний снимок от сборщика статистики, а затем продолжает использовать этот снимок для всех статистических представлений и функций до окончания текущей транзакции. Таким образом, статистика не изменится до окончания текущей транзакции. Точно так же собирается информация о текущих запросах всех сеансов, когда она запрашивается в начале транзакции, и эта же информация будет отображаться в течение всей транзакции. Это функциональность, а не ошибка, она позволяет вам выполнять несколько запросов к статистике и сопоставлять результаты, не беспокоясь о том, что данные по статистике изменяются. Но если вы хотите видеть новые результаты при выполнении каждого запроса, обязательно выполняйте запросы вне транзакционных блоков. Или вы можете вызвать 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, имеет ограничения по безопасности. Обычные пользователи могут видеть только всю информацию о своих собственных сеансах (сеансах, принадлежащих к роли, членом которой они являются). В строках о других сеансах многие столбцы будут нулевыми. Однако обратите внимание, что существование сеанса и его общие свойства, такие как пользователь сеанса и база данных, видны всем пользователям. Суперпользователи и члены встроенной роли 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_subscriptionКак минимум одна строка на подписку, показывающая информацию о процессах подписки. См. pg_stat_subscription.
pg_stat_sslОдна строка для каждого подключения (обычного и реплицирующего), показывающая информацию о SSL, используемом для этого соединения См. pg_stat_ssl.
pg_stat_gssapiОдна строка для каждого подключения (обычного и реплицирующего), показывающая информацию об аутентификации и шифровании GSSAPI, используемых в этом соединении. См. pg_stat_gssapi
pg_stat_progress_create_indexОдна строка для каждого бэкэнда, выполняющего CREATE INDEX или REINDEX, показывающая ход выполнения команды. См. раздел Отчет о ходе выполнения CREATE INDEX.
pg_stat_progress_vacuumОдна строка для каждого бэкэнда (включая рабочие процессы автоочистки), на котором выполняется VACUUM, показывающая ход выполнения команды. См. раздел Отчет о ходе выполнения VACUUM.
pg_stat_progress_clusterОдна строка для каждого бэкэнда, в котором работает CLUSTER или VACUUM FULL, показывающая ход выполнения команды. См. раздел Отчет о ходе выполнения CLUSTER.

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

Посмотреть имяОписание
pg_stat_archiverТолько одна строка, показывающая статистику о работе процесса архиватора WAL. См. pg_stat_archiver.
pg_stat_bgwriterТолько одна строка, показывающая статистику о работе фонового процесса записи. См. pg_stat_bgwriter.
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_all_indexes представлены только индексы в системных таблицах.
pg_stat_user_indexesТо же, что pg_stat_all_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_all_indexes представлены только индексы в системных таблицах.
pg_statio_user_indexesТо же, что pg_statio_all_indexes, за исключением того, что pg_statio_all_indexes представлены только индексы пользовательских таблиц.
pg_statio_all_sequencesОдна строка для каждой последовательности в текущей базе данных, показывающая статистику ввода-вывода для этой конкретной последовательности. См. pg_statio_all_sequence для получения подробной информации.
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_statio_ в первую очередь полезны для определения эффективности буферного кеша. Когда количество фактических операций чтения с диска намного меньше числа обращений к буферу, кеш удовлетворяет большинству запросов на чтение без вызова ядра операционной системы. Однако эти статистические данные не дают полной картины: из-за того, как QHB обрабатывает дисковый ввод-вывод, данные, которых нет в буферном кеше QHB , могут по-прежнему находиться в кэше ввода/вывода ядра и, следовательно, могут по-прежнему выбираться, не требуя физического чтения. Пользователям, заинтересованным в получении более подробной информации о поведении ввода/вывода QHB , рекомендуется использовать сборщик статистики QHB в сочетании с утилитами операционной системы, которые позволяют лучше понять, как ядро обрабатывает ввод/вывод.

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

колонкаТипОписание
datidoidOID базы данных, с которой связан этот бэкэнд
datnamenameИмя базы данных, с которой связан этот бэкэнд
pidintegerИдентификатор процесса этого бэкэнда
usesysidoidOID пользователя, вошедшего в этот бэкэнд
usenamenameИмя пользователя, вошедшего в этот бэкэнд
application_nametextИмя приложения, которое подключено к этому бэкэнду
client_addrinetIP-адрес клиента, подключенного к этому бэкэнду. Если это поле пустое, это означает, что клиент подключен через сокет Unix на серверном компьютере или это внутренний процесс, такой как autovacuum.
client_hostnametextИмя хоста подключенного клиента, сообщаемое при обратном поиске DNS client_addr. Это поле будет отличным от NULL для IP-соединений и только при включенном режиме log_hostname.
client_portintegerНомер порта TCP, который клиент использует для связи с этим бэкэндом, или -1 если используется сокет Unix
backend_starttimestamp with time zoneВремя, когда этот процесс был запущен. Для клиентских бэкэндов это время, когда клиент подключается к серверу.
xact_starttimestamp with time zoneВремя, когда была запущена текущая транзакция этого процесса, или ноль, если транзакция не активна. Если текущий запрос является первой из его транзакций, этот столбец равен столбцу query_start .
query_starttimestamp with time zoneВремя, когда был запущен текущий активный запрос, или если state не active, когда был запущен последний запрос
state_changetimestamp with time zoneВремя последнего изменения состояния
wait_event_typetextТип события, которого ожидает серверная часть, если это имеет место; в противном случае NULL. Возможные значения:
- LWLock: бэкэнд ждет легкую блокировку. Каждая такая блокировка защищает определенную структуру данных в разделяемой памяти. wait_event будет содержать имя, идентифицирующее цель получения легкой блокировки. (У некоторых блокировок есть особые имена; другие являются частью группы блокировок со схожим назначением.)
- Lock: бэкэнд ждет тяжелую блокировку. Тяжелые блокировки, также известные как блокировки или просто блокировки менеджера блокировок, в основном защищают видимые SQL-объекты, такие как таблицы. Однако они также используются для обеспечения взаимоисключающего обновления для некоторых внутренних операций, таких как расширение отношений. В wait_event обозначается конкретное место ожидания.
- BufferPin: серверный процесс ожидает доступа к буферу данных в течение периода, когда никакой другой процесс не может обращаться к этому буферу. Ожидания закрепления буфера могут быть длительными, если другой процесс удерживает открытый курсор, который последним читал данные из рассматриваемого буфера.
- Activity: Серверный процесс простаивает. Используется системными процессами, ожидающими активности в основном цикле обработки. В wait_event обозначается конкретное место ожидания.
- Extension: серверный процесс ожидает активности в модуле расширения. Эта категория полезна при использовании модулей для отслеживания нестандартных мест ожидания.
- Client: серверный процесс ожидает в сокете некоторой активности от пользовательских приложений. Сервер ожидает, что произойдет что-то, что не зависит от его внутренних процессов. В wait_event обозначается конкретное место ожидания.
- IPC: серверный процесс ожидает некоторой активности от другого процесса на сервере. В wait_event обозначается конкретное место ожидания.
- Timeout: процесс сервера ожидает истечения времени ожидания. В wait_event обозначается конкретное место ожидания.
- IO: серверный процесс ожидает завершения ввода-вывода. В wait_event обозначается конкретное место ожидания.
wait_eventtextИмя события ожидания, если бэкэнд в данный момент в ожидании, иначе NULL. Детали в Таблице 4.
statetextТекущее общее состояние этого бэкэнда. Возможные значения:
- active: бэкэнд выполняет запрос.
- idle: бэкэнд ожидает новой команды от клиента.
- idle in transaction: бэкэнд находится внутри транзакции, но в данный момент не выполняет запрос.
- idle in transaction (aborted): это состояние подобно idle in transaction, за исключением того, что один из операторов в транзакции вызвал ошибку.
- fastpath function call: бэкэнд выполняет функцию fast-path.
- disabled: об этом состоянии сообщается, если track_activities отключен в этом бэкэнде.
backend_xidxidИдентификатор транзакции верхнего уровня этого бэкэнда, если он имеется.
backend_xminxidГраница xmin для данного бэкэнда.
querytextТекст последнего запроса этого бэкэнда. Если поле state содержит значение active, в этом поле отображается текущий выполняемый запрос. Во всех других состояниях он показывает последний запрос, который был выполнен ранее. По умолчанию текст запроса усекается до 1024 символов; это значение можно изменить с помощью параметра track_activity_query_size.
backend_typetextТип текущего бэкэнда. Возможные типы: autovacuum launcher, autovacuum worker, logical replication launcher, logical replication worker, parallel worker, background writer, client backend, checkpointer, startup, walreceiver, walsender и walwriter. Кроме того, фоновые процессы, зарегистрированные расширениям, могут иметь дополнительные типы.

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

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

Таблица 4. Описание значений столбца wait_event

Тип события ожиданияИмя события ожиданияОписание
LWLockShmemIndexLockОжидание поиска и выделения места в разделяемой памяти.
 OidGenLockОжидание выделения или назначения OID.
 XidGenLockОжидание выделения или назначения идентификатора транзакции.
 ProcArrayLockОжидание получения снимка или очистки идентификатора транзакции в конце транзакции.
 SInvalReadLockОжидание получения или удаления сообщений из общей очереди инвалидации.
 SInvalWriteLockОжидание добавления сообщения в общую очередь инвалидации.
 WALBufMappingLockОжидание замены страницы в буферах WAL.
 WALWriteLockОжидание записи буферов WAL на диск.
 ControlFileLockОжидание чтения или обновления контрольного файла или создания нового файла WAL.
 CheckpointLockОжидание выполнения контрольной точки.
 CLogControlLockОжидание чтения или обновления статуса транзакции.
 SubtransControlLockОжидание чтения или обновления информации подтранзакции.
 MultiXactGenLockОжидание чтения или обновления общего состояния мультитранзакций.
 MultiXactOffsetControlLockОжидание чтения или обновления смещений мультитранзакций.
 MultiXactMemberControlLockОжидание чтения или обновления членов мультитранзакций.
 RelCacheInitLockОжидание чтения или записи файла инициализации кэша отношения.
 CheckpointerCommLockОжидание при выполнении запросов fsync.
 TwoPhaseStateLockОжидание чтения или обновления состояния подготовленных транзакций.
 TablespaceCreateLockОжидание создания или удаления табличного пространства.
 BtreeVacuumLockОжидание чтения или обновления связанной с вакуумом информации для индекса B-дерева.
 AddinShmemInitLockОжидание управления распределением пространства в разделяемой памяти.
 AutovacuumLockРабочий процесс автовакуума или процесс запуска автовакуума в ожидании обновления или чтения текущего состояния рабочих процессов автоочистки.
 AutovacuumScheduleLockОжидание при проверке, что таблица, которая выбрана для очистки, все еще нуждается в ней.
 SyncScanLockОжидание получения начального местоположения сканирования таблицы для синхронизированных сканирований.
 RelationMappingLockОжидание обновления файла карты отношения, используемого для сохранения в каталоге данных о файловых узлах.
 AsyncCtlLockОжидание чтения или обновления общего состояния уведомлений.
 AsyncQueueLockОжидание чтения или обновления уведомлений.
 SerializableXactHashLockОжидание получения или сохранения информации о сериализуемых транзакциях.
 SerializableFinishedListLockОжидание доступа к списку завершенных сериализуемых транзакций.
 SerializablePredicateLockListLockОжидание выполнения операции со списком блокировок, удерживаемых сериализуемыми транзакциями.
 OldSerXidLockОжидание чтения или записи конфликтующих сериализуемых транзакций.
 SyncRepLockОжидание чтения или обновления информации о синхронных репликах.
 BackgroundWorkerLockОжидание чтения или обновления состония фонового процесса.
 DynamicSharedMemoryControlLockОжидание чтения или обновления состояния динамической разделяемой памяти.
 AutoFileLockОжидание обновления файла qhb.auto.conf.
 ReplicationSlotAllocationLockОжидание выделения или освобождения слота репликации.
 ReplicationSlotControlLockОжидание чтения или обновления состояния слота репликации.
 CommitTsControlLockОжидание чтения или обновления отметок времени подтверждения транзакции.
 CommitTsLockОжидание чтения или обновления последнего значения, установленного для отметки времени транзакции.
 ReplicationOriginLockОжидание установки, удаления или использования источника репликации.
 MultiXactTruncationLockОжидание чтения или очистки информации мультитранзакций.
 OldSnapshotTimeMapLockОжидание чтения или обновления информации о старых снимках.
 LogicalRepWorkerLockОжидание завершения действия процесса логической репликации.
 CLogTruncationLockОжидание выполнения функции txid_status или обновления самого старого идентификатора транзакции, доступного для неё.
 clogОжидание ввода-вывода в clog (буфере состояния транзакций).
 commit_timestampОжидание ввода-вывода в буфере отметок времени фиксации транзакций.
 subtransОжидание ввода-вывода буфера подтранзакций.
 multixact_offsetОжидание ввода-вывода в буфере смещения мультитранзакций.
 multixact_memberОжидание ввода-вывода в буфере multixact_member.
 asyncОжидание ввода-вывода в асинхронном (уведомляющем) буфере.
 oldserxidОжидание ввода-вывода в буфере oldserxid.
 wal_insertОжидание вставки WAL в буфер памяти.
 buffer_contentОжидание чтения или записи страницы данных в памяти.
 buffer_ioОжидание ввода-вывода страницы данных.
 replication_originОжидание чтения или обновления состояния процесса репликации.
 replication_slot_ioОжидание ввода-вывода данных слота репликации.
 procОжидание чтения или обновления информации о блокировке по быстрому пути.
 buffer_mappingОжидание связывания блока данных с буфером в буферном пуле.
 lock_managerОжидание добавления или проверки блокировок для бэкэндов или ожидание присоединения или выхода из группы блокировок (используется параллельными запросами).
 predicate_lock_managerОжидание добавления или проверки информации предикатных блокировок.
 serializable_xactОжидание выполнения операции сериализуемой транзакцией в параллельном запросе.
 parallel_query_dsaОжидание блокировки выделения динамической общей памяти в параллельном запросе.
 tbmОжидание блокировки общего итератора TBM.
 parallel_appendОжидание выбора следующего подплана во время выполнения плана параллельного добавления.
 parallel_hash_joinОжидание выделения или обмена части памяти или обновления счетчиков во время выполнения плана параллельного хеширования.
LockrelationОжидание получения блокировки в отношении.
 extendОжидание расширения отношения.
 pageОжидание получения блокировки для страницы отношения.
 tupleОжидание получения блокировки для кортежа.
 transactionidОжидание завершения транзакции.
 virtualxidОжидание получения блокировки виртуального XID.
 speculative tokenОжидание получения блокировки спекулятивной вставки.
 objectОжидание получения блокировки для объекта, не относящегося к базе данных.
 userlockОжидание получения пользовательской блокировки.
 advisoryОжидание получения рекомендательной пользовательской блокировки.
BufferPinBufferPinОжидание закрепления буфера.
ActivityArchiverMainОжидание в основном цикле процесса архивирования.
 AutoVacuumMainОжидание в главном цикле процесса запуска автоочистки.
 BgWriterHibernateОжидание в фоновом процессе записи в режиме бездействия.
 BgWriterMainОжидание в основном цикле рабочего рпоцесса фоновой записи.
 CheckpointerMainОжидание в основном цикле процесса контрольной точки.
 LogicalApplyMainОжидание в основном цикле процесса применения логической репликации.
 LogicalLauncherMainОжидание в основном цикле процесса запуска логической репликации.
 PgStatMainОжидание в основном цикле процесса сбора статистики.
 RecoveryWalAllОжидание восстановления WAL из любого источника (локального, архивного или потокового) при восстановлении.
 RecoveryWalStreamОжидание WAL из потока при восстановлении.
 SysLoggerMainОжидание в основном цикле процесса syslogger.
 WalReceiverMainОжидание в основном цикле процесса приема WAL.
 WalSenderMainОжидание в основном цикле процесса отправителя WAL.
 WalWriterMainОжидание в основном цикле процесса записи WAL.
ClientClientReadОжидание чтения данных от клиента.
 ClientWriteОжидание записи данных, отправляемых клиенту.
 LibPQWalReceiverConnectОжидание в приемнике WAL для установления соединения с удаленным сервером.
 LibPQWalReceiverReceiveОжидание в приемнике WAL для получения данных с удаленного сервера.
 SSLOpenServerОжидание SSL при попытке подключения.
 WalReceiverWaitStartОжидание запуска процесса отправки начальных данных для потоковой репликации.
 WalSenderWaitForWALОжидание сброса WAL в процессе отправки WAL.
 WalSenderWriteDataОжидание любого действия при обработке ответов от получателя WAL в процессе отправителя WAL.
ExtensionExtensionОжидание в расширении.
IPCBgWorkerShutdownОжидание выключения фонового рабочего процесса.
 BgWorkerStartupОжидание запуска фонового рабочего процесса.
 BtreePageОжидание появления номера страницы, необходимой для продолжения параллельного сканирования B-дерева.
 CheckpointDoneОжидание контрольной точки для завершения.
 CheckpointStartОжидание контрольной точки для запуска.
 ClogGroupUpdateОжидание, когда ведущий процесс группы обновит статус транзакции в конце транзакции.
 ExecuteGatherОжидание активности от дочернего процесса при выполнении узла сбора данных(Gather).
 Hash/Batch/AllocatingОжидание, когда выбранный участник параллельного хеширования разместит хеш-таблицу.
 Hash/Batch/ElectingВыбор участника параллельного хеширования для размещения хеш-таблицы.
 Hash/Batch/LoadingОжидание, пока другие участники параллельного хеширования завершат загрузку хеш-таблицы.
 Hash/Build/AllocatingОжидание, когда выбранный участник параллельного хеширования выделит начальную хеш-таблицу.
 Hash/Build/ElectingВыбор участника параллельного хеширования для размещения начальной хеш-таблицы.
 Hash/Build/HashingInnerОжидание, пока другие участники параллельного хеширования завершат хеширование внутреннего отношения.
 Hash/Build/HashingOuterОжидание, пока другие участники параллельного хеширования завершат разбиение внешнего отношения.
 Hash/GrowBatches/AllocatingОжидание выделения выбранным участником параллельного хеширования большего количества пакетов.
 Hash/GrowBatches/DecidingВыбор участника параллельного хеширования для принятия решения о будущем добавлении пакетов.
 Hash/GrowBatches/ElectingВыбор участника параллельного хеширования для добавления большего количества пакетов.
 Hash/GrowBatches/FinishingОжидание выбранного участника параллельного хеширования для принятия решения о добавлении дополнительных пакетов.
 Hash/GrowBatches/RepartitioningОжидание, пока другие участники параллельного хеширования завершат перераспределение.
 Hash/GrowBuckets/AllocatingОжидание, когда выбранный участник параллельного хеширования закончит выделять дополнительные группы.
 Hash/GrowBuckets/ElectingВыбор участника параллельного хеширования для выделения дополнительнывх групп.
 Hash/GrowBuckets/ReinsertingОжидание, пока другие участники паралллеьного хеширования закончат вставлять кортежи в новые группы.
 LogicalSyncDataОжидание, когда удаленный сервер логической репликации отправит данные для начальной синхронизации таблицы.
 LogicalSyncStateChangeОжидание, когда удаленный сервер логической репликации изменит состояние.
 MessageQueueInternalОжидание присоединения другого процесса к общей очереди сообщений.
 MessageQueuePutMessageОжидание записи сообщения протокола в общую очередь сообщений.
 MessageQueueReceiveОжидание получения байтов из общей очереди сообщений.
 MessageQueueSendОжидание отправки байтов в общую очередь сообщений.
 ParallelBitmapScanОжидание инициализации параллельного сканирования по битовой карте.
 ParallelCreateIndexScanОжидание завершения сканирования параллельными процессами CREATE INDEX.
 ParallelFinishОжидание окончания вычислений параллельных рабочих процессов.
 ProcArrayGroupUpdateОжидание, пока ведущий процесс в группе не очистит идентификатор транзакции в конце транзакции.
 PromoteВ ожидании продвижения ведомых.
 ReplicationOriginDropОжидание, когда источник репликации станет неактивным и будет удален.
 ReplicationSlotDropОжидание, когда слот репликации станет неактивным и будет удален.
 SafeSnapshotОжидание снимка транзакции READ ONLY DEFERRABLE.
 SyncRepОжидание подтверждения от удаленного сервера во время синхронной репликации.
TimeoutBaseBackupThrottleОжидание во время резервного копирования базы при ограничении активности.
 PgSleepОжидание в процессе, который вызвал pg_sleep.
 RecoveryApplyDelayОжидание применения WAL при восстановлении из-за задержки.
IOBufFileReadОжидание чтения из буферизованного файла.
 BufFileWriteОжидание записи в буферизованный файл.
 ControlFileReadОжидание чтения из контрольного файла.
 ControlFileSyncОжидание помещения контрольного файла в стабильное хранилище.
 ControlFileSyncUpdateОжидание обновления контрольного файла в стабильном хранилище.
 ControlFileWriteОжидание записи в контрольный файл.
 ControlFileWriteUpdateОжидание записи для обновления контрольного файла.
 CopyFileReadОжидание чтения во время операции копирования файла.
 CopyFileWriteОжидание записи во время операции копирования файла.
 DataFileExtendОжидание расширения файла данных отношения.
 DataFileFlushОжидание помещения файла данных отношения в стабильное хранилище.
 DataFileImmediateSyncОжидание немедленной синхронизации файла данных отношения со стабильным хранилищем.
 DataFilePrefetchОжидание асинхронной предварительной выборки из файла данных отношений.
 DataFileReadОжидание чтения из файла данных отношения.
 DataFileSyncОжидание переноса изменений в файле реляционных данных в стабильное хранилище.
 DataFileTruncateОжидание усечения файла данных отношения.
 DataFileWriteОжидание записи в файл данных отношений.
 DSMFillZeroWriteОжидание записи нулевых байтов в файл поддержки динамической разделяемой памяти.
 LockFileAddToDataDirReadОжидание чтения при добавлении строки в файл блокировки каталога данных.
 LockFileAddToDataDirSyncОжидание поступления данных в стабильное хранилище при добавлении строки в файл блокировки каталога данных.
 LockFileAddToDataDirWriteОжидание записи при добавлении строки в файл блокировки каталога данных.
 LockFileCreateReadОжидание чтения при создании файла блокировки каталога данных.
 LockFileCreateSyncОжидание поступления данных в стабильное хранилище при создании файла блокировки каталога данных.
 LockFileCreateWriteОжидание записи при создании файла блокировки каталога данных.
 LockFileReCheckDataDirReadОжидание чтения во время повторной проверки файла блокировки каталога данных.
 LogicalRewriteCheckpointSyncОжидание сопоставления логической перезаписи для достижения стабильного хранилища во время контрольной точки.
 LogicalRewriteMappingSyncОжидание сопоставления данных для достижения стабильного хранилища во время логической перезаписи.
 LogicalRewriteMappingWriteОжидание записи данных сопоставления во время логической перезаписи.
 LogicalRewriteSyncОжидание сопоставления логической перезаписи для достижения стабильного хранилища.
 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Ожидание записи файла двухфазного состояния.
 WALBootstrapSyncОжидание, пока WAL будет записан в стабильное хранилище во время начальной загрузки.
 WALBootstrapWriteОжидание записи WAL-страницы во время начальной загрузки.
 WALCopyReadОжидание чтения при создании нового сегмента WAL путем копирования существующего.
 WALCopySyncОжидание нового сегмента WAL, созданного путем копирования существующего для записи в стабильное хранилище.
 WALCopyWriteОжидание записи при создании нового сегмента WAL путем копирования существующего.
 WALInitSyncОжидание, пока недавно инициализированный файл WAL будет записан в стабильное хранилище.
 WALInitWriteОжидание записи при инициализации нового файла WAL.
 WALReadОжидание чтения из файла WAL.
 WALSenderTimelineHistoryReadОжидание чтения из файла истории линии времени при выполнении команды timeline процессом walsender.
 WALSyncОжидание, пока файл WAL будет записан в стабильное хранилище.
 WALSyncMethodAssignОжидание, пока данные будут записаны в стабильное хранилище при назначении метода синхронизации WAL.
 WALWriteОжидание записи в файл WAL.

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

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

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          | ProcArrayLock
(2 rows)

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

КолонкаТипОписание
pidintegerИдентификатор процесса отправителя WAL
usesysidoidOID пользователя, вошедшего в этот процесс-отправитель WAL
usenamenameИмя пользователя, подключенного к процессу-отправителю WAL
application_nametextИмя приложения, подключенного к этому процессу-отправителю WAL
client_addrinetIP-адрес клиента, подключенного к этому процессу-отправителю WAL. Если это поле пустое, это означает, что клиент подключен через сокет Unix на сервере.
client_hostnametextИмя хоста подключенного клиента, получаемое при обратном поиске в DNS по client_addr. Это поле будет отличным от NULL для IP-соединений и только при включенном log_hostname.
client_portintegerНомер TCP-порта, который клиент использует для связи с процессом-отправителем WAL, или -1, если используется сокет Unix.
backend_starttimestamp with time zoneВремя, когда этот процесс был запущен, т.е. когда клиент подключился к этому процессу-отправителю WAL.
backend_xminxidЗначение xmin, полученное от сервера-реплики при включенном hot_standby_feedback.
statetextТекущее состояние отправителя WAL. Возможные значения:
- startup: этот отправитель WAL запускается.
- catchup: подключенный к процессу-отправителю сервер-реплика догоняет основной.
- streaming: процесс-отправитель WAL выполняет потоковую передачу изменений после того, как его подключенный резервный сервер обнаружил основной.
- backup: процесс-отправитель WAL передает резервную копию.
- stopping: процесс-отправитель WAL останавливается.
sent_lsnpg_lsnПоследняя позиция WAL, отправленная по этому соединению
write_lsnpg_lsnПоследняя позиция WAL, записанная на диск этим резервным сервером
flush_lsnpg_lsnПоследняя позиция WAL, сброшенная на диск этим резервным сервером
replay_lsnpg_lsnПоследняя позиция WAL, примененная в базе данных на этом резервном сервере
write_lagintervalВремя, прошедшее между локальным сбросом последних данных WAL и получением уведомления о том, что этот резервный сервер записал их (но еще не сбросил или применил их). Это может быть использовано для измерения задержки, которая произошла при фиксации транзакции, когда в synchronous_commit выбран уровень remote_write, если этот сервер был настроен как синхронный резервный сервер.
flush_lagintervalВремя, прошедшее между локальным сбросом последних данных WAL и получением уведомления о том, что этот резервный сервер записал и сбросил их (но еще не применил). Это может быть использовано для определения задержки, когда в synchronous_commit выбран уровень on при фиксации, если этот сервер был настроен как синхронный резервный сервер.
replay_lagintervalПрошло время между локальной очисткой последней WAL и получением уведомления о том, что этот резервный сервер написал, сбросил и применил ее. Это может быть использовано для определения задержки, когда в synchronous_commit выбран уровень remote_apply при фиксации, если этот сервер был настроен как синхронный резервный сервер.
sync_priorityintegerПриоритет этого резервного сервера для выбора в качестве синхронного резервного в синхронной репликации на основе приоритетов. Не имеет значения при синхронной репликации с учетом кворума.
sync_statetextСостояние синхронизации этого резервного сервера. Возможные значения:
- async: этот резервный сервер является асинхронным.
- potential: этот резервный сервер теперь асинхронный, но потенциально может стать синхронным, если произойдет сбой одного из текущих синхронных серверов.
- sync: этот резервный сервер является синхронным.
- quorum: этот резервный сервер считается кандидатом на участие в кворуме.
reply_timetimestamp with time zoneВремя отправки последнего ответного сообщения, полученного от резервного сервера

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

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

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

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

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

колонкаТипОписание
pidintegerИдентификатор процесса-получателя WAL
statustextСостояние активности процесса-получателя WAL
receive_start_lsnpg_lsnПервая позиция WAL, используемая при запуске приемника WAL
receive_start_tliintegerПервый номер линии времени, используемый при запуске приемника WAL
received_lsnpg_lsnПоследняя позиция WAL, уже полученная и записанная на диск, начальное значение этого поля является первой позицией журнала при запуске приемника WAL
received_tliintegerНомер линии времени последней позиции WAL, полученной и записанной на диск, начальное значение этого поля является номером линии времени первой позиции журнала, использованной при запуске приемника WAL
last_msg_send_timetimestamp with time zoneВремя отправки последнего сообщения, полученного от отправителя WAL
last_msg_receipt_timetimestamp with time zoneВремя получения последнего сообщения, полученного от отправителя WAL
latest_end_lsnpg_lsnПоследняя позиция WAL, о которой был уведомлен отправитель WAL
latest_end_timetimestamp with time zoneВремя последней записи WAL, о которой был уведомлен отправитель WAL
slot_nametextИмя слота репликации, используемое этим приемником WAL
sender_hosttextХост экземпляра QHB , к которому подключен этот приемник WAL. Это может быть имя хоста, IP-адрес или путь к каталогу, если соединение осуществляется через сокет Unix. (Подключение к сокету можно распознать, поскольку он всегда будет абсолютным путем, начинающимся с /.)
sender_portintegerНомер порта экземпляра QHB , к которому подключен получатель WAL.
conninfotextСтрока соединения, используемая этим приемником WAL, со скрытыми секретными полями.

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

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

колонкаТипОписание
subidoidOID подписки
subnametextНазвание подписки
pidintegerИдентификатор процесса рабочего процесса подписки
relidOidOID отношения, которое процесс синхронизирует; для основного процесса применения
received_lsnpg_lsnПоследняя полученная запись WAL, начальное значение этого поля 0
last_msg_send_timetimestamp with time zoneВремя отправки последнего сообщения, полученного от отправителя WAL
last_msg_receipt_timetimestamp with time zoneВремя получения последнего сообщения, полученного от отправителя WAL
latest_end_lsnpg_lsnПоследняя запись WAL, о которой был уведомлен отправитель WAL
latest_end_timetimestamp with time zoneВремя последней записи в WAL, о которой был уведомлен отправитель WAL

Представление pg_stat_subscription будет содержать одну строку для каждой подписки для основного процесса (с NULL в PID, если процесс не работает) и дополнительные строки для процессов, обрабатывающих начальные данные для таблиц в подписке.

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

колонкаТипОписание
pidintegerИдентификатор процесса бэкенда или процесса отправителя WAL
sslbooleanTrue, если SSL используется для этого соединения
versiontextИспользуемая версия SSL или NULL, если SSL в этом соединении не используется.
ciphertextИмя используемого шифра SSL или NULL, если SSL не используется в этом соединении
bitsintegerКоличество бит в используемом алгоритме шифрования или NULL, если SSL не используется в этом соединении
compressionbooleanTrue, если используется сжатие SSL, false, если нет, или NULL, если SSL не используется в этом соединении.
client_dntextПоле «Уникальное имя» (DN) из используемого клиентского сертификата или NULL, если клиентский сертификат не был предоставлен или SSL не используется в этом соединении. Это поле усекается, если поле DN длиннее, чем NAMEDATALEN (64 символа в стандартной сборке).
client_serialnumericСерийный номер сертификата клиента или NULL, если сертификат клиента не предоставлен или SSL не используется в этом соединении. Комбинация серийного номера сертификата и эмитента сертификата однозначно идентифицирует сертификат (если только эмитент ошибочно не использует серийные номера).
issuer_dntextDN эмитента клиентского сертификата или NULL, если клиентский сертификат не был предоставлен или SSL не используется в этом соединении. Это поле усекается как client_dn.

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

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

колонкаТипОписание
pidintegerИдентификатор процесса бэкэнда
gss_authenticatedbooleanИстинно, если для этого соединения использовалась аутентификация GSSAPI
principaltextПринципал, используемый для аутентификации этого соединения, или NULL, если GSSAPI не использовался для аутентификации этого соединения. Это поле усекается, если участник длиннее, чем NAMEDATALEN (64 символа в стандартной сборке).
encryptedbooleanTrue, если в этом соединении используется шифрование GSSAPI

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

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

колонкаТипОписание
archived_countbigintКоличество файлов WAL, которые были успешно заархивированы
last_archived_waltextИмя последнего файла WAL, успешно заархивированного
last_archived_timetimestamp with time zoneВремя последней успешной операции архивирования
failed_countbigintКоличество неудачных попыток архивирования файлов WAL
last_failed_waltextИмя файла WAL последней неудачной операции архивирования
last_failed_timetimestamp with time zoneВремя последней неудачной архивной операции
stats_resettimestamp with time zoneВремя последнего сброса этой статистики

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

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

колонкаТипОписание
checkpoints_timedbigintКоличество запланированных контрольных точек, которые были выполнены
checkpoints_reqbigintКоличество запрошенных контрольных точек, которые были выполнены
checkpoint_write_timedouble precisionОбщее время, потраченное на этап обработки контрольной точки, где файлы записываются на диск, в миллисекундах
checkpoint_sync_timedouble precisionОбщее количество времени, потраченное на часть обработки контрольной точки, где файлы синхронизируются с диском, в миллисекундах
buffers_checkpointbigintКоличество буферов, записанных во время контрольных точек
buffers_cleanbigintКоличество буферов, записанных фоновым процессом записи
maxwritten_cleanbigintКоличество раз, когда процесс записи в фоновом режиме останавливал сброс грязных страниц, поскольку записывал слишком много буферов
buffers_backendbigintКоличество буферов, записанных непосредственно бэкэндом
buffers_backend_fsyncbigintСколько раз бэкэнд выполнял вызов fsync сам (обычно их обрабатывает фоновый процесс записи, даже когда бэкэнд выполняет запись самостоятельно)
buffers_allocbigintКоличество выделенных буферов
stats_resettimestamp with time zoneВремя последнего сброса этой статистики

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

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

колонкаТипОписание
datidoidOID базы данных или 0 для объектов, принадлежащих к общим отношениям
datnamenameИмя базы данных или NULL для общих объектов.
numbackendsintegerКоличество бэкэндов, которые в данный момент подключены к этой базе данных, или NULL для общих объектов. Это единственный столбец в этом представлении, который возвращает значение, отражающее текущее состояние; все остальные столбцы возвращают накопленные значения с момента последнего сброса.
xact_commitbigintКоличество транзакций в этой базе данных, которые были совершены
xact_rollbackbigintКоличество транзакций в этой базе данных, которые были отменены
blks_readbigintКоличество дисковых блоков, прочитанных в этой базе данных
blks_hitbigintКоличество обнаружений дисковых блоков в буферном кеше, так что чтение не было необходимо (это включает только попадания в буферный кеш QHB , а не в кэш файловой системы операционной системы)
tup_returnedbigintКоличество строк, возвращенных запросами в этой базе данных
tup_fetchedbigintКоличество строк, извлеченными запросами в этой базе данных
tup_insertedbigintКоличество строк, вставленных запросами в этой базе данных
tup_updatedbigintКоличество строк, обновленных запросами в этой базе данных
tup_deletedbigintКоличество строк, удаленных запросами в этой базе данных
conflictsbigintКоличество запросов отменено из-за конфликтов при восстановлении в этой базе данных. (Конфликты возникают только на резервных серверах; подробности смотрите в pg_stat_database_conflicts.)
temp_filesbigintКоличество временных файлов, созданных запросами в этой базе данных. Подсчитываются все временные файлы, независимо от того, почему был создан временный файл (например, при сортировке или хэшировании), и независимо от настройки log_temp_files.
temp_bytesbigintОбщий объем данных, записанных во временные файлы по запросам в этой базе данных. Учитываются все временные файлы, независимо от того, почему был создан временный файл, и независимо от настройки log_temp_files.
deadlocksbigintКоличество взаимоблокировок, обнаруженных в этой базе данных
checksum_failuresbigintЧисло ошибок контрольной суммы страницы данных, обнаруженных в этой базе данных (или в общем объекте), или NULL, если контрольные суммы данных не включены.
checksum_last_failuretimestamp with time zoneВремя, когда в этой базе данных (или в общем объекте) был обнаружен последний сбой контрольной суммы страницы данных, или NULL, если контрольные суммы данных не включены.
blk_read_timedouble precisionВремя, затраченное на чтение блоков файлов данных бэкэндами в этой базе данных, в миллисекундах
blk_write_timedouble precisionВремя, затрачиваемое на запись блоков файлов данных бэкэндами в этой базе данных, в миллисекундах
stats_resettimestamp with time zoneВремя последнего сброса этой статистики

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

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

колонкаТипОписание
datidoidOID базы данных
datnamenameИмя базы данных
confl_tablespacebigintКоличество запросов в этой базе данных, которые были отменены из-за удаленных табличных пространств
confl_lockbigintКоличество запросов в этой базе данных, которые были отменены из-за тайм-аутов блокировки
confl_snapshotbigintКоличество запросов в этой базе данных, которые были отменены из-за устаревших снимков данных
confl_bufferpinbigintКоличество запросов в этой базе данных, которые были отменены из-за закрепленных буферов
confl_deadlockbigintКоличество запросов в этой базе данных, которые были отменены из-за взаимных блокировок

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

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

колонкаТипОписание
relidoidOID таблицы
schemanamenameИмя схемы, в которой находится эта таблица
relnamenameИмя этой таблицы
seq_scanbigintКоличество последовательных сканирований, выполненных по этой таблице
seq_tup_readbigintКоличество живых строк, выбранных при последовательном сканировании
idx_scanbigintКоличество сканирований индекса, выполненных для этой таблицы
idx_tup_fetchbigintКоличество живых строк, выбранных при сканировании индекса
n_tup_insbigintКоличество вставленных строк
n_tup_updbigintКоличество обновленных строк (включая обновленные в режиме HOT)
n_tup_delbigintКоличество удаленных строк
n_tup_hot_updbigintКоличество строк, обновленных в режиме HOT (т.е. не требуется отдельное обновление индекса)
n_live_tupbigintРасчетное количество живых строк
n_dead_tupbigintРасчетное количество мертвых строк
n_mod_since_analyzebigintПредполагаемое количество строк, измененных с момента последнего анализа этой таблицы
last_vacuumtimestamp with time zoneПоследний раз, когда эта таблица была очищена вручную (не считая VACUUM FULL)
last_autovacuumtimestamp with time zoneПоследний раз, когда эта таблица была очищена фоновым процессом автоочистки
last_analyzetimestamp with time zoneПоследний раз, когда эта таблица анализировалась вручную
last_autoanalyzetimestamp with time zoneПоследний раз, когда эта таблица анализировалась фоновым процессом автоочистки
vacuum_countbigintСколько раз эта таблица очищалась вручную (не считая VACUUM FULL)
autovacuum_countbigintСколько раз эта таблица очищалась фоновым процессом автоочистки
analyze_countbigintСколько раз эта таблица была проанализирована вручную
autoanalyze_countbigintСколько раз эта таблица анализировалась фоновым процессом автоочистки

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

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

колонкаТипОписание
relidoidOID таблицы для этого индекса
indexrelidoidOID этого индекса
schemanamenameИмя схемы, в которой находится этот индекс
relnamenameИмя таблицы для этого индекса
indexrelnamenameНаименование этого индекса
idx_scanbigintКоличество сканирований индекса, выполненных по этому индексу
idx_tup_readbigintКоличество записей индекса, возвращенных сканированием по этому индексу
idx_tup_fetchbigintКоличество живых строк таблицы, выбранных при простом сканировании индекса с использованием этого индекса

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

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

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

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

колонкаТипОписание
relidoidOID таблицы
schemanamenameИмя схемы, в которой находится эта таблица
relnamenameИмя этой таблицы
heap_blks_readbigintКоличество дисковых блоков, прочитанных из этой таблицы
heap_blks_hitbigintКоличество попаданий в буфер в этой таблице
idx_blks_readbigintКоличество дисковых блоков, прочитанных по всем индексам в этой таблице
idx_blks_hitbigintКоличество попаданий в буфер во всех индексах этой таблицы
toast_blks_readbigintКоличество дисковых блоков, прочитанных из таблицы TOAST этой таблицы (если есть)
toast_blks_hitbigintКоличество попаданий в буфер в таблице TOAST этой таблицы (если есть)
tidx_blks_readbigintКоличество дисковых блоков, прочитанных из индексов таблицы TOAST этой таблицы (если есть)
tidx_blks_hitbigintКоличество попаданий в буфер в индексах таблицы TOAST этой таблицы (если есть)

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

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

колонкаТипОписание
relidoidOID таблицы для этого индекса
indexrelidoidOID этого индекса
schemanamenameИмя схемы, в которой находится этот индекс
relnamenameИмя таблицы для этого индекса
indexrelnamenameНаименование этого индекса
idx_blks_readbigintКоличество дисковых блоков, прочитанных из этого индекса
idx_blks_hitbigintКоличество попаданий в буфер в этом индексе

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

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

колонкаТипОписание
relidoidOID последовательности
schemanamenameИмя схемы, в которой находится эта последовательность
relnamenameИмя этой последовательности
blks_readbigintКоличество дисковых блоков, прочитанных из этой последовательности
blks_hitbigintКоличество попаданий в буфер в этой последовательности

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

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

колонкаТипОписание
funcidoidOID функции
schemanamenameИмя схемы, в которой находится эта функция
funcnamenameИмя этой функции
callsbigintСколько раз эта функция была вызвана
total_timedouble precisionОбщее время, потраченное на эту функцию и все другие функции, вызываемые ею, в миллисекундах
self_timedouble precisionОбщее время, потраченное на саму функцию, не включая другие вызываемые ею функции, в миллисекундах

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

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

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

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

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

функцияReturn TypeОписание
pg_backend_pid()integerИдентификатор процесса сервера, обрабатывающего текущий сеанс
pg_stat_get_activity ( integer )setof recordВозвращает запись информации о бэкэнде с указанным PID или одну запись для каждого активного бэкенда в системе, если указано NULL. Возвращенные поля являются подмножеством полей в представлении pg_stat_activity.
pg_stat_get_snapshot_timestamp()timestamp with time zoneВозвращает время снимка текущей статистики
pg_stat_clear_snapshot()voidСбросить текущий снимок статистики
pg_stat_reset()voidСброс всех счетчиков статистики для текущей базы данных до нуля (по умолчанию требуются привилегии суперпользователя, но EXECUTE для этой функции может быть предоставлен другим.)
pg_stat_reset_shared (text)voidСброс некоторых счетчиков статистики для всего кластера на ноль, в зависимости от аргумента (по умолчанию требуются привилегии суперпользователя, но EXECUTE для этой функции может быть предоставлен другим). Вызов pg_stat_reset_shared (’bgwriter’) обнулит все счетчики, показанные в представлении pg_stat_bgwriter. Вызов pg_stat_reset_shared (’archiver’) обнулит все счетчики, показанные в представлении pg_stat_archiver.
pg_stat_reset_single_table_counters (oid)voidСброс статистики для отдельной таблицы или индекса в текущей базе данных до нуля (по умолчанию требуются привилегии суперпользователя, но EXECUTE для этой функции может быть предоставлен другим)
pg_stat_reset_single_function_counters (oid)voidСброс статистики для одной функции в текущей базе данных до нуля (по умолчанию требуются привилегии суперпользователя, но EXECUTE для этой функции может быть предоставлен другим)

pg_stat_get_activity, основная функция представления pg_stat_activity, возвращает набор записей, содержащих всю доступную информацию о каждом бэкэнд-процессе. Иногда бывает удобнее получить только часть этой информации. В таких случаях может использоваться более старый набор функций доступа к статистике на уровне серверных процессов; они приведены в таблице 21. Эти функции доступа используют идентификационный номер бэкэнда, который варьируется от одного до количества текущих активных бэкэндов. Функция 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;

Таблица 21. Статистические функции на уровне бэкэндов

функцияReturn TypeОписание
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)inetIP-адрес клиента, подключенного к этому бэкэнду
pg_stat_get_backend_client_port(integer)integerНомер порта TCP, который клиент использует для связи
pg_stat_get_backend_dbid(integer)oidOID базы данных, с которой связан этот бэкэнд
pg_stat_get_backend_pid(integer)integerИдентификатор процесса этого бэкэнда
pg_stat_get_backend_start(integer)timestamp with time zoneВремя, когда этот процесс был запущен
pg_stat_get_backend_userid(integer)oidOID пользователя, подключенного к этому бэкэнду
pg_stat_get_backend_wait_event_type(integer)textИмя типа события ожидания, если бэкэнд в данный момент ожидает, иначе NULL. См. Таблицу 4 для получения деталей.
pg_stat_get_backend_wait_event(integer)textИмя события ожидания, если бэкэнд в данный момент ожидает, иначе NULL. См. Таблицу 4 для получения деталей.
pg_stat_get_backend_xact_start(integer)timestamp with time zoneВремя начала текущей транзакции

Просмотр блокировок

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

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

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

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

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

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

QHB имеет возможность сообщать о ходе выполнения определенных команд во время их выполнения. В настоящее время командами, которые поддерживают отчеты о ходе выполнения, являются CREATE INDEX, VACUUM и CLUSTER. Этот список может быть расширен в будущем.

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

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

Таблица 22. Просмотр pg_stat_progress_create_index

колонкаТипОписание
pidintegerИдентификатор процесса бэкэнда.
datidoidOID базы данных, с которой связан этот бэкэнд.
datnamenameИмя базы данных, с которой связан этот бэкэнд.
relidoidOID таблицы, для которой создается индекс.
index_relidoidOID создаваемого или переиндексированного индекса. Во время выполнения CREATE INDEX в неблокирующем режиме значение 0.
commandtextКоманда, которая выполняется: CREATE INDEX, CREATE INDEX CONCURRENTLY, REINDEX или REINDEX CONCURRENTLY.
phasetextТекущая фаза обработки создания индекса. Смотри таблицу 23.
lockers_totalbigintОбщее число процессов, требующих ожидания, когда они есть.
lockers_donebigintЧисло процессов, которые завершили ожидание.
current_locker_pidbigintИдентификатор процесса, удерживающего блокировку в данный момент.
blocks_totalbigintОбщее количество блоков, подлежащих обработке.
blocks_donebigintКоличество блоков, уже обработанных на текущем этапе.
tuples_totalbigintОбщее количество кортежей, которые должны быть обработаны в текущей фазе.
tuples_donebigintКоличество кортежей, уже обработанных в текущей фазе.
partitions_totalbigintПри создании индекса для партицированной таблицы в этом столбце указывается общее количество партиций, для которых создается индекс.
partitions_donebigintПри создании индекса для партицированной таблицы в этом столбце указывается количество партиций, для которых индекс был заполнен.

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

ФазаОписание
initializingИнициализация. CREATE INDEX или REINDEX готовится к созданию индекса. Ожидается, что этот этап будет очень коротким.
waiting for writers before buildОжидание окончания записи перед построением. CREATE 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 validationОжидание окончания записи перед проверкой. CREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидают транзакции с блокироваками записей, которые потенциально могут завершить обновление данных в таблице. Эта фаза пропускается при выполнении операции в неблокирующем режиме. Столбцы lockers_total, lockers_done и current_locker_pid содержат информацию о ходе выполнения этой фазы.
index validation: scanning indexПроверка индекса: сканирование. CREATE INDEX CONCURRENTLY сканирует индекс в поисках кортежей, которые необходимо проверить. Эта фаза пропускается, когда не в параллельном режиме. Столбцы blocks_total (для общего размера индекса) и blocks_done содержат информацию о ходе выполнения этой фазы.
index validation: sorting tuplesПроверка индекса: сортировка кортежей. CREATE INDEX CONCURRENTLY сортирует выходные данные фазы сканирования индекса.
index validation: scanning tableПроверка индекса: сканирование таблицы. CREATE INDEX CONCURRENTLY сканирует таблицу для проверки кортежей индексов, собранных на предыдущих двух этапах. Эта фаза пропускается, когда не в параллельном режиме. Столбцы blocks_total (для общего размера таблицы) и blocks_done содержат информацию о ходе выполнения этой фазы.
waiting for old snapshotsОжидание старых снимков. CREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидает транзакций, которые потенциально могут увидеть таблицу, чтобы выпустить их моментальные снимки. Эта фаза пропускается при выполнении операции в неблокирующем режиме. Столбцы lockers_total, lockers_done и current_locker_pid содержат информацию о ходе выполнения этой фазы.
waiting for readers before marking deadОжидание завершения чтения перед отключением старого индекса. REINDEX CONCURRENTLY ожидает завершение транзакций, удерживающих блокировки чтения, прежде чем пометить старый индекс как нерабочий. Эта фаза пропускается при выполнении операции в неблокирующем режиме. Столбцы lockers_total, lockers_done и current_locker_pid содержат информацию о ходе выполнения этой фазы.
waiting for readers before droppingОжидание завершения чтения перед удалением старого индекса. REINDEX 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.

Таблица 24. Просмотр pg_stat_progress_vacuum

колонкаТипОписание
pidintegerИдентификатор процесса бэкэнда.
datidoidOID базы данных, с которой связан этот бэкэнд.
datnamenameИмя базы данных, с которой связан этот бэкэнд.
relidoidOID стола пылесосят.
phasetextТекущая фаза обработки вакуума. Смотри Таблицу 25.
heap_blks_totalbigintОбщее количество блоков кучи в таблице. Этот номер сообщается с начала сканирования; добавленные позже блоки не будут (и не обязательно) посещаться этим VACUUM.
heap_blks_scannedbigintКоличество отсканированных блоков кучи. Поскольку карта видимости используется для оптимизации сканирования, некоторые блоки будут пропущены без проверки; пропущенные блоки включены в это общее количество, так что это число в конечном итоге станет равным heap_blks_total когда вакуум будет завершен. Этот счетчик активируется только тогда, когда фаза scanning heap.
heap_blks_vacuumedbigintКоличество блоков кучи вакуумировано. Если таблица не имеет индексов, этот счетчик увеличивается только тогда, когда фаза vacuuming heap. Блоки, которые не содержат мертвых кортежей, пропускаются, поэтому счетчик может иногда пропускать вперед с большими приращениями.
index_vacuum_countbigintКоличество выполненных индексных вакуумных циклов.
max_dead_tuplesbigintКоличество мертвых кортежей, которые мы можем сохранить перед выполнением цикла индекса вакуума, основываясь на maintenance_work_mem.
num_dead_tuplesbigintКоличество мертвых кортежей, собранных с момента последнего индекса вакуумного цикла.

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

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

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

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

Таблица 26. просмотр pg_stat_progress_cluster

КолонкаТипОписание
pidintegerИдентификатор процесса бэкэнда.
datidoidOID базы данных, с которой связан этот бэкэнд.
datnamenameИмя базы данных, с которой связан этот бэкэнд.
relidoidOID кластеризованной таблицы.
commandtextКоманда, которая выполняется. Либо CLUSTER либо VACUUM FULL.
phasetextТекущая фаза обработки. Смотри Таблицу 27.
cluster_index_relidoidЕсли таблица сканируется с использованием индекса, это OID используемого индекса; в противном случае это ноль.
heap_tuples_scannedbigintКоличество отсканированных кучи. Этот счетчик увеличивается только тогда, когда фаза является последовательной seq scanning heap, index scanning heap или writing new heap.
heap_tuples_writtenbigintКоличество написанных кучи кортежей. Этот счетчик увеличивается только тогда, когда фаза является последовательной seq scanning heap, index scanning heap или writing new heap.
heap_blks_totalbigintОбщее количество блоков кучи в таблице. Это число сообщается как начало seq scanning heap.
heap_blks_scannedbigintКоличество отсканированных блоков кучи. Этот счетчик активируется только тогда, когда фаза является последовательной seq scanning heap.
index_rebuild_countbigintКоличество перестроенных индексов. Этот счетчик увеличивается только тогда, когда фаза rebuilding index.

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

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

Метрики QHB

Общие замечания

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

Типы метрик

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

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

Системные метрики

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

  • qhb_os_monitoring - логическая константа, по умолчанию значение off. При значении on выполняется периодический сбор метрик.
  • qhb_os_stat_period - период сбора системной статистики в секундах, по умолчанию 30 секунд.
Загрузка и CPU
НаименованиеОписаниеТип метрики
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 Чтобы детальнее ознакомиться с особенностями, связанными с этим показателем, можно ознакомиться с переводом статьи Brendan Gregg: https://habr.com/ru/company/mailru/blog/335326

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

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. Однако, эти расчеты и значения будут иметь довольно приблизительный и даже условный характер, что показывает приведенная выше по ссылке статья.

Использование памяти
НаименованиеОписаниеТип метрики
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 (значения в kB, т.е. соответствуют выводу free -k):

МетрикаПоле утилиты 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

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

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

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

Swap:used = Swap:total - Swap:free

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

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

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

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

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

Метрики по вводу-выводу

Метрики чтения блоков на уровне инстанса QHB
НаименованиеОписаниеТип метрики
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.blocks_fetched и qhb.db_stat.blocks_hit рассчитывается коэффициент попадания в кэш:
k = blocks_hit / blocks_fetched * 100% Хорошим уровнем обычно считается значение более 90%. Если значение коэффициента существенно ниже этой отметки, желательно рассмотреть возможность увеличения объема буферного кэша.

Метрики процесса bgwriter
НаименованиеОписаниеТип метрики
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". Обычно при выполнении запланированных контрольных точек сначала происходит запись информации о начале контрольной точки, затем в течение некоторого времени идет сброс блоков на диск и по окончании контрольной точки фиксируется информация о продолжительности записи и синхронизации данных. В случае обработки запланированной контрольной точки запись блоков равномерно распределяется во времени согласно параметрам настройки, чтобы снизить влияние этого процесса на общий ввод-вывод. При запрошенных через команду контрольных точках сброс блоков происходит сразу, без искусственной задержки.

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

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

Метрики по транзакциям

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

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

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

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

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

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

Метрики событий ожиданий

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

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

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

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

Метрики буферного менеджера

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

НаименованиеОперацияОписаниеТип метрикиАгрегат
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

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

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

НаименованиеОперацияОписаниеТип метрики
backend_heldвыполнение запросавремя, в течение которого qcp удерживает соединение к серверу привязанным к какому-то клиентуtimer
queueвыполнение запросаколичество запросов в очереди на текущий моментgauge
relay.wait_requestвыполнение запросавремя ожидания получения запроса от клиентаtimer
relay.wait_responseвыполнение запросавремя ожидания ответа на запрос от сервераtimer

Дашборды метрик QHB для Grafana

Дашборды 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". После этого нужно заполнить необходимые параметры и выполнить загрузку JSON-описания.

Дашборд "Операционная система"

Дашборд представляет основные системные показатели:

  • Время работы инстанаса QHB
  • Load Average
  • Исполользование CPU
  • Использование памяти
  • Использование дисковой системы, на которой расположен каталог баз данных

Дашборд "QHB"

Дашборд содержит несколько разделов:

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

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

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

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

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

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

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

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

Для настройки отправки аннотаций необходимо в qhb.conf прописать следующие параметры:
grafana.address - адрес Графаны, например http://localhost:3000
grafana.token - необходимо указать токен, полученный в Графане по адресу http://localhost:3000/org/apikeys

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

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

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

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

Для сбора системных метрик (Дашборд "Операционная система") необходимо установить параметр 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'); /* Текст аннотации и два тега */