Мониторинг активности базы данных
Администратор базы данных часто задается вопросом: «Что сейчас делает система?». В этой главе рассказывается, как это выяснить.
Для мониторинга активности базы данных и анализа производительности доступно
несколько инструментов. Большая часть этой главы посвящена описанию сборщика
статистики 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 |
||
Общее текущее состояние этого обслуживающего процесса. Возможные значения:
|
||
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. Возможные значения:
|
||
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 |
||
Состояние синхронизации этого резервного сервера. Возможные значения:
|
||
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_method — fdatasync, 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 |
||
Время последней очистки этой таблицы вручную (не учитывая |
||
last_autovacuum timestamp with time zone |
||
Время последней очистки этой таблицы фоновым процессом «Автовакуум» |
||
last_analyze timestamp with time zone |
||
Время последнего анализа этой таблицы вручную |
||
last_autoanalyze timestamp with time zone |
||
Время последнего анализа этой таблицы фоновым процессом «Автовакуум» |
||
vacuum_count bigint |
||
Сколько раз эта таблица очищалась вручную (не учитывая |
||
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 |
||
Обнуляет все статистические счетчики для текущей базы данных. |
||
pg_stat_reset_shared ( text ) → void |
||
Обнуляет некоторые статистические счетчики на уровне кластера, в зависимости от аргумента. Значением аргумента может быть bgwriter для обнуления всех счетчиков, отображаемых в представлении pg_stat_bgwriter, archiver для обнуления всех счетчиков, отображаемых в представлении pg_stat_archiver, или wal для обнуления всех счетчиков, отображаемых в представлении pg_stat_wal. |
||
pg_stat_reset_single_table_counters ( oid ) → void |
||
Обнуляет статистику для отдельной таблицы или индекса в текущей базе данных. |
||
pg_stat_reset_single_function_counters ( oid ) → void |
||
Обнуляет статистику для отдельной функции в текущей базе данных. |
||
pg_stat_reset_slru ( text ) → void |
||
Обнуляет статистику для отдельного кэша SLRU или для всех кэшей SLRU в кластере. Если аргумент имеет значение NULL, сбрасываются все счетчики, отображаемые в представлении pg_stat_slru view, для всех кэшей SLRU. Аргументом также может быть CommitTs, MultiXactMember, MultiXactOffset, Notify, Serial, Subtrans или Xact для сброса счетчиков только для соответствующей записи. При значении other (или даже любом нераспознаваемом имени) сбрасываются счетчики для всех остальных кэшей SLRU, например для определенных расширением. |
||
pg_stat_reset_replication_slot ( text ) → void |
||
Сбрасывает статистику слота репликации, определенного в аргументе. Если аргумент имеет значение NULL, сбрасывает статистику для всех слотов репликации. |
Лежащая в основе представления 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 |
||
Идентификатор создаваемого или перестраиваемого индекса. Во время выполнения |
||
command text |
||
Выполняемая команда: |
||
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 |
||
При создании индекса в партиционированной таблице в этом столбце выводится общее количество партиций, в которых будет создаваться индекс. Во время выполнения |
||
partitions_done bigint |
||
При создании индекса в партиционированной таблице в этом столбце выводится общее количество партиций, в которых был создан индекс. Во время выполнения |
Таблица 37. Фазы CREATE INDEX
Фаза | Описание |
---|---|
initializing | CREATE INDEX или REINDEX готовится к созданию индекса. Ожидается, что эта фаза будет очень короткой. |
waiting for writers before build | CREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидает завершения транзакций, удерживающих блокировки записи, которые потенциально могут видеть таблицу. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах lockers_total, lockers_done и current_locker_pid содержится информация о ходе выполнения этой фазы. |
building index | Индекс строится с помощью кода, реализующего метод доступа. На этом этапе методы доступа, поддерживающие отчеты о ходе выполнения, передают собственные данные о ходе выполнения, и в этом столбце указывается внутренняя фаза. Как правило, данные о ходе выполнения содержат столбцы blocks_total и blocks_done и потенциально столбцы tuples_total и tuples_done. |
waiting for writers before validation | CREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидает завершения транзакций, удерживающих блокировки записи, которые потенциально могут записывать данные в таблицу. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах lockers_total, lockers_done и current_locker_pid содержится информация о ходе выполнения этой фазы. |
index validation: scanning index | CREATE INDEX CONCURRENTLY сканирует индекс в поисках кортежей, которые необходимо проверить. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах blocks_total (отображает общий размер индекса) и blocks_done содержится информация о ходе выполнения этой фазы. |
index validation: sorting tuples | CREATE INDEX CONCURRENTLY сортирует выходные данные фазы сканирования индекса. |
index validation: scanning table | CREATE INDEX CONCURRENTLY сканирует таблицу для проверки кортежей индексов, собранных в предыдущих двух фазах. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах blocks_total (отображает общий размер индекса) и blocks_done содержится информация о ходе выполнения этой фазы. |
waiting for old snapshots | CREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидает освобождения снимков транзакциями, которые потенциально могут видеть таблицу. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах lockers_total, lockers_done и current_locker_pid содержится информация о ходе выполнения этой фазы. |
waiting for readers before marking dead | REINDEX CONCURRENTLY ожидает завершения транзакций, удерживающих блокировки чтения, прежде чем пометить старый индекс как неиспользуемый. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах lockers_total, lockers_done и current_locker_pid содержится информация о ходе выполнения этой фазы. |
waiting for readers before dropping | REINDEX CONCURRENTLY ожидает завершения транзакций, удерживающих блокировки чтения, прежде чем удалить старый индекс. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах lockers_total, lockers_done и current_locker_pid содержится информация о ходе выполнения этой фазы. |
Отчет о ходе выполнения VACUUM
При каждом выполнении VACUUM
представление pg_stat_progress_vacuum будет
содержать по одной строке для каждого обслуживающего процесса (включая рабочие
процессы автовакуума), который в данный момент производит очистку. В таблицах ниже
описываются предоставляемые сведения и поясняется, как их интерпретировать.
Информация о ходе выполнения команд VACUUM FULL
выводится в представлении
pg_stat_progress_cluster поскольку VACUUM FULL
и CLUSTER
перезаписывают
таблицу, в то время как простая команда VACUUM
только модифицирует ее саму. См.
подраздел Отчет о ходе выполнения CLUSTER
.
Таблица 38. Представление pg_stat_progress_vacuum
Тип столбца |
||
---|---|---|
Описание |
||
pid integer |
||
Идентификатор обслуживающего процесса. |
||
datid oid |
||
Идентификатор базы данных, к которой подключен этот обслуживающий процесс. |
||
datname name |
||
Имя базы данных, к которой подключен этот обслуживающий процесс. |
||
relid oid |
||
Идентификатор очищаемой таблицы. |
||
phase text |
||
Текущая фаза очистки. См. Таблицу 39. |
||
heap_blks_total bigint |
||
Общее количество блоков кучи в этой таблице. Это число отображает состояние на начало сканирования; блоки, добавленные позже, не будут (и не должны) обрабатываться этой командой |
||
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
Фаза | Описание |
---|---|
initializing | VACUUM готовится начать сканирование кучи. Ожидается, что эта фаза будет очень короткой. |
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 cleanup | VACUUM выполняет окончательную ликвидацию последствий. На этом этапе 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 |
||
Выполняемая команда. Либо |
||
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 |
||
Идентификатор таблицы, в которой выполняется команда |
||
command text |
||
Выполняемая команда: |
||
type text |
||
Тип ввода/вывода, посредством которого считываются или записываются данные: FILE, PROGRAM, PIPE (для |
||
bytes_processed bigint |
||
Количество байтов, уже обработанных командой |
||
bytes_total bigint |
||
Размер исходного файла для команды |
||
tuples_processed bigint |
||
Количество кортежей, уже обработанных командой |
||
tuples_excluded bigint |
||
Количество кортежей, которые не были обработаны из-за того, что были исключены предложением WHERE команды |
Динамическая трассировка
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. Определенные типы, используемые в параметрах зондов
Тип | Определение |
---|---|
LocalTransactionId | unsigned int |
LWLockMode | int |
LOCKMODE | int |
BlockNumber | unsigned int |
Oid | unsigned int |
ForkNumber | int |
bool | unsigned 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 должны быть аккуратно написаны и отлажены, иначе собранная трассировочная информация может оказаться бессмысленной. В большинстве случаев причиной обнаруженных проблем является инструментарий, а не лежащая в основе система. При обсуждении информации, полученной с использованием динамической трассировки, обязательно прилагайте скрипт, с помощью которого они были получены, чтобы его тоже можно было проверить и обсудить.
Определение новых зондов
Новые зонды можно определить в любом месте кода, где пожелает разработчик, однако это потребует перекомпиляции. Ниже приведены шаги, которые необходимо предпринять для добавления новых зондов:
-
Определиться с именами проб и данными, которые должны стать доступными благодаря этим зондам
-
Добавить описания зондов в src/backend/utils/probes.d
-
Включить pg_trace.h, если его еще нет в модуле (или модулях), содержащих точки зондов, и добавить зондовый макрос TRACE_QHB в желаемые места в исходном коде
-
Перекомпилировать и убедиться, что новые зонды доступны
Пример: Вот пример того, как можно добавить зонд для трассировки всех новых транзакций по их идентификатору.
-
Решаем, что зонд будет называться transaction-start и принимать параметр типа LocalTransactionId
-
Добавляем определение зонда в src/backend/utils/probes.d:
probe transaction__start(LocalTransactionId);
Обратите внимание на использование двойного подчеркивания в имени зонда. В скрипте DTrace, использующем этот зонд, двойное подчеркивание следует заменить на дефис, поэтому в документации для пользователей именем этого зонда будет transaction-start.
-
Во время компиляции transaction__start преобразуется в макрос с именем TRACE_QHB_TRANSACTION_START (заметьте, что здесь подчеркивание одинарное), который доступен в результате включения pg_trace.h. Добавляет вызов этого макроса в подходящее место в исходном коде. В данном случае это будет выглядеть примерно так:
TRACE_QHB_TRANSACTION_START(vxid.localTransactionId);
-
После перекомпиляции и запуска нового двоичного файла выполняем следующую команду 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.1min | load 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 | Общий размер установленной памяти RAM | gauge |
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.total | Mem:total |
sys.mem.used | Mem:used |
sys.mem.free | Mem:free |
sys.mem.available | Mem:available |
sys.swap.total | Swap:total |
sys.swap.free | Swap: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.
Таблица 52. Метрики чтения и записи блоков
Имя метрики | Описание | Тип метрики |
---|---|---|
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 относятся метрики фонового процесса записи.
Таблица 53. Метрики фонового процесса записи
Имя метрики | Описание | Тип метрики |
---|---|---|
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.
Таблица 54. Метрики по временным файлам и таблицам
Имя метрики | Описание | Тип метрики |
---|---|---|
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 относятся метрики процесса архивации журнала упреждающей записи.
Таблица 55. Метрики процесса архивации WAL
Имя метрики | Описание | Тип метрики |
---|---|---|
qhb.wal.archived | Количество успешно выполненных операций архивации файлов журнала упреждающей записи | counter |
qhb.wal.failed | Количество попыток архивации, завершившихся сбоем | counter |
qhb.wal.archive_time | Время, потраченное на копирование файлов журналов, в наносекундах | counter |
Эти метрики работают в том случае, если настроена архивация журнала упреждающей записи. Для этого необходимо установить параметр archive_mode в значение on (включен) и определить команду архивации в параметре archive_command.
transaction
К группе transaction относятся метрики по транзакциям.
Таблица 56. Метрики по транзакциям
Имя метрики | Описание | Тип метрики |
---|---|---|
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. Значения метрик выводятся в микросекундах (автоматически переводясь в другие единицы при увеличении значений). На существующих графиках выводятся не все события ожиданий, а только по пять самых значимых по величине на каждом графике. Разные события ожиданий могут иметь сильно отличающиеся по величине продолжительности. Значительные колебания значений могут отражать возникающие проблемы.
Таблица 57. Наиболее значимые события ожидания
Имя события ожидания | Описание |
---|---|
Lock.extend | Ожидание расширения отношения. Становится заметным при активном росте таблиц. Необходимость выделения новых блоков приводит к некоторым задержкам, которые отражаются в этой метрике. |
Lock.transactionid | Ожидание завершения транзакции. Событие ожидания возникает в том случае, если транзакция вынуждена ждать окончания обработки предыдущих транзакций, которые также получают подтверждение своего окончания. |
Lock.tuple | Ожидание получения блокировки для кортежа. Возникает в случае одновременной работы с теми же данными нескольких транзакций. |
LWLock.WALWriteLock | Ожидание записи буферов WAL на диск. Часто является лидером среди событий ожиданий этого типа, так как операции с диском являются наиболее медленными в этой группе событий ожидания. |
LWLock.wal_insert | Ожидание вставки WAL в буфер памяти. |
LWLock.buffer_content | Ожидание чтения или записи страницы данных в памяти. Возникает и становится существенным при интенсивном вводе/выводе. |
LWLock.buffer_mapping | Ожидание связывания блока данных с буфером в буферном пуле. |
LWLock.lock_manager | Ожидание добавления или проверки блокировок для обслуживающих процессов. Событие становится значимым при частых транзакциях. |
bufmgr
К группе bufmgr относятся метрики буферного менеджера, касающиеся механизмов управления памятью. Сбор метрик проводится при операциях чтения данных.
Таблица 58. Метрики буферного менеджера
Имя метрики | Описание | Тип метрики | Агрегат |
---|---|---|---|
qhb.bufmgr.BufferAlloc | Сколько раз проводился поиск буфера | timer | count |
qhb.bufmgr.BufferAlloc | Общее время, потраченное на поиск буфера | timer | sum |
qhb.bufmgr.happy_path | Сколько раз буфер нашелся сразу | timer | count |
qhb.bufmgr.happy_path | Общее время, потраченное на поиск, когда буфер нашелся сразу | timer | sum |
qhb.bufmgr.cache_miss | Количество промахов кэша буферов | timer | count |
qhb.bufmgr.cache_miss | Общее время, потраченное на обработку промахов кэша буферов | timer | sum |
qhb.bufmgr.disk_read | Количество чтений страницы с диска (асинхронно) | timer | count |
qhb.bufmgr.flush_dirty | Количество выгрузок страницы на диск (асинхронно) | timer | count |
qhb.bufmgr.retry_counter | Количество повторных обработок промаха | counter | |
qhb.bufmgr.strategy_pop_cnt | Сколько раз срабатывала специальная стратегия получения или вытеснения буфера | counter | |
qhb.bufmgr.strategy_reject_cnt | Количество забракованных буферов, предложенных специальной стратегией | counter | |
tarq_cache.allocate | Сколько раз проводился поиск в TARQ | timer | count |
tarq_cache.allocate | Общее время, потраченное на поиск в TARQ | timer | sum |
tarq_cache.allocate_new | Сколько раз выбирался исключаемый блок в TARQ | timer | count |
tarq_cache.rollback | Количество откатов вытеснения в TARQ | timer | count |
tarq_cache.rollback | Общее время, потраченное на откаты вытеснения в TARQ | timer | sum |
tarq_cache.touch | Общее время, потраченное на учет популярных страниц в TARQ | timer | sum |
lmgr
К группе lmgr относятся метрики менеджера блокировок. Блокировки бывают основные и предикатные. Предикатные блокировки называются «блокировками» по историческим причинам; сейчас они ничего не блокируют, а используются для отслеживания зависимостей по данным между транзакциями.
Метрики менеджера блокировок отслеживают количество занятых блокировок и сериализуемых транзакций (транзакций с наивысшим уровнем изоляции Serializable), а также количество свободных слотов в хеш-таблицах для каждого параметра. Необходимость существования этих метрик вызвана тем, что размеры хеш-таблиц, хранящих блокировки и сериализуемые транзакции, ограничены, а превышение лимита может вызвать сообщение о нехватке памяти.
Сбор метрик проводится при операциях чтения данных.
Таблица 59. Метрики менеджера блокировок
Имя метрики | Описание | Тип метрики |
---|---|---|
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
Ниже представлены метрики пула соединений, характеризующие работу пула. Сбор метрик проводится при операциях выполнения запроса.
Таблица 60. Метрики пула соединений 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 (отправка запрещена).
Таблица 61. Настройка записи значений для групп метрик
Группа метрик | Описание | Значение по умолчанию |
---|---|---|
default | Группа по умолчанию (различные метрики, не выделенные в отдельные группы) | true |
sys | Метрики операционной системы | true |
db_stat | Метрики чтения и записи блоков | true |
bgwr | Метрики фонового процесса записи | true |
temp_stat | Метрики по данным временных файлов и таблиц | true |
wal | Метрики архивации файлов WAL | true |
transaction | Метрики транзакций | true |
wait | Метрики событий ожидания | true |
bufmgr | Метрики механизмов управления памятью | true |
lmgr | Метрики механизмов блокировок (основных и предикатных) | true |
Примечание
Для сбора метрик операционной системы необходимо также установить в параметре qhb_os_monitoring значение on (включен).
Помимо задания значений настроек через файл параметров, имеется возможность менять эти значения через функции. Изменения сразу же отображаются в файле конфигурации.
Таблица 62. Функции включения и выключения отправки метрик
Функция |
||
---|---|---|
Описание |
||
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. Однако это более трудоемкий вариант и его выбирать не рекомендуется.
Для импорта описаний информационных панелей необходимо выполнить следующие шаги:
- В меню Dashboards вашего сайта Grafana выбрать пункт Manage.
- В открывшемся списке папок и панелей выбрать существующую или создать новую папку.
- Находясь в выбранной папке, выбрать в правой верхней части страницы пункт Import.
- На открывшейся странице можно либо нажать справа вверху кнопку Upload json file и загрузить файл, либо вставить содержимое JSON-файла в поле под заголовком Or paste JSON и нажать кнопку Load.
- После этого нужно заполнить необходимые параметры и выполнить загрузку 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 по работе с шаблонами агента.
-
Установите Zabbix-агент на узле сети с QHB
-
Скопируйте каталог 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
-
Скопируйте файл template_db_qhb.conf в конфигурационную директорию Zabbix-агента /etc/zabbix/zabbix_agentd.d/:
# wget <сервер>/zabbix/template_db_qhb.conf
-
Создайте пользователя zbx_monitor с правами «только чтение» и доступом к кластеру QHB:
CREATE USER zbx_monitor WITH PASSWORD '<PASSWORD>' INHERIT; GRANT pg_monitor TO zbx_monitor;
-
Отредактируйте файл qhb_hba.conf, чтобы разрешить подключение к Zabbix. Для этого откройте его в текстовом редакторе nano и вставьте в него следующие строки:
host all zbx_monitor 127.0.0.1/32 trust
-
Перезагрузите QHB и Zabbix-агент:
# systemctl restart qhb # systemctl restart zabbix_agentd
-
Импортируйте файл template_db_qhb.yaml шаблона «QHB by Zabbix agent» на сервере Zabbix. Подробнее об импорте шаблонов см. в документации Zabbix по работе с импортом шаблонов.
-
Установите параметры макроса {$PG.HOST}, {$PG.PORT}, {$PG.USER}, {$PG.PASSWORD}, {$PG.DB} для узла сети с QHB.
-
Присоедините шаблон «QHB by Zabbix agent» к узлу сети с QHB.
Собираемые параметры
Таблица 63. Собираемые параметры
Группа | Название | Описание |
---|---|---|
QHB | Bgwriter: Buffers allocated per second | Количество выделенных буферов |
QHB | Bgwriter: Buffers written directly by a backend per second | Количество буферов, записанных непосредственно обслуживающим процессом |
QHB | Bgwriter: Buffers backend fsync per second | Сколько раз обслуживающему процессу пришлось самому выполнять вызов fsync (обычно этим занимается фоновый процесс записи, даже когда обслуживающий процесс проводит свои операции записи) |
QHB | Bgwriter: Buffers written during checkpoints per second | Количество буферов, записанных во время контрольных точек |
QHB | Bgwriter: Buffers written by the background writer per second | Количество буферов, записанных фоновым процессом записи |
QHB | Bgwriter: Requested checkpoints per second | Количество запрошенных контрольных точек, которые были выполнены |
QHB | Bgwriter: Scheduled checkpoints per second | Количество запланированных контрольных точек, которые были выполнены |
QHB | Bgwriter: Checkpoint sync time | Общее количество времени, затраченное на синхронизацию файлов с диском при обработке контрольных точек |
QHB | Bgwriter: Checkpoint write time | Общее количество времени, затраченное на запись файлов на диск при обработке контрольных точек, в миллисекундах |
QHB | Bgwriter: Max written per second | Сколько раз фоновый процесс записи останавливал очищающее сканирование из-за того, что записал слишком много буферов |
QHB | Status: Cache hit ratio % | Доля попаданий в кэш |
QHB | Status: Config hash | Хеш конфигурации QHB |
QHB | Connections sum: Active | Общее количество соединений, выполняющих запросы |
QHB | Connections sum: Idle | Общее количество соединений, ожидающих от клиента новой команды |
QHB | Connections sum: Idle in transaction | Общее количество соединений в состоянии транзакции, но не выполняющих запрос |
QHB | Connections sum: Prepared | Общее количество подготовленных транзакций |
QHB | Connections sum: Total | Общее количество соединений |
QHB | Connections sum: Total % | Общее количество соединений в процентах |
QHB | Connections sum: Waiting | Общее количество ожидающих транзакций |
QHB | Status: Ping time | Время ответа |
QHB | Status: Ping | Проверка связи |
QHB | Replication: standby count | Количество резервных серверов |
QHB | Replication: lag in seconds | Задержка репликации с основного сервера в секундах |
QHB | Replication: recovery role | Роль репликации: 1 — восстановление еще продолжается (режим резервного сервера), 0 — режим основного сервера |
QHB | Replication: status | Статус репликации: 0 — потоковая передача снижается, 1 — потоковая передача возрастает, 2 — режим основного сервера |
QHB | Transactions: Max active transaction time | Текущая максимальная продолжительность активной транзакции |
QHB | Transactions: Max idle transaction time | Текущая максимальная продолжительность простаивающей транзакции |
QHB | Transactions: Max prepared transaction time | Текущая максимальная продолжительность подготовленной транзакции |
QHB | Transactions: Max waiting transaction time | Текущая максимальная продолжительность ожидающей транзакции |
QHB | Status: Uptime | Полное время работы системы |
QHB | Status: Version | Версия QHB |
QHB | WAL: Segments count | Количество сегментов WAL |
QHB | WAL: Bytes written | Объем записей WAL в байтах |
QHB | DB {#DBNAME}: Database size | Размер этой базы данных |
QHB | DB {#DBNAME}: Blocks hit per second | Сколько раз дисковые блоки были обнаружены уже в буферном кэше, благодаря чему в чтении не было необходимости |
QHB | DB {#DBNAME}: Disk blocks read per second | Общее количество дисковых блоков, прочитанных в этой базе данных |
QHB | DB {#DBNAME}: Detected conflicts per second | Общее количество запросов, отмененных из-за конфликтов с восстановлением в этой базе данных |
QHB | DB {#DBNAME}: Detected deadlocks per second | Общее количество выявленных взаимоблокировок в этой базе данных |
QHB | DB {#DBNAME}: Temp_bytes written per second | Общий объем данных, записанных во временные файлы запросами в этой базе данных |
QHB | DB {#DBNAME}: Temp_files created per second | Общее количество временных файлов, созданных запросами в этой базе данных |
QHB | DB {#DBNAME}: Tuples deleted per second | Общее количество строк, удаленных запросами в этой базе данных |
QHB | DB {#DBNAME}: Tuples fetched per second | Общее количество строк, выбранных запросами в этой базе данных |
QHB | DB {#DBNAME}: Tuples inserted per second | Общее количество строк, добавленных запросами в этой базе данных |
QHB | DB {#DBNAME}: Tuples returned per second | Общее количество строк, возвращенных запросами в этой базе данных |
QHB | DB {#DBNAME}: Tuples updated per second | Общее количество строк, измененных запросами в этой базе данных |
QHB | DB {#DBNAME}: Commits per second | Количество зафиксированных транзакций в этой базе данных |
QHB | DB {#DBNAME}: Rollbacks per second | Общее количество откатившихся транзакций в этой базе данных |
QHB | DB {#DBNAME}: Frozen XID before autovacuum % | Доля замороженных идентификаторов транзакций перед автоочисткой, в процентах |
QHB | DB {#DBNAME}: Frozen XID before stop % | Доля замороженных идентификаторов транзакций перед остановкой, в процентах |
QHB | DB {#DBNAME}: Locks total | Общее количество блокировок в этой базе данных |
QHB | DB {#DBNAME}: Queries slow maintenance count | Счетчик медленных обслуживающих запросов |
QHB | DB {#DBNAME}: Queries max maintenance time | Максимальная продолжительность обслуживающего запроса |
QHB | DB {#DBNAME}: Queries sum maintenance time | Суммарная продолжительность обслуживающих запросов |
QHB | DB {#DBNAME}: Queries slow query count | Счетчик медленных запросов |
QHB | DB {#DBNAME}: Queries max query time | Максимальная продолжительность запроса |
QHB | DB {#DBNAME}: Queries sum query time | Суммарная продолжительность запросов |
QHB | DB {#DBNAME}: Queries slow transaction count | Счетчик медленных транзакционных запросов |
QHB | DB {#DBNAME}: Queries max transaction time | Максимальная продолжительность транзакционного запроса |
QHB | DB {#DBNAME}: Queries sum transaction time | Суммарная продолжительность транзакционных запросов |
QHB | DB {#DBNAME}: Index scans per second | Количество сканирований по индексу в этой базе данных |
QHB | DB {#DBNAME}: Sequential scans per second | Количество последовательных сканирований в этой базе данных |
Исходные элементы Zabbix | QHB: Get bgwriter | Статистика по активности фонового процесса записи |
Исходные элементы Zabbix | QHB: Get connections sum | Сбор всех метрик из pg_stat_activity |
Исходные элементы Zabbix | QHB: Get dbstat | Сбор всех метрик из pg_stat_database для каждой базы данных |
Исходные элементы Zabbix | QHB: Get locks | Сбор всех метрик из pg_locks для каждой базы данных |
Исходные элементы Zabbix | QHB: Get queries | Сбор всех метрик по времени выполнения запросов |
Исходные элементы Zabbix | QHB: Get transactions | Сбор метрик по времени выполнения транзакций |
Исходные элементы Zabbix | QHB: Get WAL | Основной элемент для сбора метрик WAL |
Исходные элементы Zabbix | DB {#DBNAME}: Get frozen XID | Количество замороженных идентификаторов транзакций |
Исходные элементы Zabbix | DB {#DBNAME}: Get scans | Количество сканирований, проведенных для таблицы/индекса в этой базе данных |
Триггеры
Таблица 64. Триггеры
Название | Описание |
---|---|
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 down | QHB не функционирует |
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 items | Zabbix не получал данные для элементов в течение последних 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'); /* Текст аннотации и два тега */