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

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

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



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

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

$ ps auxww | grep ^qhb
qhb  15551  0.0  0.1  57536  7132 pts/0    S    18:02   0:00 qhb -i
qhb  15554  0.0  0.0  57536  1184 ?        Ss   18:02   0:00 qhb: background writer
qhb  15555  0.0  0.0  57536   916 ?        Ss   18:02   0:00 qhb: checkpointer
qhb  15556  0.0  0.0  57536   916 ?        Ss   18:02   0:00 qhb: walwriter
qhb  15557  0.0  0.0  58504  2244 ?        Ss   18:02   0:00 qhb: autovacuum launcher
qhb  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: пользователь база_данных хост активность

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

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

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


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

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

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



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

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

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


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

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

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

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

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

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

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

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

Сборщик статистики передает собранные данные другим процессам QHB через временные файлы. Эти файлы хранятся в каталоге, имя которого задается параметром 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, имеет ограничения по безопасности. Обычные пользователи могут видеть только всю информацию о своих собственных сеансах (сеансах, принадлежащих роли, членами которой они являются). В строках о других сеансах многие столбцы будут содержать NULL. Однако обратите внимание, что существование сеанса и его общие свойства, такие как пользователь сеанса и база данных, видны всем пользователям. Суперпользователи и члены встроенной роли pg_read_all_stats (см. также раздел Предопределенные роли) могут видеть всю информацию обо всех сеансах.

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

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

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

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

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

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


pg_stat_activity

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

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

Тип столбца

Описание

datid oid

OID базы данных, к которой подключен этот обслуживающий процесс

datname name

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

pid integer

Идентификатор процесса этого обслуживающего процесса

leader_pid integer

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

usesysid oid

OID пользователя, подсоединившегося к этому обслуживающему процессу

usename name

Имя пользователя, подсоединившегося к этому обслуживающему процессу

application_name text

Имя приложения, подключенного к этому обслуживающему процессу

client_addr inet

IP-адрес клиента, подключенного к этому обслуживающему процессу. Если данное поле равно NULL, это показывает, что клиент подключен через сокет домена Unix на компьютере сервера или что это внутренний процесс, например автоочистка.

client_hostname text

Имя хоста подключенного клиента, получаемое обратным поиском в DNS по client_addr. Это поле будет отлично от NULL только для IP-соединений и только когда включен параметр log_hostname.

client_port integer

Номер TCP-порта, который клиент использует для взаимодействия с этим обслуживающим процессом, или -1, если используется сокет домена Unix. Если данное поле равно NULL, это показывает, что это внутренний серверный процесс.

backend_start timestamp with time zone

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

xact_start timestamp with time zone

Время начала текущей транзакции этого процесса или NULL, если активная транзакция отсутствует. Если текущий запрос является первым в своей транзакции, значение в этом столбце равно значению столбца query_start.

query_start timestamp with time zone

Время запуска текущего активного запроса или, если значение state не active, то время запуска последнего запроса

state_change timestamp with time zone

Время последнего изменения поля state

wait_event_type text

Тип события, которого ждет обслуживающий процесс, если таковое ожидание имеется; в противном случае NULL. См. Таблицу 4.

wait_event text

Имя ожидаемого события, если обслуживающий процесс в настоящий момент находится в ожидании, в противном случае NULL. См. с Таблицы 5 по Таблицу 13.

state text

Общее текущее состояние этого обслуживающего процесса. Возможные значения:

  • active: Обслуживающий процесс выполняет запрос.
  • idle: Обслуживающий процесс ожидает новой команды от клиента.
  • idle in transaction: Обслуживающий процесс находится внутри транзакции, но в настоящее время не выполняет запрос.
  • idle in transaction (aborted): Этот состояние схоже с idle in transaction, за исключением того, что один из операторов в транзакции вызвал ошибку.
  • fastpath function call: Обслуживающий процесс выполняет функцию по быстрому пути (fast-path).
  • disabled: Это состояние отображается, если в этом обслуживающем процессе отключен параметр track_activities.

backend_xid xid

Идентификатор транзакции верхнего уровня этого серверного процесса, если таковая имеется.

backend_xmin xid

Граница xmin текущего обслуживающего процесса.

query_id bigint

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

query text

Текст последнего запроса этого обслуживающего процесса. Если state имеет значение active, в этом поле отображается запрос, выполняемый в настоящий момент. При всех остальных состояниях в нем отображается последний выполненный запрос. По умолчанию текст запроса усекается до 1024 байт; это значение можно изменить с помощью параметра track_activity_query_size.

backend_type text

Тип текущего обслуживающего процесса. Возможные типы: autovacuum launcher, autovacuum worker, logical replication launcher, logical replication worker, parallel worker, background writer, client backend, checkpointer, archiver, startup, walreceiver, walsender и walwriter. Кроме того, у фоновых рабочих процессов, регистрируемых расширениями, могут быть дополнительные типы.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pg_stat_replication

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

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

Тип столбца

Описание

pid integer

Идентификатор процесса-отправителя WAL

usesysid oid

OID пользователя, подсоединившегося к этому процессу-отправителю WAL

usename name

Имя пользователя, подсоединившегося к этому процессу-отправителю WAL

application_name text

Имя приложения, подключенного к этому отправителю WAL

client_addr inet

IP-адрес клиента, подключенного к этому отправителю WAL. Если данное поле равно NULL, это показывает, что клиент подключен через сокет домена Unix на компьютере сервера.

client_hostname text

Имя хоста подключенного клиента, получаемое обратным поиском в DNS по client_addr. Это поле будет отлично от NULL только для IP-соединений и только когда включен параметр log_hostname.

client_port integer

Номер TCP-порта, который клиент использует для взаимодействия с этим отправителем WAL, или -1, если используется сокет домена Unix

backend_start timestamp with time zone

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

backend_xmin xid

Граница xmin этого резервного сервера, отображаемая при включенном параметре hot_standby_feedback.

state text

Текущее состояние этого отправителя WAL. Возможные значения:

  • startup: Этот отправитель WAL запускается.
  • catchup: Резервный сервер, к которому подключен этот отправитель WAL, догоняет основной сервер.
  • streaming: Этот отправитель WAL передает в потоке изменения после того, как резервный сервер, к которому он подключен, догнал основной сервер.
  • backup: Этот отправитель WAL передает резервную копию.
  • stopping: Этот отправитель WAL останавливается.

sent_lsn pg_lsn

Последняя позиция в журнале упреждающей записи, переданная через это соединение

write_lsn pg_lsn

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

flush_lsn pg_lsn

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

replay_lsn pg_lsn

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

write_lag interval

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

flush_lag interval

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

replay_lag interval

Время, прошедшее с момента локального сброса последних данных WAL до получения уведомления о том, что этот резервный сервер их записал, сбросил на диск и применил. Это можно использовать для оценки задержки при фиксации, вызываемой установкой в параметре synchronous_commit уровня remote_apply, если этот сервер был сконфигурирован как синхронный резервный.

sync_priority integer

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

sync_state text

Состояние синхронизации этого резервного сервера. Возможные значения:

  • async: Этот резервный сервер является асинхронным.
  • potential: Сейчас этот резервный сервер является асинхронным, но потенциально может стать синхронным, если откажет один из текущих синхронных серверов.
  • sync: Этот резервный сервер является синхронным.
  • quorum: Этот резервный сервер считается кандидатом в кворум резервных серверов.

reply_time timestamp with time zone

Время передачи последнего ответного сообщения, полученного от резервного сервера

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

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

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


pg_stat_replication_slots

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

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

Тип столбца

Описание

slot_name text

Уникальный на уровне кластера идентификатор для слота репликации

spill_txns bigint

Количество транзакций, вытесненных на диск после того, как объем памяти, используемый при логическом декодировании изменений из WAL, превысил logical_decoding_work_mem. Этот счетчик прирастает с учетом как транзакций верхнего уровня, так и субтранзакций.

spill_count bigint

Сколько раз транзакции были вытеснены на диск при декодировании изменений из WAL для этого слота. Этот счетчик прирастает каждый раз, когда транзакция вытесняется, и одна и та же транзакция может вытесняться несколько раз.

spill_bytes bigint

Объем декодированных транзакционных данных, вытесненных на диск при проведении декодирования изменений из WAL для этого слота. Этот и другие счетчики вытеснения можно использовать для оценки ввода/вывода, происходящего во время логического декодирования и настройки параметра logical_decoding_work_mem.

stream_txns bigint

Количество текущих транзакций, передаваемых в потоке в плагин вывода декодирования после того, как объем памяти, используемый для логического декодирования изменений из WAL для этого слота, превысил logical_decoding_work_mem. Потоковая передача работает только для транзакций верхнего уровня (субтранзакции не могут передаваться в потоке независимо), поэтому счетчик прирастает без учета субтранзакций.

stream_count bigint

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

stream_bytes bigint

Объем транзакционных данных, декодированных для передачи текущих транзакций в потоке в плагин вывода декодирования при декодировании изменений из WAL для этого слота. Этот и другие счетчики потоковой передачи для этого слота можно использовать для настройки параметра logical_decoding_work_mem.

total_txns bigint

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

total_bytes bigint

Объем транзакционных данных, декодированных для отправки транзакций в плагин вывода декодирования при декодировании изменений из WAL для этого слота. Обратите внимание, что сюда входят передаваемые в потоке и/или вытесняемые данные.

stats_reset timestamp with time zone

Последнее время сброса этих статистических данных


pg_stat_wal_receiver

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

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

Тип столбца

Описание

pid integer

Идентификатор процесса-получателя WAL

status text

Статус активности процесса-получателя WAL

receive_start_lsn pg_lsn

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

receive_start_tli integer

Первый номер временной шкалы, использованный в момент запуска получателя WAL

written_lsn pg_lsn

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

flushed_lsn pg_lsn

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

received_tli integer

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

last_msg_send_time timestamp with time zone

Время передачи последнего сообщения, полученного от исходного отправителя WAL

last_msg_receipt_time timestamp with time zone

Время приема последнего сообщения, полученного от исходного отправителя WAL

latest_end_lsn pg_lsn

Последняя позиция в журнале упреждающей записи, сообщенная исходному отправителю WAL

latest_end_time timestamp with time zone

Время последней позиции в журнале упреждающей записи, сообщенной исходному отправителю WAL

slot_name text

Имя слота репликации, используемого этим получателем WAL

sender_host text

Хост экземпляра QHB, к которому подключен этот получатель WAL. Это может быть имя хоста, IP-адрес или путь каталога (если подключение установлено через сокет домена Unix). (Вариант с путем можно распознать, поскольку это всегда будет абсолютный путь, начинающийся с /.)

sender_port integer

Номер порта экземпляра QHB, к которому подключен этот получатель WAL.

conninfo text

Строка подключения, используемая этим получателем WAL, со скрытыми полями повышенной секретности.


pg_stat_subscription

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

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

Тип столбца

Описание

subid oid

Идентификатор подписки

subname name

Имя подписки

pid integer

Идентификатор рабочего процесса этой подписки

relid oid

Идентификатор отношения, которое синхронизирует этот рабочий процесс; NULL для основного задействованного рабочего процесса

received_lsn pg_lsn

Последняя полученная позиция в журнале упреждающей записи; начальным значением этого поля будет 0

last_msg_send_time timestamp with time zone

Время передачи последнего сообщения, полученного от исходного отправителя WAL

last_msg_receipt_time timestamp with time zone

Время приема последнего сообщения, полученного от исходного отправителя WAL

latest_end_lsn pg_lsn

Последняя позиция в журнале упреждающей записи, сообщенная исходному отправителю WAL

latest_end_time timestamp with time zone

Время последней позиции в журнале упреждающей записи, сообщенной исходному отправителю WAL


pg_stat_ssl

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

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

Тип столбца

Описание

pid integer

Идентификатор обслуживающего процесса или процесса-отправителя WAL

ssl boolean

True, если для этого подключения используется SSL

version text

Версия используемого SSL или NULL, если для этого подключения не используется SSL

cipher text

Имя используемого шифра SSL или NULL, если для этого подключения не используется SSL

bits integer

Количество битов в используемом алгоритме шифрования или NULL, если для этого подключения не используется SSL

client_dn text

Поле DN (Distinguished Name, уникальное имя) из используемого клиентского сертификата или NULL, если клиентский сертификат не предоставлен или если для этого подключения не используется SSL. Это поле усекается, если поле DN длиннее NAMEDATALEN (64 символа в стандартной сборке).

client_serial numeric

Серийный номер клиентского сертификата или NULL, если клиентский сертификат не предоставлен или если для этого подключения не используется SSL. Сочетание серийного номера сертификата и имени центра сертификации однозначно идентифицирует сертификат (если только центр сертификации по ошибке не использует серийные номера повторно).

issuer_dn text

DN центра сертификации, выдавшего клиентский сертификат, или NULL, если клиентский сертификат не предоставлен или если для этого подключения не используется SSL. Это поле усекается аналогично полю client_dn.


pg_stat_gssapi

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

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

Тип столбца

Описание

pid integer

Идентификатор обслуживающего процесса

gss_authenticated boolean

True, если для этого подключения используется аутентификация GSSAPI

principal text

Субъект-служба, используемый для аутентификации этого подключения, или NULL, если для аутентификации этого подключения не использовалось GSSAPI. Это поле усекается, если имя субъекта-службы длиннее NAMEDATALEN (64 символа в стандартной сборке).

encrypted boolean

True, если для этого подключения используется шифрование GSSAPI


pg_stat_archiver

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

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

Тип столбца

Описание

archived_count bigint

Количество файлов WAL, которые уже были успешно заархивированы

last_archived_wal text

Имя последнего успешно заархивированного файла WAL

last_archived_time timestamp with time zone

Время последней успешной операции архивирования

failed_count bigint

Число неудачных попыток архивирования файлов WAL

last_failed_wal text

Имя файла WAL последней неудачной операции архивирования

last_failed_time timestamp with time zone

Время последней неудачной операции архивирования

stats_reset timestamp with time zone

Время последнего сброса этих статистических данных


pg_stat_bgwriter

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

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

Тип столбца

Описание

checkpoints_timed bigint

Количество запланированных контрольных точек, которые уже были выполнены

checkpoints_req bigint

Количество запрошенных контрольных точек, которые уже были выполнены

checkpoint_write_time double precision

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

checkpoint_sync_time double precision

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

buffers_checkpoint bigint

Количество буферов, записанных во время контрольных точек

buffers_clean bigint

Количество буферов, записанных фоновым процессом записи

maxwritten_clean bigint

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

buffers_backend bigint

Количество буферов, записанных непосредственно обслуживающим процессом

buffers_backend_fsync bigint

Сколько раз обслуживающему процессу пришлось выполнить вызов своей собственной fsync (обычно эти вызовы обрабатывает фоновый процесс записи, даже когда обслуживающий процесс выполняет запись самостоятельно)

buffers_alloc bigint

Количество выделенных буферов

stats_reset timestamp with time zone

Время последнего сброса этих статистических данных


pg_stat_wal

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

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

Тип столбца

Описание

wal_records bigint

Общее количество сгенерированных записей WAL

wal_fpi bigint

Общее количество сгенерированных образов полных страниц в WAL

wal_bytes numeric

Общий сгенерированный объем WAL в байтах

wal_buffers_full bigint

Сколько раз данные WAL записывались на диск из-за переполнения буферов WAL

wal_write bigint

Сколько раз буферы WAL записывались на диск по запросу функции XLogWrite. Подробную информацию о внутренней функции WAL XLogWrite см. в разделе Конфигурация WAL.

wal_sync bigint

Сколько раз файлы WAL синхронизировались с диском по запросу функции issue_xlog_fsync (если параметр fsync равен on (включен), а параметр wal_sync_method равен fdatasync, fsync или fsync_writethrough, иначе будет выводиться ноль). Подробную информацию о внутренней функции WAL issue_xlog_fsync см. в разделе Конфигурация WAL.

wal_write_time double precision

Общее время, затраченное на запись буферов WAL на диск по запросу функции XLogWrite, в миллисекундах (если включен параметр track_wal_io_timing, иначе будет выводиться ноль). Когда параметр wal_sync_method равен open_datasync или open_sync, сюда же включается время синхронизации.

wal_sync_time double precision

Общее время, затраченное на синхронизацию файлов WAL с диском по запросу функции issue_xlog_fsync, в миллисекундах (если включен параметр track_wal_io_timing, параметр fsync равен on, а параметр wal_sync_methodfdatasync, fsync или fsync_writethrough, иначе будет выводиться ноль).

stats_reset timestamp with time zone

Время последнего сброса этих статистических данных


pg_stat_database

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

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

Тип столбца

Описание

datid oid

OID этой базы данных или 0, если объекты принадлежат разделяемому отношению

datname name

Имя этой базы данных или NULL для разделяемых объектов

numbackends integer

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

xact_commit bigint

Количество зафиксированных транзакций в этой базе данных

xact_rollback bigint

Количество откатившихся транзакций в этой базе данных

blks_read bigint

Количество прочитанных дисковых блоков в этой базе данных

blks_hit bigint

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

tup_returned bigint

Количество строк, возвращенных запросами в этой базе данных

tup_fetched bigint

Количество строк, извлеченных запросами в этой базе данных

tup_inserted bigint

Количество строк, добавленных запросами в этой базе данных

tup_updated bigint

Количество строк, измененных запросами в этой базе данных

tup_deleted bigint

Количество строк, удаленных запросами в этой базе данных

conflicts bigint

Количество запросов, отмененных вследствие конфликтов с восстановлением в этой базе данных. (Конфликты случаются только на резервных серверах; подробную информацию см. в описании представления pg_stat_database_conflicts.)

temp_files bigint

Количество временных файлов, созданных запросами в этой базе данных. Учитываются все временные файлы, независимо от причины их создания (например, для сортировки или хэширования) и значения параметра log_temp_files.

temp_bytes bigint

Общий объем данных, записанных во временные файлы запросами в этой базе данных. Учитываются все временные файлы, независимо от причины их создания и значения параметра log_temp_files.

deadlocks bigint

Количество взаимных блокировок, выявленных в этой базе данных

checksum_failures bigint

Количество ошибок контрольных сумм в страницах данных в этой базе данных (или в разделяемом объекте) или NULL, если проверка контрольных сумм данных не включена.

checksum_last_failure timestamp with time zone

Время выявления последней ошибки контрольных сумм в страницах данных в этой базе данных (или в разделяемом объекте) или NULL, если проверка контрольных сумм данных не включена.

blk_read_time double precision

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

blk_write_time double precision

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

session_time double precision

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

active_time double precision

Время, затраченное на выполнение операторов SQL в этой базе данных, в миллисекундах (это соответствует состояниям active и fastpath function call в pg_stat_activity)

idle_in_transaction_time double precision

Время простоя в транзакциях в этой базе данных, в миллисекундах (это соответствует состояниям idle in transaction и idle in transaction (aborted) в pg_stat_activity)

sessions bigint

Общее количество сеансов, установленных в этой базе данных

sessions_abandoned bigint

Количество сеансов в этой базе данных, прерванных вследствие потери соединения с клиентом

sessions_fatal bigint

Количество сеансов в этой базе данных, прерванных вследствие фатальных ошибок

sessions_killed bigint

Количество сеансов в этой базе данных, прерванных вследствие вмешательства оператора

stats_reset timestamp with time zone

Время последнего сброса этих статистических данных


pg_stat_database_conflicts

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

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

Тип столбца

Описание

datid oid

OID базы данных

datname name

Имя этой базы данных

confl_tablespace bigint

Количество запросов в этой базе данных, отмененных из-за удаленного табличного пространства

confl_lock bigint

Количество запросов в этой базе данных, отмененных из-за таймаутов блокировок

confl_snapshot bigint

Количество запросов в этой базе данных, отмененных из-за устаревших снимков состояния

confl_bufferpin bigint

Количество запросов в этой базе данных, отмененных из-за закрепленных буферов

confl_deadlock bigint

Количество запросов в этой базе данных, отмененных из-за взаимоблокировок


pg_stat_all_tables

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

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

Тип столбца

Описание

relid oid

OID этой таблицы

schemaname name

Имя схемы, в которой находится эта таблица

relname name

Имя этой таблицы

seq_scan bigint

Количество последовательных сканирований, инициированных для этой таблицы

seq_tup_read bigint

Количество активных строк, извлеченных при последовательных сканированиях

idx_scan bigint

Количество сканирований по индексу, инициированных для этой таблицы

idx_tup_fetch bigint

Количество активных строк, извлеченных при сканированиях по индексу

n_tup_ins bigint

Количество добавленных строк

n_tup_upd bigint

Количество измененных строк (включая строки, измененные в режиме HOT)

n_tup_del bigint

Количество удаленных строк

n_tup_hot_upd bigint

Количество строк, измененных в режиме HOT (т. е. без необходимости в отдельном изменении индекса)

n_live_tup bigint

Расчетное количество активных строк

n_dead_tup bigint

Расчетное количество неиспользуемых строк

n_mod_since_analyze bigint

Расчетное количество строк, измененных в этой таблице с момента последнего анализа

n_ins_since_vacuum bigint

Расчетное количество строк, добавленных в эту таблицу с момента последней очистки

last_vacuum timestamp with time zone

Время последней очистки этой таблицы вручную (не учитывая VACUUM FULL)

last_autovacuum timestamp with time zone

Время последней очистки этой таблицы фоновым процессом «Автовакуум»

last_analyze timestamp with time zone

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

last_autoanalyze timestamp with time zone

Время последнего анализа этой таблицы фоновым процессом «Автовакуум»

vacuum_count bigint

Сколько раз эта таблица очищалась вручную (не учитывая VACUUM FULL)

autovacuum_count bigint

Сколько раз эта таблица очищалась фоновым процессом «Автовакуум»

analyze_count bigint

Сколько раз эта таблица анализировалась вручную

autoanalyze_count bigint

Сколько раз эта таблица анализировалась фоновым процессом «Автовакуум»


pg_stat_all_indexes

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

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

Тип столбца

Описание

relid oid

OID таблицы для этого индекса

indexrelid oid

OID этого индекса

schemaname name

Имя схемы, в которой находится этот индекс

relname name

Имя таблицы для этого индекса

indexrelname name

Имя этого индекса

idx_scan bigint

Количество сканирований, инициированных по этому индексу

idx_tup_read bigint

Количество записей индекса, возвращенных при сканированиях по этому индексу

idx_tup_fetch bigint

Количество активных строк таблицы, извлеченных при простых сканированиях по этому индексу

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

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


pg_statio_all_tables

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

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

Тип столбца

Описание

relid oid

OID таблицы

schemaname name

Имя схемы, в которой находится эта таблица

relname name

Имя этой таблицы

heap_blks_read bigint

Количество дисковых блоков, прочитанных из этой таблицы

heap_blks_hit bigint

Количество попаданий в буфер в этой таблице

idx_blks_read bigint

Количество дисковых блоков, прочитанных из всех индексов этой таблицы

idx_blks_hit bigint

Количество попаданий в буфер во всех индексах этой таблицы

toast_blks_read bigint

Количество дисковых блоков, прочитанных из TOAST-таблицы (если таковая имеется) для этой таблицы

toast_blks_hit bigint

Количество попаданий в буфер в TOAST-таблице (если таковая имеется) для этой таблицы

tidx_blks_read bigint

Количество дисковых блоков, прочитанных из индексов TOAST-таблицы (если таковая имеется) для этой таблицы

tidx_blks_hit bigint

Количество попаданий в буфер в индексах TOAST-таблицы (если таковая имеется) для этой таблицы


pg_statio_all_indexes

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

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

Тип столбца

Описание

relid oid

OID таблицы для этого индекса

indexrelid oid

OID этого индекса

schemaname name

Имя схемы, в которой находится этот индекс

relname name

Имя таблицы для этого индекса

indexrelname name

Имя этого индекса

idx_blks_read bigint

Количество дисковых блоков, прочитанных из этого индекса

idx_blks_hit bigint

Количество попаданий в буфер в этом индексе


pg_statio_all_sequences

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

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

Тип столбца

Описание

relid oid

OID последовательности

schemaname name

Имя схемы, в которой находится эта последовательность

relname name

Имя этой последовательности

blks_read bigint

Количество дисковых блоков, прочитанных из этой последовательности

blks_hit bigint

Количество попаданий в буфер в этой последовательности


pg_stat_user_functions

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

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

Тип столбца

Описание

funcid oid

OID функции

schemaname name

Имя схемы, в которой находится эта функция

funcname name

Имя этой функции

calls bigint

Сколько раз вызывалась эта функция

total_time double precision

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

self_time double precision

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


pg_stat_slru

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

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

Тип столбца

Описание

name text

Имя кэша SLRU

blks_zeroed bigint

Количество блоков, обнуленных во время инициализации

blks_hit bigint

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

blks_read bigint

Количество прочитанных дисковых блоков для этого кэша SLRU

blks_written bigint

Количество записанных дисковых блоков для этого кэша SLRU

blks_exists bigint

Количество проверенных на существование дисковых блоков для этого кэша SLRU

flushes bigint

Количество операций сброса грязных данных для этого кэша SLRU

truncates bigint

Количество операций усечения для этого кэша SLRU

stats_reset timestamp with time zone

Время последнего сброса этих статистических данных


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

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

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

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

Функция

Описание

pg_backend_pid () → integer

Возвращает идентификатор серверного процесса, закрепленного за текущим сеансом.

pg_stat_get_activity ( integer ) → setof record

Возвращает запись с информацией об обслуживающем процессе с заданным идентификатором процесса или по одной записи для каждого активного обслуживающего процесса в системе, если указан 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

Обнуляет некоторые статистические счетчики на уровне кластера, в зависимости от аргумента. Значением аргумента может быть bgwriter для обнуления всех счетчиков, отображаемых в представлении pg_stat_bgwriter, archiver для обнуления всех счетчиков, отображаемых в представлении pg_stat_archiver, или wal для обнуления всех счетчиков, отображаемых в представлении pg_stat_wal.
По умолчанию эту функцию могут вызывать только суперпользователи, но право EXECUTE на ее выполнение можно дать и другим пользователям.

pg_stat_reset_single_table_counters ( oid ) → void

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

pg_stat_reset_single_function_counters ( oid ) → void

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

pg_stat_reset_slru ( text ) → void

Обнуляет статистику для отдельного кэша SLRU или для всех кэшей SLRU в кластере. Если аргумент имеет значение NULL, сбрасываются все счетчики, отображаемые в представлении pg_stat_slru view, для всех кэшей SLRU. Аргументом также может быть CommitTs, MultiXactMember, MultiXactOffset, Notify, Serial, Subtrans или Xact для сброса счетчиков только для соответствующей записи. При значении other (или даже любом нераспознаваемом имени) сбрасываются счетчики для всех остальных кэшей SLRU, например для определенных расширением.
По умолчанию эту функцию могут вызывать только суперпользователи, но право EXECUTE на ее выполнение можно дать и другим пользователям.

pg_stat_reset_replication_slot ( text ) → void

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

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

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

Функция

Описание

pg_stat_get_backend_idset () → setof integer

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

pg_stat_get_backend_activity ( integer ) → text

Возвращает текст последнего запроса этого обслуживающего процесса.

pg_stat_get_backend_activity_start ( integer ) → timestamp with time zone

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

pg_stat_get_backend_client_addr ( integer ) → inet

Возвращает IP-адрес клиента, подключенного к этому обслуживающему процессу.

pg_stat_get_backend_client_port ( integer ) → integer

Возвращает номер TCP-порта, который клиент использует для взаимодействия.

pg_stat_get_backend_dbid ( integer ) → oid

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

pg_stat_get_backend_pid ( integer ) → integer

Возвращает идентификатор этого обслуживающего процесса.

pg_stat_get_backend_start ( integer ) → timestamp with time zone

Возвращает время запуска этого процесса.

pg_stat_get_backend_userid ( integer ) → oid

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

pg_stat_get_backend_wait_event_type ( integer ) → text

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

pg_stat_get_backend_wait_event ( integer ) → text

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

pg_stat_get_backend_xact_start ( integer ) → timestamp with time zone

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



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

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

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

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

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

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



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

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


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

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

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

Тип столбца

Описание

pid integer

Идентификатор обслуживающего процесса.

datid oid

Идентификатор базы данных, к которой подключен этот обслуживающий процесс.

datname name

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

relid oid

Идентификатор анализируемой таблицы.

phase text

Текущая фаза обработки. См. Таблицу 35.

sample_blks_total bigint

Общее количество блоков кучи, которые будут отобраны.

sample_blks_scanned bigint

Количество просканированных блоков кучи.

ext_stats_total bigint

Количество объектов расширенной статистики.

ext_stats_computed bigint

Количество вычисленных объектов расширенной статистики. Этот счетчик увеличивается только в фазе computing extended statistics (вычисление объектов расширенной статистики).

child_tables_total bigint

Количество дочерних таблиц.

child_tables_done bigint

Количество просканированных дочерних таблиц. Этот счетчик увеличивается только в фазе acquiring inherited sample rows (извлечение строк выборки через иерархию наследования).

current_child_table_relid oid

Идентификатор дочерней таблицы, сканируемой в настоящий момент. Это поле актуально только в фазе acquiring inherited sample rows.

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

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

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


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

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

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

Тип столбца

Описание

pid integer

Идентификатор обслуживающего процесса.

datid oid

Идентификатор базы данных, к которой подключен этот обслуживающий процесс.

datname name

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

relid oid

Идентификатор таблицы, в которой создается индекс.

index_relid oid

Идентификатор создаваемого или перестраиваемого индекса. Во время выполнения CREATE INDEX в непараллельном режиме содержит 0.

command text

Выполняемая команда: CREATE INDEX, CREATE INDEX CONCURRENTLY, REINDEX или REINDEX CONCURRENTLY.

phase text

Текущая фаза создания индекса. См. Таблицу 37.

lockers_total bigint

Общее количество блокирующих процессов, потребовавших ожидания, если применимо.

lockers_done bigint

Число блокирующих процессов, ожидание которых уже завершено.

current_locker_pid bigint

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

blocks_total bigint

Общее количество блоков, которые будут обработаны в текущей фазе.

blocks_done bigint

Количество блоков, уже обработанных в текущей фазе.

tuples_total bigint

Общее количество кортежей, которые будут обработаны в текущей фазе.

tuples_done bigint

Количество кортежей, уже обработанных в текущей фазе.

partitions_total bigint

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

partitions_done bigint

При создании индекса в партиционированной таблице в этом столбце выводится общее количество партиций, в которых был создан индекс. Во время выполнения REINDEX это поле содержит 0.

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

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

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

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

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

Тип столбца

Описание

pid integer

Идентификатор обслуживающего процесса.

datid oid

Идентификатор базы данных, к которой подключен этот обслуживающий процесс.

datname name

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

relid oid

Идентификатор очищаемой таблицы.

phase text

Текущая фаза очистки. См. Таблицу 39.

heap_blks_total bigint

Общее количество блоков кучи в этой таблице. Это число отображает состояние на начало сканирования; блоки, добавленные позже, не будут (и не должны) обрабатываться этой командой VACUUM.

heap_blks_scanned bigint

Количество просканированных блоков кучи. Поскольку для оптимизации сканирования используется карта видимости, некоторые блоки будут пропущены без проверки; пропущенные блоки включаются в этом общем количестве, поэтому данное число в итоге по завершении очистки сравняется со значением heap_blks_total. Этот счетчик увеличивается только в фазе scanning heap (сканирование кучи).

heap_blks_vacuumed bigint

Количество очищенных блоков кучи. Если в таблице имеются индексы, этот счетчик увеличивается только в фазе vacuuming heap (очистка кучи). Блоки, не содержащие неиспользуемые кортежи, пропускаются, поэтому иногда этот счетчик может резко увеличиваться с большими приращениями.

index_vacuum_count bigint

Количество завершенных циклов очистки индекса.

max_dead_tuples bigint

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

num_dead_tuples bigint

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

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

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

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

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

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

Тип столбца

Описание

pid integer

Идентификатор обслуживающего процесса.

datid oid

Идентификатор базы данных, к которой подключен этот обслуживающий процесс.

datname name

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

relid oid

Идентификатор кластеризуемой таблицы.

command text

Выполняемая команда. Либо CLUSTER, либо VACUUM FULL.

phase text

Текущая фаза обработки. См. Таблицу 41.

cluster_index_relid oid

Если таблица сканируется с использованием индекса, здесь отображается идентификатор данного индекса; в противном случае ноль.

heap_tuples_scanned bigint

Количество просканированных кортежей кучи. Этот счетчик увеличивается только в фазе seq scanning heap (последовательное сканирование кучи), index scanning heap (сканирование кучи по индексу) или writing new heap (запись новой кучи).

heap_tuples_written bigint

Количество записанных кортежей кучи. Этот счетчик увеличивается только в фазе seq scanning heap, index scanning heap или writing new heap.

heap_blks_total bigint

Общее количество блоков кучи в таблице. Это число отображает состояние на начало фазы seq scanning heap.

heap_blks_scanned bigint

Количество просканированных блоков кучи. Этот счетчик увеличивается только в фазе seq scanning heap.

index_rebuild_count bigint

Количество перестроенных индексов. Этот счетчик увеличивается только в фазе rebuilding index (перестройка индекса).

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

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

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

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

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

Тип столбца

Описание

pid integer

Идентификатор процесса-отправителя WAL.

phase text

Текущая фаза обработки. См. Таблицу 43.

backup_total bigint

Общий объем данных, которые будут передаваться в потоке. Это значение является расчетным и отображает состояние на начало фазы streaming database files (потоковая передача файлов базы данных). Обратите внимание, что это только приблизительная оценка, поскольку база данных может измениться во время фазы streaming database files, и позже в резервную копию может быть добавлен журнал WAL. Это значение всегда становится равным backup_streamed, как только объем переданных данных превысит ожидаемое значение. Если предварительная оценка в qhb_basebackup отключена (т. е. задан параметр --no-estimate-size), это поле содержит NULL.

backup_streamed bigint

Объем переданных в потоке данных. Этот счетчик увеличивается только в фазе streaming database files или transferring wal files (передача файлов WAL).

tablespaces_total bigint

Общее количество табличных пространств, которые будут передаваться в потоке.

tablespaces_streamed bigint

Количество переданных в потоке табличных пространств. Этот счетчик увеличивается только в фазе streaming database files.

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

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

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

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

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

Тип столбца

Описание

pid integer

Идентификатор обслуживающего процесса.

datid oid

Идентификатор базы данных, к которой подключен этот обслуживающий процесс.

datname name

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

relid oid

Идентификатор таблицы, в которой выполняется команда COPY. Если копирование производится из запроса SELECT, это поле содержит 0.

command text

Выполняемая команда: COPY FROM или COPY TO.

type text

Тип ввода/вывода, посредством которого считываются или записываются данные: FILE, PROGRAM, PIPE (для COPY FROM STDIN и COPY TO STDOUT) или CALLBACK (используется, например, во время начальной синхронизации таблицы при логической репликации).

bytes_processed bigint

Количество байтов, уже обработанных командой COPY.

bytes_total bigint

Размер исходного файла для команды COPY FROM в байтах. Если это неприменимо, данное поле содержит 0.

tuples_processed bigint

Количество кортежей, уже обработанных командой COPY.

tuples_excluded bigint

Количество кортежей, которые не были обработаны из-за того, что были исключены предложением WHERE команды COPY.



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

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

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

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


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

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


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

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

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

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

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

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

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

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

#!/usr/sbin/dtrace -qs

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

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

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

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

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

Start                                          71
Commit                                         70
Total time (ns)                        2312105013

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

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


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

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

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

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

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

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

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

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

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

    probe transaction__start(LocalTransactionId);
    

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

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

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

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

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

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

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

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

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



Метрики QHB

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

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


Типы метрик

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

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

sys

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Swap:used = Swap:total - Swap:free

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

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

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

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

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

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

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

db_stat

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

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

Имя метрикиОписаниеТип метрики
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%. Если значение коэффициента существенно ниже этой отметки, желательно рассмотреть возможность увеличения объема буферного кэша.


bgwr

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

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

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


temp_stat

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

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

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

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


wal

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

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

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

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


transaction

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

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

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

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

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

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

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

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


wait

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

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

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

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

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

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

bufmgr

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

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

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

lmgr

К группе lmgr относятся метрики менеджера блокировок. Блокировки бывают основные и предикатные. Предикатные блокировки называются «блокировками» по историческим причинам; сейчас они ничего не блокируют, а используются для отслеживания зависимостей по данным между транзакциями.

Метрики менеджера блокировок отслеживают количество занятых блокировок и сериализуемых транзакций (транзакций с наивысшим уровнем изоляции Serializable), а также количество свободных слотов в хэш-таблицах для каждого параметра. Необходимость существования этих метрик вызвана тем, что размеры хэш-таблиц, хранящих блокировки и сериализуемые транзакции, ограничены, а превышение лимита может вызвать сообщение о нехватке памяти.

Сбор метрик проводится при операциях чтения данных.

Таблица 58. Метрики менеджера блокировок

Имя метрикиОписаниеТип метрики
qhb.lmgr.locksКоличество занятых блокировокcounter
qhb.lmgr.locks_availableКоличество блокировок, которые еще можно создатьcounter
qhb.lmgr.proc_locksКоличество занятых PGPROC-блокировокcounter
qhb.lmgr.proc_locks_availableКоличество PGPROC-блокировок, которые еще можно создатьcounter
qhb.lmgr.serializable_xidsКоличество активных сериализуемых транзакцийcounter
qhb.lmgr.serializable_xids_availableКоличество сериализуемых транзакций, которые еще можно создатьcounter
qhb.lmgr.pred_locksКоличество занятых предикатных «блокировок»counter
qhb.lmgr.pred_locks_availableКоличество предикатных «блокировок», которые еще можно создатьcounter
qhb.lmgr.pred_lock_targetsКоличество занятых предикатных target-«блокировок»counter
qhb.lmgr.pred_lock_targets_availableКоличество предикатных target-«блокировок», которые еще можно создатьcounter

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

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

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

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

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

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

[is_enabled]
default = true
sys = true
db_stat = true
bgwr = true
wal = true
transaction = true
wait = true
bufmgr = true
temp_stat = true
lmgr = true

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

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

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

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

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

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

Функция

Описание

metrics_config_enable_group ( group_name: cstring, respect_transient_settings: boolean ) → void

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

metrics_config_disable_group ( group_name: cstring, respect_transient_settings: boolean ) → void

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

metrics_config_transient_set ( backend_pid: int4, group_name: cstring, option_value: boolean ) → void

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

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

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

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

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



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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

Установка

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

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

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

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

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

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

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

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

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

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

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

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

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

Триггеры

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Тип метрик Timer

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

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

Тип метрик Counter

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

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

Тип метрик Gauge

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

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

Аннотации

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

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