Мониторинг активности базы данных
- Стандартные инструменты Unix
- Сборщик статистики
- Конфигурация сбора статистики
- Просмотр статистики
- Таблица 1. Динамические статистические представления
- Таблица 2. Представления по собранной статистике
- Таблица 3. Представление pg_stat_activity
- Таблица 4. Описание значений столбца wait_event
- Таблица 5. Представление pg_stat_replication
- Таблица 6. Представление pg_stat_wal_receiver
- Таблица 7. Представление pg_stat_subscription
- Таблица 8. Представление pg_stat_ssl
- Таблица 9. Представление pg_stat_gssapi
- Таблица 10. Представление pg_stat_archiver
- Таблица 11. Представление pg_stat_bgwriter
- Таблица 12. Представление pg_stat_database
- Таблица 13. Представление pg_stat_database_conflicts
- Таблица 14. Представление pg_stat_all_tables
- Таблица 15. Представление pg_stat_all_indexes
- Таблица 16. Представление pg_statio_all_tables
- Таблица 17. Представление pg_statio_all_indexes
- Таблица 18. Представление pg_statio_all_sequence
- Таблица 19. Представление pg_stat_user_functions
- Функции статистики
- Просмотр блокировок
- Отчеты о ходе выполнения команд
- Метрики QHB
- Дашборды метрик QHB для Grafana
Администратор базы данных часто задается вопросом: "Что сейчас делает система"? В этой главе рассказывается, как это выяснить.
Доступны несколько инструментов для мониторинга активности базы данных и
анализа производительности. Большая часть этой главы посвящена описанию
сборщика статистики QHB , но не следует пренебрегать обычными
программами мониторинга Unix, такими как ps
, top
, iostat
и vmstat
.
Кроме того, как только вы определили неэффективный запрос, может
потребоваться дальнейшее исследование с помощью команды EXPLAIN в
QHB . В разделе Использование EXPLAIN обсуждается EXPLAIN и другие методы для понимания
поведения отдельного запроса.
Стандартные инструменты Unix
В большинстве платформ Unix QHB изменяет заголовок своей
команды, сообщаемый ps
, так что отдельные процессы сервера могут быть
легко идентифицированы. Пример вывода команды:
$ ps auxww | grep ^qhb
qhb 15551 0.0 0.1 57536 7132 pts/0 S 18:02 0:00 qhb -i
qhb 15554 0.0 0.0 57536 1184 ? Ss 18:02 0:00 qhb: background writer
qhb 15555 0.0 0.0 57536 916 ? Ss 18:02 0:00 qhb: checkpointer
qhb 15556 0.0 0.0 57536 916 ? Ss 18:02 0:00 qhb: walwriter
qhb 15557 0.0 0.0 58504 2244 ? Ss 18:02 0:00 qhb: autovacuum launcher
qhb 15558 0.0 0.0 17512 1068 ? Ss 18:02 0:00 qhb: stats collector
qhb 15582 0.0 0.0 58772 3080 ? Ss 18:04 0:00 qhb: joe runbug 127.0.0.1 idle
qhb 15606 0.0 0.0 58772 3052 ? Ss 18:07 0:00 qhb: tgl regression [local] SELECT waiting
qhb 15610 0.0 0.0 58772 3056 ? Ss 18:07 0:00 qhb : tgl regression [local] idle in transaction
(Формат вызова ps
может отличаться для разных платформ, как и детали
отображаемой информации. Этот пример приведен для одной из последних версий системы Linux.) Первым
процессом из перечисленных здесь является процесс главного сервера. Аргументы
команды, приведенные здесь для него, те же, что использовались при
запуске. Следующие пять процессов являются фоновыми рабочими процессами,
автоматически запускаемыми главным процессом. (Процесс «stats-collector» не будет показан, если его запуск отключен;
аналогично процесс «autovacuum launcher» (фоновый процесс автоочистки) также можно отключить.) Каждый из оставшихся
процессов является серверным процессом, обрабатывающим одно клиентское
соединение. Для каждого такого процесса устанавливается отображение командной
строки в виде
qhb: user database host activity
Элементы имени пользователя, базы данных и хоста остаются неизменными на протяжении всего жизненного цикла клиентского соединения, а индикатор активности изменяется. Он может принимать значение idle ( ожидание клиентской команды), idle in transaction (ожидание клиента внутри блока BEGIN) или имя типа команды, например, SELECT. Кроме того, добавляется waiting если серверный процесс в настоящее время ожидает высвобождения блокировки, которую удерживает другой сеанс. В приведенном выше примере мы можем сделать вывод, что процесс 15606 ожидает, пока процесс 15610 завершит свою транзакцию и тем самым снимет некоторую блокировку. (Процесс 15610 должен быть блокирующим, потому что нет другого активного сеанса. В более сложных случаях необходимо было бы обратиться к системному представлению pg_locks чтобы определить, кто кого блокирует.)
Если параметр cluster_name настроен, имя кластера также будет показано в выводе
ps
:
$ psql -c 'SHOW cluster_name'
cluster_name
--------------
server1
(1 row)
$ ps aux|grep server1
qhb 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 qhb: server1: background writer
...
Если вы отключили параметр update_process_title, то индикатор активности не обновляется; заголовок процесса устанавливается только один раз при запуске нового процесса. На некоторых платформах это снижает существенные накладные расходы, на других влияние обновления этого индикатора незначительно.
Сборщик статистики
Сборщик статистики QHB - это подсистема, которая поддерживает сбор и передачу информации о работе сервера. В настоящее время сборщик может учитывать обращения к таблицам и индексам как по дисковым блокам, так и по отдельным строкам. Он также отслеживает общее количество строк в каждой таблице, информацию о выполнении вакуума и анализирует действия для каждой таблицы. Также он может подсчитывать вызовы пользовательских функций и общее время, потраченное на каждую из них.
QHB также поддерживает выдачу динамической информации о том, что именно происходит в системе в данный момент, например, о точной команде, выполняемой в настоящее время другими процессами сервера, и о том, какие другие соединения имеются в системе. Эта возможность не зависит от сборщика статистики.
Конфигурация сбора статистики
Поскольку сбор статистики добавляет некоторые накладные расходы к выполнению запроса, система может быть настроена или не настроена на сбор информации. Это контролируется параметрами конфигурации, которые обычно устанавливаются в qhb.conf. (Подробнее о настройке параметров конфигурации см. в главе Конфигурация сервера).
Параметр track_activities позволяет отслеживать текущие команды, выполняемые любым серверным процессом.
Параметр track_counts контролирует, собирается ли статистика по обращениям к таблицам и индексам.
Параметр track_functions позволяет отслеживать использование пользовательских функций.
Параметр track_io_timing включает мониторинг времени чтения и записи блоков.
Обычно эти параметры устанавливаются в qhb.conf так, что они применяются ко всем процессам сервера, но их можно включить или отключить в отдельных сеансах с помощью команды SET. (Чтобы обычные пользователи не могли скрывать свою активность от администратора, только суперпользователи могут изменять эти параметры с помощью SET.)
Сборщик статистики передает собранные данные другим процессам QHB через временные файлы. Эти файлы хранятся в каталоге, название которого задается параметром stats_temp_directory, по умолчанию содержит значение pg_stat_tmp. Для повышения производительности stats_temp_directory может указывать на файловую систему на основе ОЗУ, что сокращает время физического ввода/вывода. Когда сервер отключается, постоянная копия статистических данных сохраняется в подкаталоге pg_stat, так что статистика может быть сохранена при перезапусках сервера. Когда восстановление выполняется при запуске сервера (например, после немедленного выключения, сбоя сервера и восстановления на определенный момент времени), все счетчики статистики сбрасываются.
Просмотр статистики
Несколько предопределенных представлений, перечисленных в Таблице 1, доступны для отображения текущего состояния системы. Есть также несколько других представлений, перечисленных в Таблице 2, доступных для отображения результатов сбора статистики. В качестве альтернативы можно создавать собственные представления с использованием базовых статистических функций, как описано в разделе Функции статистики.
При использовании статистики для мониторинга собранных данных важно понимать, что информация не обновляется мгновенно. Каждый отдельный процесс сервера передает новые статистические значения сборщику непосредственно перед тем, как перейти в режим ожидания; таким образом, запрос или транзакция, которая еще выполняется, не влияет на отображаемые итоги. Кроме того, сам сборщик генерирует новый отчет не чаще одного раза в PGSTAT_STAT_INTERVAL миллисекунд (500 мс, если значение параметра не было изменено при компиляции сервера). Таким образом, отображаемая информация отстает от фактической активности. Однако информация о текущем запросе, собираемая при установке параметра track_activities, всегда актуальна.
Другим важным моментом является то, что когда серверный процесс
запрашивает статистические данные, он
сначала получает самый последний снимок от сборщика статистики, а
затем продолжает использовать этот снимок для всех статистических
представлений и функций до окончания текущей транзакции. Таким
образом, статистика не изменится до окончания текущей транзакции.
Точно так же собирается информация о текущих запросах всех
сеансов, когда она запрашивается в начале транзакции, и эта же информация будет отображаться в течение всей
транзакции. Это функциональность, а не ошибка, она позволяет вам
выполнять несколько запросов к статистике и сопоставлять результаты, не
беспокоясь о том, что данные по статистике изменяются. Но если вы хотите видеть
новые результаты при выполнении каждого запроса, обязательно выполняйте запросы вне
транзакционных блоков. Или вы можете вызвать
pg_stat_clear_snapshot()
, что сбросит снимок статистики текущей
транзакции (если он был). При следующем обращении к статистической
информации будет получен новый снимок.
Транзакция также может видеть свою собственную статистику (пока еще не переданную сборщику) в представлениях pg_stat_xact_all_tables, pg_stat_xact_sys_tables, pg_stat_xact_user_tables и pg_stat_xact_user_functions. Эти данные ведут себя не так, как указано выше. Напротив, они постоянно обновляются на протяжении всей транзакции.
Некоторая информация в представлениях динамической статистики, показанных в Таблице 1, имеет ограничения по безопасности. Обычные пользователи могут видеть только всю информацию о своих собственных сеансах (сеансах, принадлежащих к роли, членом которой они являются). В строках о других сеансах многие столбцы будут нулевыми. Однако обратите внимание, что существование сеанса и его общие свойства, такие как пользователь сеанса и база данных, видны всем пользователям. Суперпользователи и члены встроенной роли pg_read_all_stats (см. также раздел Роли по умолчанию) могут видеть всю информацию обо всех сеансах.
Таблица 1. Динамические статистические представления
Посмотреть имя | Описание |
---|---|
pg_stat_activity | Одна строка для каждого серверного процесса, отображающая информацию, связанную с текущей активностью этого процесса, например состояние и текущий запрос. См. pg_stat_activity |
pg_stat_replication | Одна строка на процесс отправителя WAL, показывающая статистику репликации на подключенный резервный сервер этого отправителя. См. pg_stat_replication |
pg_stat_wal_receiver | Только одна строка, показывающая статистику о приемнике WAL с подключенного сервера этого приемника. См. pg_stat_wal_receiver |
pg_stat_subscription | Как минимум одна строка на подписку, показывающая информацию о процессах подписки. См. pg_stat_subscription. |
pg_stat_ssl | Одна строка для каждого подключения (обычного и реплицирующего), показывающая информацию о SSL, используемом для этого соединения См. pg_stat_ssl. |
pg_stat_gssapi | Одна строка для каждого подключения (обычного и реплицирующего), показывающая информацию об аутентификации и шифровании GSSAPI, используемых в этом соединении. См. pg_stat_gssapi |
pg_stat_progress_create_index | Одна строка для каждого бэкэнда, выполняющего CREATE INDEX или REINDEX, показывающая ход выполнения команды. См. раздел Отчет о ходе выполнения CREATE INDEX. |
pg_stat_progress_vacuum | Одна строка для каждого бэкэнда (включая рабочие процессы автоочистки), на котором выполняется VACUUM, показывающая ход выполнения команды. См. раздел Отчет о ходе выполнения VACUUM. |
pg_stat_progress_cluster | Одна строка для каждого бэкэнда, в котором работает CLUSTER или VACUUM FULL, показывающая ход выполнения команды. См. раздел Отчет о ходе выполнения CLUSTER. |
Таблица 2. Представления по собранной статистике
Посмотреть имя | Описание |
---|---|
pg_stat_archiver | Только одна строка, показывающая статистику о работе процесса архиватора WAL. См. pg_stat_archiver. |
pg_stat_bgwriter | Только одна строка, показывающая статистику о работе фонового процесса записи. См. pg_stat_bgwriter. |
pg_stat_database | Одна строка на базу данных, показывающая статистику всей базы данных. См. pg_stat_database. |
pg_stat_database_conflicts | Одна строка на базу данных, показывающая статистику всей базы данных по отменам запросов из-за конфликта с восстановлением на резервных серверах. См. pg_stat_database_conflicts. |
pg_stat_all_tables | Одна строка для каждой таблицы в текущей базе данных, показывающая статистику доступа к этой конкретной таблице. См. pg_stat_all_tables. |
pg_stat_sys_tables | То же, что pg_stat_all_tables, за исключением того, что отображаются только системные таблицы. |
pg_stat_user_tables | То же, что pg_stat_all_tables, за исключением того, что отображаются только пользовательские таблицы. |
pg_stat_xact_all_tables | Аналогичен pg_stat_all_tables, но подсчитывает статистику по операциям, совершенным до настоящего момента в текущей транзакции (которые еще не включены в pg_stat_all_tables и связанные представления). Столбцы с количеством живых и мертвых строк, а также с данными по выполнению очистки и сбора статистики в этом представлении отсутствуют. |
pg_stat_xact_sys_tables | То же, что pg_stat_xact_all_tables, за исключением того, что отображаются только системные таблицы. |
pg_stat_xact_user_tables | То же, что pg_stat_xact_all_tables, за исключением того, что отображаются только пользовательские таблицы. |
pg_stat_all_indexes | Одна строка для каждого индекса в текущей базе данных, показывающая статистику доступа к этому конкретному индексу. См. pg_stat_all_indexes. |
pg_stat_sys_indexes | То же, что pg_stat_all_indexes, за исключением того, что pg_stat_all_indexes представлены только индексы в системных таблицах. |
pg_stat_user_indexes | То же, что pg_stat_all_indexes, за исключением того, что pg_stat_all_indexes представлены только индексы пользовательских таблиц. |
pg_statio_all_tables | Одна строка для каждой таблицы в текущей базе данных, показывающая статистику ввода-вывода для этой конкретной таблицы. См. pg_statio_all_tables. |
pg_statio_sys_tables | То же, что pg_statio_all_tables, за исключением того, что отображаются только системные таблицы. |
pg_statio_user_tables | То же, что pg_statio_all_tables, за исключением того, что отображаются только пользовательские таблицы. |
pg_statio_all_indexes | Одна строка для каждого индекса в текущей базе данных, показывающая статистику ввода-вывода для этого конкретного индекса. См. pg_statio_all_indexes. |
pg_statio_sys_indexes | То же, что pg_statio_all_indexes, за исключением того, что pg_statio_all_indexes представлены только индексы в системных таблицах. |
pg_statio_user_indexes | То же, что pg_statio_all_indexes, за исключением того, что pg_statio_all_indexes представлены только индексы пользовательских таблиц. |
pg_statio_all_sequences | Одна строка для каждой последовательности в текущей базе данных, показывающая статистику ввода-вывода для этой конкретной последовательности. См. pg_statio_all_sequence для получения подробной информации. |
pg_statio_sys_sequences | То же, что pg_statio_all_sequences, за исключением того, что отображаются только системные последовательности. (В настоящее время системные последовательности не определены, поэтому это представление всегда пусто.) |
pg_statio_user_sequences | То же, что pg_statio_all_sequences, за исключением того, что отображаются только пользовательские последовательности. |
pg_stat_user_functions | Одна строка для каждой отслеживаемой функции, показывающая статистику выполнения этой функции. См. pg_stat_user_functions. |
pg_stat_xact_user_functions | Аналогичен pg_stat_user_functions, но учитывает только вызовы во время текущей транзакции (которые еще не включены в pg_stat_user_functions ). |
Статистика по индексу особенно полезна для определения того, какие индексы используются и насколько они эффективны.
Представления pg_statio_ в первую очередь полезны для определения эффективности буферного кеша. Когда количество фактических операций чтения с диска намного меньше числа обращений к буферу, кеш удовлетворяет большинству запросов на чтение без вызова ядра операционной системы. Однако эти статистические данные не дают полной картины: из-за того, как QHB обрабатывает дисковый ввод-вывод, данные, которых нет в буферном кеше QHB , могут по-прежнему находиться в кэше ввода/вывода ядра и, следовательно, могут по-прежнему выбираться, не требуя физического чтения. Пользователям, заинтересованным в получении более подробной информации о поведении ввода/вывода QHB , рекомендуется использовать сборщик статистики QHB в сочетании с утилитами операционной системы, которые позволяют лучше понять, как ядро обрабатывает ввод/вывод.
Таблица 3. Представление pg_stat_activity
колонка | Тип | Описание |
---|---|---|
datid | oid | OID базы данных, с которой связан этот бэкэнд |
datname | name | Имя базы данных, с которой связан этот бэкэнд |
pid | integer | Идентификатор процесса этого бэкэнда |
usesysid | oid | OID пользователя, вошедшего в этот бэкэнд |
usename | name | Имя пользователя, вошедшего в этот бэкэнд |
application_name | text | Имя приложения, которое подключено к этому бэкэнду |
client_addr | inet | IP-адрес клиента, подключенного к этому бэкэнду. Если это поле пустое, это означает, что клиент подключен через сокет Unix на серверном компьютере или это внутренний процесс, такой как autovacuum. |
client_hostname | text | Имя хоста подключенного клиента, сообщаемое при обратном поиске DNS client_addr. Это поле будет отличным от NULL для IP-соединений и только при включенном режиме log_hostname. |
client_port | integer | Номер порта TCP, который клиент использует для связи с этим бэкэндом, или -1 если используется сокет Unix |
backend_start | timestamp with time zone | Время, когда этот процесс был запущен. Для клиентских бэкэндов это время, когда клиент подключается к серверу. |
xact_start | timestamp with time zone | Время, когда была запущена текущая транзакция этого процесса, или ноль, если транзакция не активна. Если текущий запрос является первой из его транзакций, этот столбец равен столбцу query_start . |
query_start | timestamp with time zone | Время, когда был запущен текущий активный запрос, или если state не active, когда был запущен последний запрос |
state_change | timestamp with time zone | Время последнего изменения состояния |
wait_event_type | text | Тип события, которого ожидает серверная часть, если это имеет место; в противном случае NULL. Возможные значения: |
- LWLock: бэкэнд ждет легкую блокировку. Каждая такая блокировка защищает определенную структуру данных в разделяемой памяти. wait_event будет содержать имя, идентифицирующее цель получения легкой блокировки. (У некоторых блокировок есть особые имена; другие являются частью группы блокировок со схожим назначением.) | ||
- Lock: бэкэнд ждет тяжелую блокировку. Тяжелые блокировки, также известные как блокировки или просто блокировки менеджера блокировок, в основном защищают видимые SQL-объекты, такие как таблицы. Однако они также используются для обеспечения взаимоисключающего обновления для некоторых внутренних операций, таких как расширение отношений. В wait_event обозначается конкретное место ожидания. | ||
- BufferPin: серверный процесс ожидает доступа к буферу данных в течение периода, когда никакой другой процесс не может обращаться к этому буферу. Ожидания закрепления буфера могут быть длительными, если другой процесс удерживает открытый курсор, который последним читал данные из рассматриваемого буфера. | ||
- Activity: Серверный процесс простаивает. Используется системными процессами, ожидающими активности в основном цикле обработки. В wait_event обозначается конкретное место ожидания. | ||
- Extension: серверный процесс ожидает активности в модуле расширения. Эта категория полезна при использовании модулей для отслеживания нестандартных мест ожидания. | ||
- Client: серверный процесс ожидает в сокете некоторой активности от пользовательских приложений. Сервер ожидает, что произойдет что-то, что не зависит от его внутренних процессов. В wait_event обозначается конкретное место ожидания. | ||
- IPC: серверный процесс ожидает некоторой активности от другого процесса на сервере. В wait_event обозначается конкретное место ожидания. | ||
- Timeout: процесс сервера ожидает истечения времени ожидания. В wait_event обозначается конкретное место ожидания. | ||
- IO: серверный процесс ожидает завершения ввода-вывода. В wait_event обозначается конкретное место ожидания. | ||
wait_event | text | Имя события ожидания, если бэкэнд в данный момент в ожидании, иначе NULL. Детали в Таблице 4. |
state | text | Текущее общее состояние этого бэкэнда. Возможные значения: |
- active: бэкэнд выполняет запрос. | ||
- idle: бэкэнд ожидает новой команды от клиента. | ||
- idle in transaction: бэкэнд находится внутри транзакции, но в данный момент не выполняет запрос. | ||
- idle in transaction (aborted): это состояние подобно idle in transaction, за исключением того, что один из операторов в транзакции вызвал ошибку. | ||
- fastpath function call: бэкэнд выполняет функцию fast-path. | ||
- disabled: об этом состоянии сообщается, если track_activities отключен в этом бэкэнде. | ||
backend_xid | xid | Идентификатор транзакции верхнего уровня этого бэкэнда, если он имеется. |
backend_xmin | xid | Граница xmin для данного бэкэнда. |
query | 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, startup, walreceiver, walsender и walwriter. Кроме того, фоновые процессы, зарегистрированные расширениям, могут иметь дополнительные типы. |
Представление pg_stat_activity будет иметь одну строку для каждого серверного процесса, показывая информацию, связанную с текущей активностью этого процесса.
Примечание
Столбцы wait_event и state независимы. Если бэкэнд находится в состоянии active, он может быть или не быть в состоянии ожидания какого-либо события. Если состояние active а wait_event не NULL, это означает, что запрос выполняется, но блокируется где-то в системе.
Таблица 4. Описание значений столбца wait_event
Тип события ожидания | Имя события ожидания | Описание |
---|---|---|
LWLock | ShmemIndexLock | Ожидание поиска и выделения места в разделяемой памяти. |
OidGenLock | Ожидание выделения или назначения OID. | |
XidGenLock | Ожидание выделения или назначения идентификатора транзакции. | |
ProcArrayLock | Ожидание получения снимка или очистки идентификатора транзакции в конце транзакции. | |
SInvalReadLock | Ожидание получения или удаления сообщений из общей очереди инвалидации. | |
SInvalWriteLock | Ожидание добавления сообщения в общую очередь инвалидации. | |
WALBufMappingLock | Ожидание замены страницы в буферах WAL. | |
WALWriteLock | Ожидание записи буферов WAL на диск. | |
ControlFileLock | Ожидание чтения или обновления контрольного файла или создания нового файла WAL. | |
CheckpointLock | Ожидание выполнения контрольной точки. | |
CLogControlLock | Ожидание чтения или обновления статуса транзакции. | |
SubtransControlLock | Ожидание чтения или обновления информации подтранзакции. | |
MultiXactGenLock | Ожидание чтения или обновления общего состояния мультитранзакций. | |
MultiXactOffsetControlLock | Ожидание чтения или обновления смещений мультитранзакций. | |
MultiXactMemberControlLock | Ожидание чтения или обновления членов мультитранзакций. | |
RelCacheInitLock | Ожидание чтения или записи файла инициализации кэша отношения. | |
CheckpointerCommLock | Ожидание при выполнении запросов fsync. | |
TwoPhaseStateLock | Ожидание чтения или обновления состояния подготовленных транзакций. | |
TablespaceCreateLock | Ожидание создания или удаления табличного пространства. | |
BtreeVacuumLock | Ожидание чтения или обновления связанной с вакуумом информации для индекса B-дерева. | |
AddinShmemInitLock | Ожидание управления распределением пространства в разделяемой памяти. | |
AutovacuumLock | Рабочий процесс автовакуума или процесс запуска автовакуума в ожидании обновления или чтения текущего состояния рабочих процессов автоочистки. | |
AutovacuumScheduleLock | Ожидание при проверке, что таблица, которая выбрана для очистки, все еще нуждается в ней. | |
SyncScanLock | Ожидание получения начального местоположения сканирования таблицы для синхронизированных сканирований. | |
RelationMappingLock | Ожидание обновления файла карты отношения, используемого для сохранения в каталоге данных о файловых узлах. | |
AsyncCtlLock | Ожидание чтения или обновления общего состояния уведомлений. | |
AsyncQueueLock | Ожидание чтения или обновления уведомлений. | |
SerializableXactHashLock | Ожидание получения или сохранения информации о сериализуемых транзакциях. | |
SerializableFinishedListLock | Ожидание доступа к списку завершенных сериализуемых транзакций. | |
SerializablePredicateLockListLock | Ожидание выполнения операции со списком блокировок, удерживаемых сериализуемыми транзакциями. | |
OldSerXidLock | Ожидание чтения или записи конфликтующих сериализуемых транзакций. | |
SyncRepLock | Ожидание чтения или обновления информации о синхронных репликах. | |
BackgroundWorkerLock | Ожидание чтения или обновления состония фонового процесса. | |
DynamicSharedMemoryControlLock | Ожидание чтения или обновления состояния динамической разделяемой памяти. | |
AutoFileLock | Ожидание обновления файла qhb.auto.conf. | |
ReplicationSlotAllocationLock | Ожидание выделения или освобождения слота репликации. | |
ReplicationSlotControlLock | Ожидание чтения или обновления состояния слота репликации. | |
CommitTsControlLock | Ожидание чтения или обновления отметок времени подтверждения транзакции. | |
CommitTsLock | Ожидание чтения или обновления последнего значения, установленного для отметки времени транзакции. | |
ReplicationOriginLock | Ожидание установки, удаления или использования источника репликации. | |
MultiXactTruncationLock | Ожидание чтения или очистки информации мультитранзакций. | |
OldSnapshotTimeMapLock | Ожидание чтения или обновления информации о старых снимках. | |
LogicalRepWorkerLock | Ожидание завершения действия процесса логической репликации. | |
CLogTruncationLock | Ожидание выполнения функции txid_status или обновления самого старого идентификатора транзакции, доступного для неё. | |
clog | Ожидание ввода-вывода в clog (буфере состояния транзакций). | |
commit_timestamp | Ожидание ввода-вывода в буфере отметок времени фиксации транзакций. | |
subtrans | Ожидание ввода-вывода буфера подтранзакций. | |
multixact_offset | Ожидание ввода-вывода в буфере смещения мультитранзакций. | |
multixact_member | Ожидание ввода-вывода в буфере multixact_member. | |
async | Ожидание ввода-вывода в асинхронном (уведомляющем) буфере. | |
oldserxid | Ожидание ввода-вывода в буфере oldserxid. | |
wal_insert | Ожидание вставки WAL в буфер памяти. | |
buffer_content | Ожидание чтения или записи страницы данных в памяти. | |
buffer_io | Ожидание ввода-вывода страницы данных. | |
replication_origin | Ожидание чтения или обновления состояния процесса репликации. | |
replication_slot_io | Ожидание ввода-вывода данных слота репликации. | |
proc | Ожидание чтения или обновления информации о блокировке по быстрому пути. | |
buffer_mapping | Ожидание связывания блока данных с буфером в буферном пуле. | |
lock_manager | Ожидание добавления или проверки блокировок для бэкэндов или ожидание присоединения или выхода из группы блокировок (используется параллельными запросами). | |
predicate_lock_manager | Ожидание добавления или проверки информации предикатных блокировок. | |
serializable_xact | Ожидание выполнения операции сериализуемой транзакцией в параллельном запросе. | |
parallel_query_dsa | Ожидание блокировки выделения динамической общей памяти в параллельном запросе. | |
tbm | Ожидание блокировки общего итератора TBM. | |
parallel_append | Ожидание выбора следующего подплана во время выполнения плана параллельного добавления. | |
parallel_hash_join | Ожидание выделения или обмена части памяти или обновления счетчиков во время выполнения плана параллельного хеширования. | |
Lock | relation | Ожидание получения блокировки в отношении. |
extend | Ожидание расширения отношения. | |
page | Ожидание получения блокировки для страницы отношения. | |
tuple | Ожидание получения блокировки для кортежа. | |
transactionid | Ожидание завершения транзакции. | |
virtualxid | Ожидание получения блокировки виртуального XID. | |
speculative token | Ожидание получения блокировки спекулятивной вставки. | |
object | Ожидание получения блокировки для объекта, не относящегося к базе данных. | |
userlock | Ожидание получения пользовательской блокировки. | |
advisory | Ожидание получения рекомендательной пользовательской блокировки. | |
BufferPin | BufferPin | Ожидание закрепления буфера. |
Activity | ArchiverMain | Ожидание в основном цикле процесса архивирования. |
AutoVacuumMain | Ожидание в главном цикле процесса запуска автоочистки. | |
BgWriterHibernate | Ожидание в фоновом процессе записи в режиме бездействия. | |
BgWriterMain | Ожидание в основном цикле рабочего рпоцесса фоновой записи. | |
CheckpointerMain | Ожидание в основном цикле процесса контрольной точки. | |
LogicalApplyMain | Ожидание в основном цикле процесса применения логической репликации. | |
LogicalLauncherMain | Ожидание в основном цикле процесса запуска логической репликации. | |
PgStatMain | Ожидание в основном цикле процесса сбора статистики. | |
RecoveryWalAll | Ожидание восстановления WAL из любого источника (локального, архивного или потокового) при восстановлении. | |
RecoveryWalStream | Ожидание WAL из потока при восстановлении. | |
SysLoggerMain | Ожидание в основном цикле процесса syslogger. | |
WalReceiverMain | Ожидание в основном цикле процесса приема WAL. | |
WalSenderMain | Ожидание в основном цикле процесса отправителя WAL. | |
WalWriterMain | Ожидание в основном цикле процесса записи WAL. | |
Client | ClientRead | Ожидание чтения данных от клиента. |
ClientWrite | Ожидание записи данных, отправляемых клиенту. | |
LibPQWalReceiverConnect | Ожидание в приемнике WAL для установления соединения с удаленным сервером. | |
LibPQWalReceiverReceive | Ожидание в приемнике WAL для получения данных с удаленного сервера. | |
SSLOpenServer | Ожидание SSL при попытке подключения. | |
WalReceiverWaitStart | Ожидание запуска процесса отправки начальных данных для потоковой репликации. | |
WalSenderWaitForWAL | Ожидание сброса WAL в процессе отправки WAL. | |
WalSenderWriteData | Ожидание любого действия при обработке ответов от получателя WAL в процессе отправителя WAL. | |
Extension | Extension | Ожидание в расширении. |
IPC | BgWorkerShutdown | Ожидание выключения фонового рабочего процесса. |
BgWorkerStartup | Ожидание запуска фонового рабочего процесса. | |
BtreePage | Ожидание появления номера страницы, необходимой для продолжения параллельного сканирования B-дерева. | |
CheckpointDone | Ожидание контрольной точки для завершения. | |
CheckpointStart | Ожидание контрольной точки для запуска. | |
ClogGroupUpdate | Ожидание, когда ведущий процесс группы обновит статус транзакции в конце транзакции. | |
ExecuteGather | Ожидание активности от дочернего процесса при выполнении узла сбора данных(Gather). | |
Hash/Batch/Allocating | Ожидание, когда выбранный участник параллельного хеширования разместит хеш-таблицу. | |
Hash/Batch/Electing | Выбор участника параллельного хеширования для размещения хеш-таблицы. | |
Hash/Batch/Loading | Ожидание, пока другие участники параллельного хеширования завершат загрузку хеш-таблицы. | |
Hash/Build/Allocating | Ожидание, когда выбранный участник параллельного хеширования выделит начальную хеш-таблицу. | |
Hash/Build/Electing | Выбор участника параллельного хеширования для размещения начальной хеш-таблицы. | |
Hash/Build/HashingInner | Ожидание, пока другие участники параллельного хеширования завершат хеширование внутреннего отношения. | |
Hash/Build/HashingOuter | Ожидание, пока другие участники параллельного хеширования завершат разбиение внешнего отношения. | |
Hash/GrowBatches/Allocating | Ожидание выделения выбранным участником параллельного хеширования большего количества пакетов. | |
Hash/GrowBatches/Deciding | Выбор участника параллельного хеширования для принятия решения о будущем добавлении пакетов. | |
Hash/GrowBatches/Electing | Выбор участника параллельного хеширования для добавления большего количества пакетов. | |
Hash/GrowBatches/Finishing | Ожидание выбранного участника параллельного хеширования для принятия решения о добавлении дополнительных пакетов. | |
Hash/GrowBatches/Repartitioning | Ожидание, пока другие участники параллельного хеширования завершат перераспределение. | |
Hash/GrowBuckets/Allocating | Ожидание, когда выбранный участник параллельного хеширования закончит выделять дополнительные группы. | |
Hash/GrowBuckets/Electing | Выбор участника параллельного хеширования для выделения дополнительнывх групп. | |
Hash/GrowBuckets/Reinserting | Ожидание, пока другие участники паралллеьного хеширования закончат вставлять кортежи в новые группы. | |
LogicalSyncData | Ожидание, когда удаленный сервер логической репликации отправит данные для начальной синхронизации таблицы. | |
LogicalSyncStateChange | Ожидание, когда удаленный сервер логической репликации изменит состояние. | |
MessageQueueInternal | Ожидание присоединения другого процесса к общей очереди сообщений. | |
MessageQueuePutMessage | Ожидание записи сообщения протокола в общую очередь сообщений. | |
MessageQueueReceive | Ожидание получения байтов из общей очереди сообщений. | |
MessageQueueSend | Ожидание отправки байтов в общую очередь сообщений. | |
ParallelBitmapScan | Ожидание инициализации параллельного сканирования по битовой карте. | |
ParallelCreateIndexScan | Ожидание завершения сканирования параллельными процессами CREATE INDEX. | |
ParallelFinish | Ожидание окончания вычислений параллельных рабочих процессов. | |
ProcArrayGroupUpdate | Ожидание, пока ведущий процесс в группе не очистит идентификатор транзакции в конце транзакции. | |
Promote | В ожидании продвижения ведомых. | |
ReplicationOriginDrop | Ожидание, когда источник репликации станет неактивным и будет удален. | |
ReplicationSlotDrop | Ожидание, когда слот репликации станет неактивным и будет удален. | |
SafeSnapshot | Ожидание снимка транзакции READ ONLY DEFERRABLE. | |
SyncRep | Ожидание подтверждения от удаленного сервера во время синхронной репликации. | |
Timeout | BaseBackupThrottle | Ожидание во время резервного копирования базы при ограничении активности. |
PgSleep | Ожидание в процессе, который вызвал pg_sleep. | |
RecoveryApplyDelay | Ожидание применения WAL при восстановлении из-за задержки. | |
IO | BufFileRead | Ожидание чтения из буферизованного файла. |
BufFileWrite | Ожидание записи в буферизованный файл. | |
ControlFileRead | Ожидание чтения из контрольного файла. | |
ControlFileSync | Ожидание помещения контрольного файла в стабильное хранилище. | |
ControlFileSyncUpdate | Ожидание обновления контрольного файла в стабильном хранилище. | |
ControlFileWrite | Ожидание записи в контрольный файл. | |
ControlFileWriteUpdate | Ожидание записи для обновления контрольного файла. | |
CopyFileRead | Ожидание чтения во время операции копирования файла. | |
CopyFileWrite | Ожидание записи во время операции копирования файла. | |
DataFileExtend | Ожидание расширения файла данных отношения. | |
DataFileFlush | Ожидание помещения файла данных отношения в стабильное хранилище. | |
DataFileImmediateSync | Ожидание немедленной синхронизации файла данных отношения со стабильным хранилищем. | |
DataFilePrefetch | Ожидание асинхронной предварительной выборки из файла данных отношений. | |
DataFileRead | Ожидание чтения из файла данных отношения. | |
DataFileSync | Ожидание переноса изменений в файле реляционных данных в стабильное хранилище. | |
DataFileTruncate | Ожидание усечения файла данных отношения. | |
DataFileWrite | Ожидание записи в файл данных отношений. | |
DSMFillZeroWrite | Ожидание записи нулевых байтов в файл поддержки динамической разделяемой памяти. | |
LockFileAddToDataDirRead | Ожидание чтения при добавлении строки в файл блокировки каталога данных. | |
LockFileAddToDataDirSync | Ожидание поступления данных в стабильное хранилище при добавлении строки в файл блокировки каталога данных. | |
LockFileAddToDataDirWrite | Ожидание записи при добавлении строки в файл блокировки каталога данных. | |
LockFileCreateRead | Ожидание чтения при создании файла блокировки каталога данных. | |
LockFileCreateSync | Ожидание поступления данных в стабильное хранилище при создании файла блокировки каталога данных. | |
LockFileCreateWrite | Ожидание записи при создании файла блокировки каталога данных. | |
LockFileReCheckDataDirRead | Ожидание чтения во время повторной проверки файла блокировки каталога данных. | |
LogicalRewriteCheckpointSync | Ожидание сопоставления логической перезаписи для достижения стабильного хранилища во время контрольной точки. | |
LogicalRewriteMappingSync | Ожидание сопоставления данных для достижения стабильного хранилища во время логической перезаписи. | |
LogicalRewriteMappingWrite | Ожидание записи данных сопоставления во время логической перезаписи. | |
LogicalRewriteSync | Ожидание сопоставления логической перезаписи для достижения стабильного хранилища. | |
LogicalRewriteWrite | Ожидание записи логических сопоставлений перезаписи. | |
RelationMapRead | Ожидание чтения файла карты отношений. | |
RelationMapSync | Ожидание, пока файл карты отношений не будет записан в стабильное хранилище. | |
RelationMapWrite | Ожидание записи в файл карты отношений. | |
ReorderBufferRead | Ожидание чтения во время переупорядочения буфера управления. | |
ReorderBufferWrite | Ожидание записи во время переупорядочения буфера управления. | |
ReorderLogicalMappingRead | Ожидание чтения логического отображения во время управления буфером переупорядочения. | |
ReplicationSlotRead | Ожидание чтения из управляющего файла слота репликации. | |
ReplicationSlotRestoreSync | Ожидание, пока контрольный файл слота репликации не будет помещен в стабильное хранилище при восстановлении его в памяти | |
ReplicationSlotSync | Ожидание, когда контрольный файл слота репликации будет помещен в стабильное хранилище. | |
ReplicationSlotWrite | Ожидание записи в управляющий файл слота репликации. | |
SLRUFlushSync | Ожидание, пока данные SLRU будут записаны в стабильное хранилище во время проверки или остановки базы данных. | |
SLRURead | Ожидание чтения страницы SLRU. | |
SLRUSync | Ожидание, пока данные SLRU будут записаны в стабильное хранилище после записи страницы. | |
SLRUWrite | В ожидании записи страницы SLRU. | |
SnapbuildRead | Ожидание чтения снимка сериализованного исторического каталога. | |
SnapbuildSync | Ожидание получения сериализованного моментального снимка каталога для записи в стабильное хранилище. | |
SnapbuildWrite | Ожидание записи сериализованного исторического снимка каталога. | |
TimelineHistoryFileSync | Ожидание файла хронологии, полученного посредством потоковой репликации, для записи в стабильное хранилище. | |
TimelineHistoryFileWrite | Ожидание записи файла истории линии времени, полученной посредством потоковой репликации. | |
TimelineHistoryRead | Ожидание чтения файла истории линии времени. | |
TimelineHistorySync | Ожидание, когда вновь созданный файл истории линии времени будет записан в стабильное хранилище. | |
TimelineHistoryWrite | Ожидание записи нового файла истории. | |
TwophaseFileRead | Ожидание чтения файла двухфазного состояния. | |
TwophaseFileSync | Ожидание помещения файла двухфазного состояния в стабильное хранилище. | |
TwophaseFileWrite | Ожидание записи файла двухфазного состояния. | |
WALBootstrapSync | Ожидание, пока WAL будет записан в стабильное хранилище во время начальной загрузки. | |
WALBootstrapWrite | Ожидание записи WAL-страницы во время начальной загрузки. | |
WALCopyRead | Ожидание чтения при создании нового сегмента WAL путем копирования существующего. | |
WALCopySync | Ожидание нового сегмента WAL, созданного путем копирования существующего для записи в стабильное хранилище. | |
WALCopyWrite | Ожидание записи при создании нового сегмента WAL путем копирования существующего. | |
WALInitSync | Ожидание, пока недавно инициализированный файл WAL будет записан в стабильное хранилище. | |
WALInitWrite | Ожидание записи при инициализации нового файла WAL. | |
WALRead | Ожидание чтения из файла WAL. | |
WALSenderTimelineHistoryRead | Ожидание чтения из файла истории линии времени при выполнении команды timeline процессом walsender. | |
WALSync | Ожидание, пока файл WAL будет записан в стабильное хранилище. | |
WALSyncMethodAssign | Ожидание, пока данные будут записаны в стабильное хранилище при назначении метода синхронизации WAL. | |
WALWrite | Ожидание записи в файл WAL. |
Примечание
Для траншей, зарегистрированных расширениями, имя указывается по названию расширения, и именно оно будет отображаться в поле wait_event. Вполне возможно, что пользователь зарегистрировал транш в одном из бэкэндов (используя динамическую разделяемую память), и в этом случае другие бэкэнды не получат эту информацию, поэтому в таких случаях выводитсяextension
.
Вот пример того, как события ожидания могут быть просмотрены
SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event is NOT NULL;
pid | wait_event_type | wait_event
------+-----------------+---------------
2540 | Lock | relation
6644 | LWLock | ProcArrayLock
(2 rows)
Таблица 5. Представление pg_stat_replication
Колонка | Тип | Описание |
---|---|---|
pid | integer | Идентификатор процесса отправителя WAL |
usesysid | oid | OID пользователя, вошедшего в этот процесс-отправитель WAL |
usename | name | Имя пользователя, подключенного к процессу-отправителю WAL |
application_name | text | Имя приложения, подключенного к этому процессу-отправителю WAL |
client_addr | inet | IP-адрес клиента, подключенного к этому процессу-отправителю WAL. Если это поле пустое, это означает, что клиент подключен через сокет Unix на сервере. |
client_hostname | text | Имя хоста подключенного клиента, получаемое при обратном поиске в DNS по client_addr. Это поле будет отличным от NULL для IP-соединений и только при включенном log_hostname. |
client_port | integer | Номер TCP-порта, который клиент использует для связи с процессом-отправителем WAL, или -1, если используется сокет Unix. |
backend_start | timestamp with time zone | Время, когда этот процесс был запущен, т.е. когда клиент подключился к этому процессу-отправителю WAL. |
backend_xmin | xid | Значение xmin, полученное от сервера-реплики при включенном hot_standby_feedback. |
state | text | Текущее состояние отправителя WAL. Возможные значения: |
- startup: этот отправитель WAL запускается. | ||
- catchup: подключенный к процессу-отправителю сервер-реплика догоняет основной. | ||
- streaming: процесс-отправитель WAL выполняет потоковую передачу изменений после того, как его подключенный резервный сервер обнаружил основной. | ||
- backup: процесс-отправитель WAL передает резервную копию. | ||
- stopping: процесс-отправитель WAL останавливается. | ||
sent_lsn | pg_lsn | Последняя позиция WAL, отправленная по этому соединению |
write_lsn | pg_lsn | Последняя позиция WAL, записанная на диск этим резервным сервером |
flush_lsn | pg_lsn | Последняя позиция WAL, сброшенная на диск этим резервным сервером |
replay_lsn | pg_lsn | Последняя позиция WAL, примененная в базе данных на этом резервном сервере |
write_lag | interval | Время, прошедшее между локальным сбросом последних данных WAL и получением уведомления о том, что этот резервный сервер записал их (но еще не сбросил или применил их). Это может быть использовано для измерения задержки, которая произошла при фиксации транзакции, когда в synchronous_commit выбран уровень remote_write, если этот сервер был настроен как синхронный резервный сервер. |
flush_lag | interval | Время, прошедшее между локальным сбросом последних данных WAL и получением уведомления о том, что этот резервный сервер записал и сбросил их (но еще не применил). Это может быть использовано для определения задержки, когда в synchronous_commit выбран уровень on при фиксации, если этот сервер был настроен как синхронный резервный сервер. |
replay_lag | interval | Прошло время между локальной очисткой последней WAL и получением уведомления о том, что этот резервный сервер написал, сбросил и применил ее. Это может быть использовано для определения задержки, когда в synchronous_commit выбран уровень remote_apply при фиксации, если этот сервер был настроен как синхронный резервный сервер. |
sync_priority | integer | Приоритет этого резервного сервера для выбора в качестве синхронного резервного в синхронной репликации на основе приоритетов. Не имеет значения при синхронной репликации с учетом кворума. |
sync_state | text | Состояние синхронизации этого резервного сервера. Возможные значения: |
- async: этот резервный сервер является асинхронным. | ||
- potential: этот резервный сервер теперь асинхронный, но потенциально может стать синхронным, если произойдет сбой одного из текущих синхронных серверов. | ||
- sync: этот резервный сервер является синхронным. | ||
- quorum: этот резервный сервер считается кандидатом на участие в кворуме. | ||
reply_time | timestamp with time zone | Время отправки последнего ответного сообщения, полученного от резервного сервера |
Представление pg_stat_replication будет содержать по одной строке на процесс-отправитель WAL, показывающий статистику репликации на соответствующий резервный сервер. Перечислены только напрямую подключенные резервные сервера; информация о резервных серверах, подключенных опосредованно, недоступна.
Время задержки, указанное в представлении pg_stat_replication, представляет время, затраченное на запись, сброс и повторное воспроизведение последнего WAL, а также на то, чтобы отправитель узнал об этом. Эти длительность представляет задержку фиксации, которая была (или должна была быть) добавлена каждым уровнем синхронной фиксации, если удаленный сервер был настроен как синхронный резервный сервер. Для асинхронного режима ожидания столбец replay_lag приблизительно определяет задержку перед тем, как последние транзакции стали видимыми для запросов. Если резервный сервер полностью догнал отправляющий сервер и активность WAL больше не наблюдается, последнее измеренное значение времени задержки будет продолжать отображаться в течение короткого времени, а затем показывать NULL.
Время задержки определяется автоматически для физической репликации. Модули логического декодирования могут не отправлять сообщения отслеживания; в этм случае механизм отслеживания просто отобразит в качестве времени задержки значение NULL.
Примечание
Сообщаемое время задержки не является прогнозом того, сколько времени потребуется резервному серверу, чтобы догнать отправляющий сервер, учитывая текущую скорость воспроизведения. Такая система будет показывать аналогичные значения времени, когда будет генерироваться новый WAL, но не тогда, когда отправляющий сервер будет простаивать. В частности, когда резервный сервер полностью догнал ведущий, pg_stat_replication показывает время, затраченное на запись, очистку и воспроизведение самого последнего переданного изменения WAL, а не ноль, как могут ожидать некоторые пользователи. Это соответствует целям измерения синхронных фиксаций и задержек видимости транзакций для недавних записанных транзакций. Чтобы уменьшить путаницу для пользователей, ожидающих другое поведение при запаздывании, значения запаздывания возвращаются в NULL через короткое время в системе, которая уже воспроизвела все изменения и находится в ожидании. Системы мониторинга должны выбрать, следует ли представлять это как отсутствующие данные, обнулять их или продолжать отображать последнее известное значение.
Таблица 6. Представление pg_stat_wal_receiver
колонка | Тип | Описание |
---|---|---|
pid | integer | Идентификатор процесса-получателя WAL |
status | text | Состояние активности процесса-получателя WAL |
receive_start_lsn | pg_lsn | Первая позиция WAL, используемая при запуске приемника WAL |
receive_start_tli | integer | Первый номер линии времени, используемый при запуске приемника WAL |
received_lsn | pg_lsn | Последняя позиция WAL, уже полученная и записанная на диск, начальное значение этого поля является первой позицией журнала при запуске приемника WAL |
received_tli | integer | Номер линии времени последней позиции WAL, полученной и записанной на диск, начальное значение этого поля является номером линии времени первой позиции журнала, использованной при запуске приемника 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, о которой был уведомлен отправитель WAL |
latest_end_time | timestamp with time zone | Время последней записи WAL, о которой был уведомлен отправитель WAL |
slot_name | text | Имя слота репликации, используемое этим приемником WAL |
sender_host | text | Хост экземпляра QHB , к которому подключен этот приемник WAL. Это может быть имя хоста, IP-адрес или путь к каталогу, если соединение осуществляется через сокет Unix. (Подключение к сокету можно распознать, поскольку он всегда будет абсолютным путем, начинающимся с /.) |
sender_port | integer | Номер порта экземпляра QHB , к которому подключен получатель WAL. |
conninfo | text | Строка соединения, используемая этим приемником WAL, со скрытыми секретными полями. |
Представление pg_stat_wal_receiver будет содержать только одну строку, показывающую статистику о получателе WAL с подключенного сервера этого получателя.
Таблица 7. Представление pg_stat_subscription
колонка | Тип | Описание |
---|---|---|
subid | oid | OID подписки |
subname | text | Название подписки |
pid | integer | Идентификатор процесса рабочего процесса подписки |
relid | Oid | OID отношения, которое процесс синхронизирует; для основного процесса применения |
received_lsn | pg_lsn | Последняя полученная запись WAL, начальное значение этого поля 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, о которой был уведомлен отправитель WAL |
latest_end_time | timestamp with time zone | Время последней записи в WAL, о которой был уведомлен отправитель WAL |
Представление pg_stat_subscription будет содержать одну строку для каждой подписки для основного процесса (с NULL в PID, если процесс не работает) и дополнительные строки для процессов, обрабатывающих начальные данные для таблиц в подписке.
Таблица 8. Представление pg_stat_ssl
колонка | Тип | Описание |
---|---|---|
pid | integer | Идентификатор процесса бэкенда или процесса отправителя WAL |
ssl | boolean | True, если SSL используется для этого соединения |
version | text | Используемая версия SSL или NULL, если SSL в этом соединении не используется. |
cipher | text | Имя используемого шифра SSL или NULL, если SSL не используется в этом соединении |
bits | integer | Количество бит в используемом алгоритме шифрования или NULL, если SSL не используется в этом соединении |
compression | boolean | True, если используется сжатие SSL, false, если нет, или NULL, если SSL не используется в этом соединении. |
client_dn | text | Поле «Уникальное имя» (DN) из используемого клиентского сертификата или NULL, если клиентский сертификат не был предоставлен или SSL не используется в этом соединении. Это поле усекается, если поле DN длиннее, чем NAMEDATALEN (64 символа в стандартной сборке). |
client_serial | numeric | Серийный номер сертификата клиента или NULL, если сертификат клиента не предоставлен или SSL не используется в этом соединении. Комбинация серийного номера сертификата и эмитента сертификата однозначно идентифицирует сертификат (если только эмитент ошибочно не использует серийные номера). |
issuer_dn | text | DN эмитента клиентского сертификата или NULL, если клиентский сертификат не был предоставлен или SSL не используется в этом соединении. Это поле усекается как client_dn. |
Представление pg_stat_ssl будет содержать по одной строке для каждого бэкенда или процесса отправителя WAL, показывая статистику использования SSL для этого соединения. Его можно объединить с pg_stat_activity или pg_stat_replication в столбце pid, чтобы получить более подробную информацию о соединении.
Таблица 9. Представление pg_stat_gssapi
колонка | Тип | Описание |
---|---|---|
pid | integer | Идентификатор процесса бэкэнда |
gss_authenticated | boolean | Истинно, если для этого соединения использовалась аутентификация GSSAPI |
principal | text | Принципал, используемый для аутентификации этого соединения, или NULL, если GSSAPI не использовался для аутентификации этого соединения. Это поле усекается, если участник длиннее, чем NAMEDATALEN (64 символа в стандартной сборке). |
encrypted | boolean | True, если в этом соединении используется шифрование GSSAPI |
Представление pg_stat_gssapi будет содержать одну строку для каждого бэкэнда, показывающую информацию об использовании GSSAPI для этого соединения. Его можно объединить с pg_stat_activity или pg_stat_replication в столбце pid, чтобы получить более подробную информацию о соединении.
Таблица 10. Представление 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_archiver всегда будет содержать одну строку, содержащую данные о процессе архивации кластера.
Таблица 11. Представление 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_bgwriter всегда будет содержать одну строку, содержащую общие данные для всего кластера.
Таблица 12. Представление 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 | Время, затраченное на чтение блоков файлов данных бэкэндами в этой базе данных, в миллисекундах |
blk_write_time | double precision | Время, затрачиваемое на запись блоков файлов данных бэкэндами в этой базе данных, в миллисекундах |
stats_reset | timestamp with time zone | Время последнего сброса этой статистики |
Представление pg_stat_database будет содержать одну строку для каждой базы данных в кластере, плюс одну для общих объектов, показывающую общую статистику на уровне всей базы данных.
Таблица 13. Представление 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_database_conflicts будет содержать одну строку для каждой базы данных, показывающую статистику всей базы данных об отменах запросов, возникающих из-за конфликтов с восстановлением на резервных серверах. Это представление будет содержать информацию только о резервных серверах, поскольку конфликты не возникают на главных серверах.
Таблица 14. Представление 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 | Предполагаемое количество строк, измененных с момента последнего анализа этой таблицы |
last_vacuum | timestamp with time zone | Последний раз, когда эта таблица была очищена вручную (не считая VACUUM FULL) |
last_autovacuum | timestamp with time zone | Последний раз, когда эта таблица была очищена фоновым процессом автоочистки |
last_analyze | timestamp with time zone | Последний раз, когда эта таблица анализировалась вручную |
last_autoanalyze | timestamp with time zone | Последний раз, когда эта таблица анализировалась фоновым процессом автоочистки |
vacuum_count | bigint | Сколько раз эта таблица очищалась вручную (не считая VACUUM FULL) |
autovacuum_count | bigint | Сколько раз эта таблица очищалась фоновым процессом автоочистки |
analyze_count | bigint | Сколько раз эта таблица была проанализирована вручную |
autoanalyze_count | bigint | Сколько раз эта таблица анализировалась фоновым процессом автоочистки |
Представление pg_stat_all_tables будет содержать одну строку для каждой таблицы в текущей базе данных (включая таблицы TOAST), показывающую статистику доступа к этой конкретной таблице. Представления pg_stat_user_tables и pg_stat_sys_tables содержат ту же информацию, но отображают только пользовательские и системные таблицы соответственно.
Таблица 15. Представление 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 будет содержать одну строку для каждого индекса в текущей базе данных, показывающую статистику доступа к этому конкретному индексу. Представления pg_stat_user_indexes и pg_stat_sys_indexes содержат ту же информацию, но показывают только пользовательские и системные индексы соответственно.
Индексы могут использоваться при простом сканировании индекса, сканировании битовых карт индекса и в работе оптимизатора. При сканировании битовых карт выходные данные нескольких индексов можно комбинировать с помощью правил И или ИЛИ, поэтому сложно связать выборки отдельных строк с конкретными индексами при использовании битовых карт. Следовательно, сканирование битовых карт увеличивает значение pg_stat_all_indexes.idx_tup_read для индексов, которые оно использует, и оно увеличивает значение pg_stat_all_tables.idx_tup_fetch count для таблиц, но не влияет при этом на pg_stat_all_indexes.idx_tup_fetch. Оптимизатор также обращается к индексам при использовании переданных констант, значения которых находятся за пределами имеющегося диапазона статистики оптимизатора, поскольку статистика оптимизатора может быть устаревшей.
Примечание
Значения счетчиков idx_tup_read и idx_tup_fetch могут отличаться даже без использования сканирований битовых карт, поскольку idx_tup_read подсчитывает записи индекса, извлеченные из индекса, в то время как idx_tup_fetch подсчитывает число живых строк, извлеченных из таблицы. Последнее значение будет меньше, если какие-либо мертвые или еще не зафиксированные строки извлекаются с использованием индекса или если какие-либо выборки из таблицы не производятся при выполнении сканирования только по индексу.
Таблица 16. Представление pg_statio_all_tables
колонка | Тип | Описание |
---|---|---|
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_tables будет содержать по одной строке для каждой таблицы в текущей базе данных (включая таблицы TOAST), показывая статистику ввода-вывода для этой конкретной таблицы. Представления pg_statio_user_tables и pg_statio_sys_tables содержат ту же информацию, но отображают только пользовательские и системные таблицы соответственно.
Таблица 17. Представление 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_indexes будет содержать по одной строке для каждого индекса в текущей базе данных, показывая статистику ввода-вывода для этого конкретного индекса. Представления pg_statio_user_indexes и pg_statio_sys_indexes содержат ту же информацию, но отфильтрованы так, чтобы показывать только пользовательские и системные индексы соответственно.
Таблица 18. Представление pg_statio_all_sequence
колонка | Тип | Описание |
---|---|---|
relid | oid | OID последовательности |
schemaname | name | Имя схемы, в которой находится эта последовательность |
relname | name | Имя этой последовательности |
blks_read | bigint | Количество дисковых блоков, прочитанных из этой последовательности |
blks_hit | bigint | Количество попаданий в буфер в этой последовательности |
Представление pg_statio_all_sequence будет содержать по одной строке для каждой последовательности в текущей базе данных, показывая статистику ввода-вывода для этой конкретной последовательности.
Таблица 19. Представление pg_stat_user_functions
колонка | Тип | Описание |
---|---|---|
funcid | oid | OID функции |
schemaname | name | Имя схемы, в которой находится эта функция |
funcname | name | Имя этой функции |
calls | bigint | Сколько раз эта функция была вызвана |
total_time | double precision | Общее время, потраченное на эту функцию и все другие функции, вызываемые ею, в миллисекундах |
self_time | double precision | Общее время, потраченное на саму функцию, не включая другие вызываемые ею функции, в миллисекундах |
Представление pg_stat_user_functions будет содержать одну строку для каждой отслеживаемой функции, показывающую статистику о выполнении этой функции. Параметр track_functions определяет, какие именно функции отслеживаются.
Функции статистики
Другие способы просмотра статистики можно настроить, написав запросы,
которые используют те же базовые функции доступа к статистике, которые
используются стандартными представлениями, показанными выше. За
подробностями, такими как имена функций, обращайтесь к определениям
стандартных представлений. (Например, в qsql вы можете выполнить
\\d+ pg\_stat\_activity
.) Функции доступа к статистике для каждой базы данных
принимают OID базы данных в качестве аргумента, чтобы определить, в
какой базе данных будет выполняться их работа. Функции для каждой таблицы и для
индекса принимают OID таблицы или индекса. Функции для статистики по
функциям принимают функцию OID. Обратите внимание, что с этими функциями
можно видеть только таблицы, индексы и функции лишь в текущей базе данных.
Дополнительные функции, связанные со сбором статистики, перечислены в таблице 20.
Таблица 20. Дополнительные статистические функции
функция | Return Type | Описание |
---|---|---|
pg_backend_pid() | integer | Идентификатор процесса сервера, обрабатывающего текущий сеанс |
pg_stat_get_activity ( integer ) | setof record | Возвращает запись информации о бэкэнде с указанным PID или одну запись для каждого активного бэкенда в системе, если указано NULL. Возвращенные поля являются подмножеством полей в представлении pg_stat_activity. |
pg_stat_get_snapshot_timestamp() | timestamp with time zone | Возвращает время снимка текущей статистики |
pg_stat_clear_snapshot() | void | Сбросить текущий снимок статистики |
pg_stat_reset() | void | Сброс всех счетчиков статистики для текущей базы данных до нуля (по умолчанию требуются привилегии суперпользователя, но EXECUTE для этой функции может быть предоставлен другим.) |
pg_stat_reset_shared (text) | void | Сброс некоторых счетчиков статистики для всего кластера на ноль, в зависимости от аргумента (по умолчанию требуются привилегии суперпользователя, но EXECUTE для этой функции может быть предоставлен другим). Вызов pg_stat_reset_shared (’bgwriter’) обнулит все счетчики, показанные в представлении pg_stat_bgwriter. Вызов pg_stat_reset_shared (’archiver’) обнулит все счетчики, показанные в представлении pg_stat_archiver. |
pg_stat_reset_single_table_counters (oid) | void | Сброс статистики для отдельной таблицы или индекса в текущей базе данных до нуля (по умолчанию требуются привилегии суперпользователя, но EXECUTE для этой функции может быть предоставлен другим) |
pg_stat_reset_single_function_counters (oid) | void | Сброс статистики для одной функции в текущей базе данных до нуля (по умолчанию требуются привилегии суперпользователя, но EXECUTE для этой функции может быть предоставлен другим) |
pg_stat_get_activity, основная функция представления pg_stat_activity, возвращает набор записей, содержащих всю доступную информацию о каждом бэкэнд-процессе. Иногда бывает удобнее получить только часть этой информации. В таких случаях может использоваться более старый набор функций доступа к статистике на уровне серверных процессов; они приведены в таблице 21. Эти функции доступа используют идентификационный номер бэкэнда, который варьируется от одного до количества текущих активных бэкэндов. Функция pg_stat_get_backend_idset предоставляет удобный способ генерации одной строки для каждого активного бэкэнда для вызова этих функций. Например, чтобы показать PID и текущие запросы всех бэкэндов:
SELECT pg_stat_get_backend_pid(s.backendid) AS pid,
pg_stat_get_backend_activity(s.backendid) AS query
FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;
Таблица 21. Статистические функции на уровне бэкэндов
функция | Return Type | Описание |
---|---|---|
pg_stat_get_backend_idset() | setof integer | Набор текущих активных идентификационных номеров бэкэнда (от 1 до количества активных бэкэндов) |
pg_stat_get_backend_activity(integer) | text | Текст последнего запроса этого бэкэнда |
pg_stat_get_backend_activity_start(integer) | timestamp with time zone | Время, когда был запущен самый последний запрос |
pg_stat_get_backend_client_addr(integer) | inet | IP-адрес клиента, подключенного к этому бэкэнду |
pg_stat_get_backend_client_port(integer) | integer | Номер порта TCP, который клиент использует для связи |
pg_stat_get_backend_dbid(integer) | oid | 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 | OID пользователя, подключенного к этому бэкэнду |
pg_stat_get_backend_wait_event_type(integer) | text | Имя типа события ожидания, если бэкэнд в данный момент ожидает, иначе NULL. См. Таблицу 4 для получения деталей. |
pg_stat_get_backend_wait_event(integer) | text | Имя события ожидания, если бэкэнд в данный момент ожидает, иначе NULL. См. Таблицу 4 для получения деталей. |
pg_stat_get_backend_xact_start(integer) | timestamp with time zone | Время начала текущей транзакции |
Просмотр блокировок
Еще одним полезным инструментом для мониторинга активности базы данных является системная таблица pg_locks. Это позволяет администратору базы данных просматривать информацию о блокировках в менеджере блокировок. Например, эту возможность можно использовать для того, чтобы:
-
Просмотреть все имеющиеся блокировки, все блокировки отношений в конкретной базе данных, все блокировки определенного отношения или все блокировки, удерживаемые определенным сеансом QHB .
-
Определить отношение в текущей базе данных с наибольшим количеством блокировок (которые могут быть источником проблем среди пользователей базы данных).
-
Определить влияние конкуренции за блокировку на общую производительность базы данных, а также как меняется конкуренция в зависимости от общей нагрузки базы данных.
Детали представления pg_locks см. в разделе pg_locks. Для получения дополнительной информации о блокировке и управлении параллелизмом с QHB обратитесь к главе Параллельный контроль.
Отчеты о ходе выполнения команд
QHB имеет возможность сообщать о ходе выполнения определенных команд во время их выполнения. В настоящее время командами, которые поддерживают отчеты о ходе выполнения, являются CREATE INDEX, VACUUM и CLUSTER. Этот список может быть расширен в будущем.
Отчет о ходе выполнения CREATE INDEX
Для каждой выполняемой команды CREATE INDEX или REINDEX представление pg_stat_progress_create_index будет содержать одну строку для каждого из бэкэндов, создающих в данный момент индексы. Таблицы ниже описывают информацию, которая будет выведена, и предоставляют информацию о том, как ее интерпретировать.
Таблица 22. Просмотр pg_stat_progress_create_index
колонка | Тип | Описание |
---|---|---|
pid | integer | Идентификатор процесса бэкэнда. |
datid | oid | OID базы данных, с которой связан этот бэкэнд. |
datname | name | Имя базы данных, с которой связан этот бэкэнд. |
relid | oid | OID таблицы, для которой создается индекс. |
index_relid | oid | OID создаваемого или переиндексированного индекса. Во время выполнения CREATE INDEX в неблокирующем режиме значение 0. |
command | text | Команда, которая выполняется: CREATE INDEX, CREATE INDEX CONCURRENTLY, REINDEX или REINDEX CONCURRENTLY. |
phase | text | Текущая фаза обработки создания индекса. Смотри таблицу 23. |
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 | При создании индекса для партицированной таблицы в этом столбце указывается количество партиций, для которых индекс был заполнен. |
Таблица 23. Фазы CREATE INDEX
Фаза | Описание |
---|---|
initializing | Инициализация. CREATE INDEX или REINDEX готовится к созданию индекса. Ожидается, что этот этап будет очень коротким. |
waiting for writers before build | Ожидание окончания записи перед построением. CREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидает транзакции с блокировками записи, которые могут читать таблицу. Эта фаза пропускается, когда идет работа в неблокирующем режиме. Столбцы lockers_total, lockers_done и current_locker_pid содержат информацию о ходе выполнения этой фазы. |
building index | Построение индекса. Индекс строится с помощью кода, реализующего метод доступа. На этом этапе методы доступа, которые поддерживают отчеты о ходе выполнения, заполняют свои собственные данные о ходе выполнения, и в этом столбце указывается внутренняя фаза. Как правило, данные о ходе выполнения будут содержать столбцы blocks_total и blocks_done, а также могут меняться значения в столбцах tuples_total и tuples_done. |
waiting for writers before validation | Ожидание окончания записи перед проверкой. CREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидают транзакции с блокироваками записей, которые потенциально могут завершить обновление данных в таблице. Эта фаза пропускается при выполнении операции в неблокирующем режиме. Столбцы lockers_total, lockers_done и current_locker_pid содержат информацию о ходе выполнения этой фазы. |
index validation: scanning index | Проверка индекса: сканирование. CREATE INDEX CONCURRENTLY сканирует индекс в поисках кортежей, которые необходимо проверить. Эта фаза пропускается, когда не в параллельном режиме. Столбцы blocks_total (для общего размера индекса) и blocks_done содержат информацию о ходе выполнения этой фазы. |
index validation: sorting tuples | Проверка индекса: сортировка кортежей. CREATE INDEX CONCURRENTLY сортирует выходные данные фазы сканирования индекса. |
index validation: scanning table | Проверка индекса: сканирование таблицы. CREATE INDEX CONCURRENTLY сканирует таблицу для проверки кортежей индексов, собранных на предыдущих двух этапах. Эта фаза пропускается, когда не в параллельном режиме. Столбцы blocks_total (для общего размера таблицы) и blocks_done содержат информацию о ходе выполнения этой фазы. |
waiting for old snapshots | Ожидание старых снимков. CREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидает транзакций, которые потенциально могут увидеть таблицу, чтобы выпустить их моментальные снимки. Эта фаза пропускается при выполнении операции в неблокирующем режиме. Столбцы lockers_total, lockers_done и current_locker_pid содержат информацию о ходе выполнения этой фазы. |
waiting for readers before marking dead | Ожидание завершения чтения перед отключением старого индекса. REINDEX CONCURRENTLY ожидает завершение транзакций, удерживающих блокировки чтения, прежде чем пометить старый индекс как нерабочий. Эта фаза пропускается при выполнении операции в неблокирующем режиме. Столбцы lockers_total, lockers_done и current_locker_pid содержат информацию о ходе выполнения этой фазы. |
waiting for readers before dropping | Ожидание завершения чтения перед удалением старого индекса. REINDEX CONCURRENTLY ожидает завершение транзакций, удерживающих блокировки чтения, прежде чем удалить старый индекс. Эта фаза пропускается при выполнении операции в неблокирующем режиме. Столбцы lockers_total, lockers_done и current_locker_pid содержат информацию о ходе выполнения этой фазы. |
Отчет о ходе выполнения VACUUM
Всякий раз, когда VACUUM работает, представление pg_stat_progress_vacuum будет содержать одну строку для каждого бэкэнда (включая рабочие процессы автоочистки), который в данный момент производит очистку. Таблицы ниже описывают информацию, которая будет предоставлена, и поясняют, как ее интерпретировать. О ходе выполнения команд VACUUM FULL сообщается через pg_stat_progress_cluster поскольку VACUUM FULL и CLUSTER перезаписывают таблицу, в то время как обычный VACUUM только изменяет ее на месте. См. раздел Отчет о ходе выполнения CLUSTER.
Таблица 24. Просмотр pg_stat_progress_vacuum
колонка | Тип | Описание |
---|---|---|
pid | integer | Идентификатор процесса бэкэнда. |
datid | oid | OID базы данных, с которой связан этот бэкэнд. |
datname | name | Имя базы данных, с которой связан этот бэкэнд. |
relid | oid | OID стола пылесосят. |
phase | text | Текущая фаза обработки вакуума. Смотри Таблицу 25. |
heap_blks_total | bigint | Общее количество блоков кучи в таблице. Этот номер сообщается с начала сканирования; добавленные позже блоки не будут (и не обязательно) посещаться этим VACUUM. |
heap_blks_scanned | bigint | Количество отсканированных блоков кучи. Поскольку карта видимости используется для оптимизации сканирования, некоторые блоки будут пропущены без проверки; пропущенные блоки включены в это общее количество, так что это число в конечном итоге станет равным heap_blks_total когда вакуум будет завершен. Этот счетчик активируется только тогда, когда фаза scanning heap. |
heap_blks_vacuumed | bigint | Количество блоков кучи вакуумировано. Если таблица не имеет индексов, этот счетчик увеличивается только тогда, когда фаза vacuuming heap. Блоки, которые не содержат мертвых кортежей, пропускаются, поэтому счетчик может иногда пропускать вперед с большими приращениями. |
index_vacuum_count | bigint | Количество выполненных индексных вакуумных циклов. |
max_dead_tuples | bigint | Количество мертвых кортежей, которые мы можем сохранить перед выполнением цикла индекса вакуума, основываясь на maintenance_work_mem. |
num_dead_tuples | bigint | Количество мертвых кортежей, собранных с момента последнего индекса вакуумного цикла. |
Таблица 25. Фазы VACUUM
фаза | Описание |
---|---|
initializing | VACUUM готовится начать сканирование кучи. Ожидается, что этот этап будет очень коротким. |
scanning heap | VACUUM в настоящее время сканирует кучу. Он будет обрезать и дефрагментировать каждую страницу, если потребуется, и, возможно, выполнять замораживание. heap_blks_scanned можно использовать для отслеживания хода сканирования. |
vacuuming indexes | VACUUM в настоящее время пылесосит индексы. Если в таблице есть какие-либо индексы, это будет происходить как минимум один раз за вакуум после полного сканирования кучи. Это может происходить несколько раз за вакуум, если maintenance_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 и сообщать статистику pg_class статистики. Когда эта фаза будет завершена, VACUUM закончится. |
Отчет о ходе выполнения CLUSTER
Всякий раз, когда CLUSTER или VACUUM FULL работает, представление pg_stat_progress_cluster будет содержать строку для каждого бэкэнда, который в данный момент выполняет любую из команд. Таблицы ниже описывают информацию, которая будет сообщена, и предоставляют информацию о том, как ее интерпретировать.
Таблица 26. просмотр pg_stat_progress_cluster
Колонка | Тип | Описание |
---|---|---|
pid | integer | Идентификатор процесса бэкэнда. |
datid | oid | OID базы данных, с которой связан этот бэкэнд. |
datname | name | Имя базы данных, с которой связан этот бэкэнд. |
relid | oid | OID кластеризованной таблицы. |
command | text | Команда, которая выполняется. Либо CLUSTER либо VACUUM FULL. |
phase | text | Текущая фаза обработки. Смотри Таблицу 27. |
cluster_index_relid | oid | Если таблица сканируется с использованием индекса, это 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. |
Таблица 27. Фазы 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
Общие замечания
В настоящее время метрики в QHB собираются на уровне всего кластера баз данных и относятся ко всему набору процессов QHB, независимо от того, являются ли они фоновыми или поддерживающими пользовательские подключения. Данные метрик поступают в сборщик и агрегатор метрик metricsd, далее агрегируются и записываются в Graphite, в качестве интерфейса к которому выступает Grafana.
Типы метрик
- Gauge. Неотрицательное целое значение. Может быть установлено, увеличено или уменьшено на заданное число.
- Counter. Неотрицательное целое значение. Может быть только увеличено на заданное число.
- Timer. Неотрицательное целое значение, длительность в наносекундах. Значение может быть только записано, во время агрегации вычисляется ряд
статистических характеристик:
- sum. Сумма значений
- count. Число записанных значений
- max. Максимальное из записанных значений
- min. Минимальное из записанных значений
- mean. Арифметическое среднее
- median. Медиана
- std. Стандартное квадратичное отклонение
- Опционально, список перцентилей
Группы метрик
Системные метрики
Сбор системных метрик регулируется двумя глобальными константами:
- qhb_os_monitoring - логическая константа, по умолчанию значение off. При значении on выполняется периодический сбор метрик.
- qhb_os_stat_period - период сбора системной статистики в секундах, по умолчанию 30 секунд.
Загрузка и CPU
Наименование | Описание | Тип метрики |
---|---|---|
sys.load_average.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
Чтобы детальнее ознакомиться с особенностями, связанными с этим показателем, можно ознакомиться с переводом статьи Brendan Gregg: https://habr.com/ru/company/mailru/blog/335326
Если значение этого показателя за последнюю минуту больше, чем за последние 5 и 15 минут, нагрузка растет, если меньше - падает. Однако, этот показатель важен не сам по себе, а по отношению к общему числу процессоров. Дополнительные и производные от load average метрики по загрузке процессоров sys.cpu.
sys.cpu.<N>min = sys.load_average.<N>min / cpu_count * 100
где cpu_count - количество процессоров в системе, а N принимает значения 1,5 или 15.
Количество процессоров рассчитывается как произведение количества физических сокетов, ядер на сокет и нитей на ядро. Команда lscpu
выводит все необходимые данные в следующих строках (пример вывода):
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
В данном случае cpu_count = 2 * 4 * 1 = 8.
Альтернативным и более простым методом может быть получение этого значения через команду nproc
.
Таким образом, загрузка в 100% будет достигнута в данном случае, если величина load average будет стремиться к 8. Однако, эти расчеты и значения будут иметь довольно приблизительный и даже условный характер, что показывает приведенная выше по ссылке статья.
Использование памяти
Наименование | Описание | Тип метрики |
---|---|---|
sys.mem.total | общий размер установленной памяти RAM | gauge |
sys.mem.used | используемая память | gauge |
sys.mem.free | неиспользуемая память | gauge |
sys.mem.available | память, доступная для запускаемых приложений (не включая swap, но учитывая потенциально освобождаемую память, занимаемую страничным кэшем) | gauge |
sys.swap.total | общий размер файла подкачки | gauge |
sys.swap.free | неиспользуемая память файла подкачки | gauge |
Значения метрик соответствуют следующим полям из вывода утилиты free
(значения в kB, т.е. соответствуют выводу free -k
):
Метрика | Поле утилиты free |
---|---|
sys.mem.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
Таким образом, в Графане можно, используя функцию diffSeries, рассчитывать и выводить это значение на основании других имеющихся данных.
Значение Mem:shared (данные виртуальной файловой системы tmpfs) не выводится через метрики.
Значение Swap:used можно рассчитать по формуле:
Swap:used = Swap:total - Swap:free
Это значение можно выводить в Графане также в виде рассчитываемой величины через функцию diffSeries.
Более детальное описание этих показателей может быть получено через справочную систему операционной системы для утилиты free
(Для этого вызовите man free
).
Использование дискового пространства
Наименование | Описание | Тип метрики |
---|---|---|
sys.disk_space.total | объем дисковой системы, на которой находится каталог с данными (в байтах) | gauge |
sys.disk_space.free | свободное пространство дисковой системы, на которой находится каталог с данными (в байтах) | gauge |
Метрики относятся к дисковой системе, на которой расположен каталог с файлами базы данных. Этот каталог определяется параметром командной строки -D
при запуске базы данных либо переменной среды $PGDATA. Параметр data_directory в файле параметров qhb.conf может переопределять расположение каталога с данными.
Другие системные метрики
Наименование | Описание | Тип метрики |
---|---|---|
sys.processes | общее количество запущенных в системе процессов | gauge |
sys.uptime | количество секунд, прошедших с начала запуска системы | gauge |
Метрики по вводу-выводу
Метрики чтения блоков на уровне инстанса QHB
Наименование | Описание | Тип метрики |
---|---|---|
qhb.db_stat.blocks_fetched | количество полученных при чтении блоков | counter |
qhb.db_stat.blocks_hit | количество блоков, найденных в кэше при чтении | counter |
qhb.db_stat.blocks_read_time | время чтения блоков, в миллисекундах | counter |
qhb.db_stat.blocks_write_time | время чтения блоков, в миллисекундах | counter |
На основании метрик qhb.db_stat.blocks_fetched и qhb.db_stat.blocks_hit рассчитывается коэффициент попадания в кэш:
k = blocks_hit / blocks_fetched * 100%
Хорошим уровнем обычно считается значение более 90%. Если значение коэффициента существенно ниже этой отметки, желательно рассмотреть возможность увеличения объема буферного кэша.
Метрики процесса bgwriter
Наименование | Описание | Тип метрики |
---|---|---|
qhb.bgwr.checkpoints_timed | количество запланированных контрольных точек, которые были выполнены | counter |
qhb.bgwr.checkpoints_req | количество запрошенных контрольных точек, выполненных вне очереди запланированных | counter |
qhb.bgwr.checkpoint_write_time | время, потраченное на этап обработки контрольной точки, где файлы записываются на диск, в миллисекундах | counter |
qhb.bgwr.checkpoint_sync_time | количество времени, потраченное на часть обработки контрольной точки, где файлы синхронизируются с диском, в миллисекундах | counter |
qhb.bgwr.buffers_checkpoint | количество буферов, записанных во время контрольных точек | counter |
qhb.bgwr.buffers_clean | количество буферов, записанных фоновым процессом записи | counter |
qhb.bgwr.maxwritten_clean | количество раз, когда процесс записи в фоновом режиме останавливал сброс грязных страниц, поскольку записывал слишком много буферов | counter |
qhb.bgwr.buffers_backend | количество буферов, записанных непосредственно бэкэндом | counter |
qhb.bgwr.buffers_backend_fsync | сколько раз бэкэнд выполнял вызов fsync сам (обычно их обрабатывает фоновый процесс записи, даже когда бэкэнд выполняет запись самостоятельно) | counter |
qhb.bgwr.buffers_alloc | количество выделенных буферов | counter |
Данные по перечисленным метрикам отображаются в разделе "Контрольные точки и операции с буферами" дашборда "QHB". Обычно при выполнении запланированных контрольных точек сначала происходит запись информации о начале контрольной точки, затем в течение некоторого времени идет сброс блоков на диск и по окончании контрольной точки фиксируется информация о продолжительности записи и синхронизации данных. В случае обработки запланированной контрольной точки запись блоков равномерно распределяется во времени согласно параметрам настройки, чтобы снизить влияние этого процесса на общий ввод-вывод. При запрошенных через команду контрольных точках сброс блоков происходит сразу, без искусственной задержки.
Метрики процесса архивации WAL-файлов
Наименование | Описание | Тип метрики |
---|---|---|
qhb.wal.archived | количество успешно выполненных операций архивации WAL-файлов | counter |
qhb.wal.failed | количество попыток архивации, завершившихся сбоем | counter |
qhb.wal.archive_time | время, потраченное на копирование файлов журналов, в наносекундах | counter |
Эти метрики работают в том случае, если настроена архивация WAL. Для этого необходимо установить archive_mode
в значение on
и определить команду архивации в параметре archive_command
.
Метрики по транзакциям
Метрики по завершениям и отменах транзакций. Данные метрик собираются непосредственно при выполнении команд завершения и отмены транзакций на уровне всего кластера баз данных
Наименование | Описание | Тип метрики |
---|---|---|
qhb.transaction.commit | количество фиксаций транзакций | counter |
qhb.transaction.rollback | количество отмен транзакций | counter |
qhb.transaction.deadlocks | количество дедлоков | counter |
Коэффициент подтверждения транзакций рассчитывается как процентное отношение успешных завершений транзакций к сумме подтверждений и откатов транзакций:
k = commit/(commit + rollback)*100%
Обычно значение стремится к 100%, т.к. чаще всего транзакции завершаются успешно. Существенная доля отмен транзакций может говорить о том, что в системе существуют проблемы.
Дедлоки возникают при взаимных блокировках, когда между различными сессиями возникают ситуации взаимного ожидания освобождения заблокированных данных. В этом случае после автоматического определения дедлока происходит отмена одной из транзакций.
Метрики событий ожиданий
Данный набор метрик полностью соответствует набору стандартных событий ожидания. Метрики имеют префикс qhb.wait. Далее в наименовании идет класс события ожидания и через точку название события ожидания. В текщем релизе имена метрик ограничены в размере и имеют в наименовании максимум 31 символ. Все метрики по событиям ожиданий имеют тип counter, однако, значение содержит продолжительность времени в микросекундах, которые эти ожидания заняли в совокупности во всех сессиях за период агрегации.
Примечание
Если в течение периода наблюдения работало множество пользовательских подключений, которые находились в состоянии ожидания, суммарное значение времени ожидания может многократно превзойти этот период. Например, если в течение 10 секунд 1000 сессий провели в ожиданиях по одной секунде, суммарное время ожиданий составит 1000 секунд.
Метрики с типами событий ожидания Lock, LWLock, IO и IPC отображаются в разделе "События ожидания" дашборда QHB. Значения метрик выводятся в микросекундах (автоматически переводясь в другие единицы при увеличении значений). На существующих графиках выводятся не все события ожиданий, а только по пять самых значимых по величине на каждом графике. Разные события ожиданий могут иметь сильно отличающиеся по величине продолжительности. Значительные колебания значений могут отражать возникающие проблемы.
Наиболее значимые события ожиданий
- Lock.extend, ожидание расширения отношения. Становится заметным при активном росте таблиц. Необходимость выделения новых блоков приводит к некоторым задержкам, которые отражаются в этой метрике.
- Lock.transactionid, ожидание завершения транзакции. Событие ожидания возникает в том случае, если транзакция вынуждена ждать окончания обработки предыдущих транзакций, которые также получают подтверждение своего окончания.
- Lock.tuple, ожидание получения блокировки для кортежа. Возникает в случае одновременной работы с теми же данными нескольких транзакций.
- LWLock.WALWriteLock, ожидание записи буферов WAL на диск. Часто является лидером среди событий ожиданий этого типа, т.к. операции с диском являются наиболее медленными в этой группе событий ожидания.
- LWLock.wal_insert, ожидание вставки WAL в буфер памяти.
- LWLock.buffer_content, ожидание чтения или записи страницы данных в памяти. Возникает и становится существенным при интенсивном вводе-выводе.
- LWLock.buffer_mapping, ожидание связывания блока данных с буфером в буферном пуле.
- LWLock.lock_manager, ожидание добавления или проверки блокировок для бэкэндов. Событие становится значимым при частых транзакциях.
Метрики буферного менеджера
Ниже представлены метрики, касающиеся механизмов управления памятью.
Наименование | Операция | Описание | Тип метрики | Агрегат |
---|---|---|---|---|
qhb.bufmgr.BufferAlloc | чтение данных | количество поисков буфера | 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 |
Метрики пула соединений QCP
Ниже описаны метрики пула соединений, характеризующие работу пула.
Наименование | Операция | Описание | Тип метрики |
---|---|---|---|
backend_held | выполнение запроса | время, в течение которого qcp удерживает соединение к серверу привязанным к какому-то клиенту | timer |
queue | выполнение запроса | количество запросов в очереди на текущий момент | gauge |
relay.wait_request | выполнение запроса | время ожидания получения запроса от клиента | timer |
relay.wait_response | выполнение запроса | время ожидания ответа на запрос от сервера | timer |
Дашборды метрик QHB для Grafana
Дашборды QHB для Grafana расположены в репозитории по следующей ссылке.
QHB поставляется совместно с сервером метрик, который записывает данные метрик в Graphite и интерфейсом к которым служит Grafana. Текущий набор дашбордов для Grafana поставляется в качестве самодокументируемых образцов, на основе которых пользователи, при необходимости, могут самостоятельно создать дашборда, более соответствующие их потребностям. Вместе с тем, поставляемые дашборды могут использоваться и в исходном виде.
Импорт дашбордов
Экспорт JSON-описания дашбордов выполнен в Grafana 6.7.2.
Перед импортом JSON-описания необходимо решить, будут ли названия метрик содержали в качестве префикса имя хоста.
Именно таким образом устроены наименования метрик внутри дашбордов и этот вариант рекомендуется оставить.
В начале имен метрик добавлена переменная $server_name, по умолчанию для нее выбрано значение your_host_name
.
Перед импортом можно заменить в JSON-файлах это значение на наименование одного из хостов.
В дальнейшем в этой переменной через интерфейс Grafana можно будет добавить через запятую все имена хостов,
с которых будут собираться метрики. Это позволит быстро переключаться при просмотре метрик с одного хоста на другой.
Если такая схема использоваться не будет (в случае, если метрики будут использоваться с единственного хоста),
можно удалить в файлах JSON во всех именах метрик префикс $server_name до проведения импорта описания JSON.
Однако, это более трудоемкий вариант и его выбирать не рекомендуется.
Для импорта описаний дашбордов необходимо выполнить следующие шаги:
- В меню "Dashboards" вашего сайта Grafana выбрать пункт "Manage".
- В открывшемся списке папок и дашбордов выбрать существующую или создать новую папку.
- Находясь в выбранной папке, выбрать в правой верхней части страницы пункт "Import".
- На открывшейся странице можно либо нажать справа вверху кнопку "Upload .json file" и загрузить файл либо вставить содержание JSON-файла в поле под заголовком "Or paste JSON" и нажать кнопку "Load". После этого нужно заполнить необходимые параметры и выполнить загрузку JSON-описания.
Дашборд "Операционная система"
Дашборд представляет основные системные показатели:
- Время работы инстанаса QHB
- Load Average
- Исполользование CPU
- Использование памяти
- Использование дисковой системы, на которой расположен каталог баз данных
Дашборд "QHB"
Дашборд содержит несколько разделов:
- Транзакции
- Чтение и запись блоков
- События ожидания
- Контрольные точки и операции с буферами
- Архивация WAL
В каждом разделе представлены наборы тематических панелей, отражающие основные показатели.
Настройка сбора метрик
Для того, чтобы дашборды отображали данные метрик, необходимо выполнить некоторые настройки.
Настройка сервера метрик
Настройка сервера метрик описана в разделе Сервер метрик.
Рекомендуется в параметре prefix конфига /etc/metricsd/config.yaml сервера метрик прописать имя хоста,
на котором он работает. Если сделать это для каждого сервера, все метрики будут организованы иерархически,
и первый уровень иерархии будет уровнем серверов. В именах метрик в предлагаемых дашбордах для этих целей присутствует
переменная $server_name. Подразумевается, что на хосте работает только один кластер баз данных.
Настройка параметров базы данных
Для настройки отправки метрик необходимо в qhb.conf указать параметр metrics_collector_id в значение, с которым запускается сборщик метрик, например, 1001 (актуально до релиза QHB 1.3.0). Начиная с релиза QHB 1.3.0 вместо metrics_collector_id используется collector_addr, по умолчанию имеет значение @metrics-collector (представляет собой адрес unix domain socket'а), сервер метрик по умолчанию запускается именно на этом адресе.
Для настройки отправки аннотаций необходимо в qhb.conf прописать следующие параметры:
grafana.address - адрес Графаны, например http://localhost:3000
grafana.token - необходимо указать токен, полученный в Графане по адресу http://localhost:3000/org/apikeys
Пример настроек в qhb.conf для отправки метрик и аннотаций
# До релиза QHB 1.3.0
# metrics_collector_id = 1001
# С релиза QHB 1.3.0:
collector_addr = @metrics-collector
grafana.address = 'http://localhost:3000'
grafana.token = 'eyJrIjoiNGxTaloxMUNTQkFUMTN0blZqUTN6REN6OWI5YjM1MzMiLCJuIjoidGVzdCIsImlkIjoxfQ=='
Для сбора системных метрик (Дашборд "Операционная система") необходимо установить параметр qhb_os_monitoring в значение on. Можно также задать период сбора системной статистики qhb_os_stat_period, значение по умолчанию которого равно 30 секундам. Не рекомендуется задавать слишком низкое значение для этого параметра, т.к. сбор системной статистики требует некоторых ресурсов.
В файле параметров можно прописать:
qhb_os_monitoring = on
qhb_os_stat_period = 60 # если период по умолчанию в 30 секунд не устраивает
Либо выполнить команды:
alter system set qhb_os_monitoring = on;
alter system set qhb_os_stat_period = 60;
select pg_reload_conf();
Примеры использования метрик в SQL-функциях
Помимо встроенных метрик, пользователи могут использовать свои метрики через следующие функции SQL.
Тип метрик Timer
Используется при фиксации промежутка времени, единицы измерения - наносекунды.
select qhb_timer_report('qhb.timer.nano',10000000000 /* 10 секунд в наносекундах */);
Тип метрик Counter
Используется, когда нужно зафиксировать количество произошедших за промежуток времени событий.
select qhb_counter_increase_by('qhb.example.counter',10);
Тип метрик Gauge
Используется, когда нужно установить некий статичный показатель в определенное значение или изменить его.
select qhb_gauge_update('qhb.gauge_example.value', 10); /* Установка значения */
select qhb_gauge_add('qhb.gauge_example.value',1); /* Увеличение значения */
select qhb_gauge_sub('qhb.gauge_example.value',1); /* Уменьшение значения */
Аннотации
Используются, если нужно добавить комментарий к данным метрик. Первый параметр функции - текст комментария, последующие параметры - теги.
select qhb_annotation('Начало выполнения теста', 'test','billing'); /* Текст аннотации и два тега */