F.66. pg_wait_sampling — периодический сбор статистики по событиям ожидания #
pg_wait_sampling — это расширение Postgres Pro для периодического сбора статистики по событиям ожидания.
Начиная с версии 9.6, Postgres Pro Enterprise выдаёт информацию о текущих событиях ожидания для определённых процессов. Однако чтобы получить полезную общую статистику активности сервера, необходимо снимать показания по событиям ожидания неоднократно. Расширение pg_wait_sampling автоматизирует снятие показаний по событиям ожидания, запуская специальный рабочий процесс. Когда расширение pg_wait_sampling включено, вы можете получать следующую периодически собираемую информацию:
История ожиданий — список событий ожидания для недавних процессов, с отметками времени.
Профиль ожиданий — количество наблюдавшихся событий ожидания для всех процессов (в разрезе типов событий).
Текущие события ожидания для всех процессов, включая фоновые рабочие процессы.
Агрегированная статистика событий ожидания — выборки событий ожидания, сгруппированные по идентификаторам запросов и планов либо по настраиваемым измерениям, таким как база данных, пользователь, адрес клиента, приложение, обслуживающий процесс или сеанс.
Используя pg_wait_sampling, можно выявить проблемы зависимостей для запросов, выполняющихся дольше, чем ожидается. Вы можете видеть процессы в состоянии ожидания в каждый момент времени и анализировать статистику событий ожидания. Список возможных событий ожидания приведён в Таблице 28.4.
Вы можете настроить набор измерений, записываемых в историю и профиль событий ожидания, с помощью параметров конфигурации pg_wait_sampling.history_dimensions и pg_wait_sampling.profile_dimensions. За подробной информацией обратитесь к Подразделу F.66.3.1.
См. также
Просмотр статистики по событиям ожидания
F.66.1. Установка #
Расширение pg_wait_sampling входит в состав Postgres Pro Enterprise и не имеет особых требований.
Чтобы включить pg_wait_sampling, выполните следующее:
Добавьте
pg_wait_samplingв переменнуюshared_preload_librariesв файлеpostgresql.conf:shared_preload_libraries = 'pg_wait_sampling'
Важно
При использовании
pg_wait_samplingс расширениемpg_stat_statementsпоместитеpg_stat_statementsпередpg_wait_samplingв переменнойshared_preload_libraries. Это гарантирует, что расширениеpg_stat_statementsне перезапишет идентификаторы запросов, которые используютсяpg_wait_sampling.Создайте расширение
pg_wait_sampling, выполнив следующий запрос:CREATE EXTENSION pg_wait_sampling;
Перезапустите сервер. Так как расширению
pg_wait_samplingтребуется дополнительная разделяемая память и фоновый рабочий процесс, вы должны перезапустить сервер после добавления или удаленияpg_wait_sampling.
После создания расширения pg_wait_sampling начинает собирать статистику по событиям ожидания для каждого процесса. Вы можете по своему усмотрению изменить частоту снятия показаний и настроить режимы сбора статистики, используя переменные GUC.
Если вы хотите остановить сбор статистики, удалите расширение pg_wait_sampling, уберите pg_wait_sampling из переменной shared_preload_libraries и перезагрузите сервер.
F.66.2. Использование #
F.66.2.1. Просмотр статистики по событиям ожидания #
Когда pg_wait_sampling работает, показания снимаются по умолчанию каждые 10 мс. Обратиться к собранной статистике вы можете через набор функций и представлений. Если вы замечаете, что некоторые запросы «зависли» или выполняются дольше, чем ожидается, вы можете увидеть все текущие события ожидания в представлении pg_wait_sampling_current:
SELECT * FROM pg_wait_sampling_current;
Возвращаемая статистика охватывает все активные процессы, включая фоновые рабочие процессы. Чтобы отфильтровать это представление по одному процессу, воспользуйтесь функцией pg_wait_sampling_get_current() и передайте ей идентификатор интересующего процесса:
SELECT * FROM pg_wait_sampling_get_current(pid);Параметр конфигурации pg_wait_sampling.history_dimensions определяет, какие столбцы заполняются в этом представлении. По умолчанию представление содержит значения для pid, event и queryid, а остальные столбцы содержат NULL.
Чтобы лучше понимать динамику недавних событий ожидания, можно обратиться к представлению pg_wait_sampling_history, показывающему историю событий ожидания для последних процессов:
SELECT * FROM pg_wait_sampling_history;
Это представление содержит показатели по событиям ожидания в с отметками времени. Параметр pg_wait_sampling.history_dimensions определяет, какие столбцы заполняются в этом представлении. По умолчанию представление содержит значения для pid, event и queryid, а остальные столбцы содержат NULL.
История ожиданий реализована как кольцевой буфер в памяти, размер которого по умолчанию ограничен 5000 показаниями. Чтобы сохранить историю за больший период времени, вы можете изменить переменную pg_wait_sampling.history_size либо подключить клиентское приложение, которое будет периодически считывать историю ожиданий и сохранять её в локальном хранилище.
Для отслеживания событий ожидания в вашей базе данных в течение длительного времени используйте представление pg_wait_sampling_profile:
SELECT * FROM pg_wait_sampling_profile;
Профиль ожиданий сохраняется как хеш-таблица в памяти, накапливающая показатели по отдельным процессам и по событиям ожидания. Вы можете сбросить профиль ожиданий, вызвав функцию pg_wait_sampling_reset_profile(). Если вы подключите к вашей базе данных клиента, который будет периодически сбрасывать данные событий ожидания и очищать профиль, вы можете сохранять и анализировать концентрацию событий ожидания во времени.
Важно
Так как статистика по событиям ожидания находится в ОЗУ, важно очищать профиль ожиданий время от времени во избежание переполнения памяти.
Если вас не интересует распределение событий ожидания по процессам, вы можете присвоить переменной pg_wait_sampling.profile_pid false. В этом случае значение pid для всех процессов считается равным нулю и показатели ожиданий для всех процессов аккумулируются вместе.
С помощью параметра конфигурации pg_wait_sampling.profile_dimensions можно настроить, какие измерения собираются для выборок событий ожидания в профиле. Например, можно собирать информацию о базе данных, пользователе, адресе клиента, приложении или времени начала сеанса. Полный список возможных измерений приведён в pg_wait_sampling.profile_dimensions.
Помимо представлений, описанных выше, pg_wait_sampling предоставляет агрегированную статистику событий ожидания, сгруппированную по операторам или объектам:
Чтобы просмотреть статистику событий ожидания, сгруппированную по идентификаторам запросов и планов, используйте представление pg_wait_sampling_statements:
SELECT * FROM pg_wait_sampling_statements;
Это представление выдаёт агрегированный профиль событий ожидания для каждой уникальной комбинации queryid и planid. За подробной информацией обратитесь к Подразделу F.66.3.2.4.
Чтобы просмотреть статистику событий ожидания для настраиваемых измерений, таких как база данных, пользователь, адрес клиента или приложение, используйте представление pg_wait_sampling_objects:
SELECT * FROM pg_wait_sampling_objects;
Параметр pg_wait_sampling.profile_dimensions определяет, какие измерения собираются для выборок событий ожидания в этом представлении. За подробной информацией обратитесь к Подразделу F.66.3.2.5.
F.66.3. Справка #
F.66.3.1. Переменные GUC #
Поведение расширения pg_wait_sampling настраивается с помощью переменных GUC, которые хранятся в локальной памяти. Изменить их можно в файле postgresql.conf или при помощи команды ALTER SYSTEM. Чтобы изменения вступили в силу, перезагрузите конфигурацию сервера. Это можно сделать, например, вызвав функцию pg_reload_conf() или выполнив команду pg_ctl reload.
pg_wait_sampling.history_size(int4) #Размер буфера в памяти для истории показаний (максимальное число показаний).
По умолчанию: 5000
pg_wait_sampling.history_period(int4) #Интервал снятия показаний для истории, в миллисекундах.
По умолчанию: 10
pg_wait_sampling.profile_period(int4) #Интервал снятия показаний для профиля, в миллисекундах.
По умолчанию: 10
pg_wait_sampling.profile_pid(bool) #Режим обработки показаний для профиля ожиданий. Если равняется
true, профиль ожиданий собирается по процессам. Если задать дляpg_wait_sampling.profile_pidзначениеfalse, профиль будет собираться по всем процессам сразу. В этом случае значениеpidдля всех процессов принимается равным нулю и соответствующая строка в профиле отражает события ожидания для всех процессов.По умолчанию:
truepg_wait_sampling.profile_queries(enum) #Режим обработки показаний для профиля ожидания. Если для
pg_wait_sampling.profile_queriesустановлено значениеnone, то полеqueryidв представлениях будет равно нулю. Если для него установлено значениеtop, то записываются только идентификаторы сообщений верхнего уровня. Если установлено значениеall, то записываются идентификаторы запросов вложенных сообщений. Чтобы собрать профиль ожидания для каждого запроса, убедитесь, что расширение pg_stat_statements настроено, и установите дляpg_wait_sampling.profile_queriesзначениеtop. Для версии 14 или выше возможно вычислить идентификаторы запросов, настроив параметрcompute_query_idи установив дляpg_wait_sampling.profile_queriesзначениеtopилиall. За подробностями обратитесь к Подразделу 19.9.2.По умолчанию:
toppg_wait_sampling.sample_cpu(bool) #Режим обработки показаний, который определяет, следует ли собирать показания о процессах, обрабатываемых в данный момент процессором. Если для
pg_wait_sampling.sample_cpuустановлено значениеtrue, то выборка также включает процессы, которые ничего не ожидают. Столбцы событий ожидания для таких процессов будут иметь значениеNULL.По умолчанию:
truepg_wait_sampling.history_dimensions(list) #Измерения событий ожидания, сохраняемые в истории, в виде списка значений, разделённых запятыми.
Возможные значения:
pid,event,queryid,planid,database,user,client_addr,session_start,application,all.По умолчанию:
pid, event, queryidpg_wait_sampling.profile_dimensions(list) #Измерения событий ожидания, сохраняемые в профиле, в виде списка значений, разделённых запятыми.
Возможные значения:
pid,event,queryid,planid,database,user,client_addr,session_start,application,all.По умолчанию:
pid, event, queryid
F.66.3.2. Представления pg_wait_sampling #
F.66.3.2.1. Представление pg_wait_sampling_current #
Представление pg_wait_sampling_current содержит информацию о текущих событиях ожидания для всех процессов, включая фоновые рабочие процессы.
Таблица F.51. Представление pg_wait_sampling_current
| Имя столбца | Столбец Тип | Описание |
|---|---|---|
pid | int4 | Идентификатор процесса |
event_type | text | Имя типа события ожидания |
event | text | Имя события ожидания |
queryid | int8 | Идентификатор запроса |
planid | int8 | Идентификатор плана |
dbid | int8 | Идентификатор базы данных |
current_userid | int8 | Идентификатор пользователя |
client_addr | text | Адрес клиента |
session_start | TimestampTz | Время начала сеанса |
app_name | text | Имя приложения |
F.66.3.2.2. Представление pg_wait_sampling_history #
Представление pg_wait_sampling_history содержит историю событий ожидания. Эти данные хранятся в кольцевом буфере в памяти. Какие столбцы содержат значения, отличные от NULL, определяется измерениями, заданными в pg_wait_sampling.history_dimensions.
Таблица F.52. Представление pg_wait_sampling_history
| Имя столбца | Столбец Тип | Описание |
|---|---|---|
pid | int4 | Идентификатор процесса |
event_type | text | Имя типа события ожидания |
event | text | Имя события ожидания |
queryid | int8 | Идентификатор запроса |
planid | int8 | Идентификатор плана |
dbid | int8 | Идентификатор базы данных |
current_userid | int8 | Идентификатор пользователя |
client_addr | text | Адрес клиента |
session_start | TimestampTz | Время начала сеанса |
app_name | text | Имя приложения |
ts | timestamptz | Время снятия показания |
F.66.3.2.3. Представление pg_wait_sampling_profile #
Представление pg_wait_sampling_profile содержит профиль событий ожидания. Эти данные хранятся в виде хеш-таблицы в памяти.
Таблица F.53. Представление pg_wait_sampling_profile
| Имя столбца | Столбец Тип | Описание |
|---|---|---|
pid | int4 | Идентификатор процесса |
event_type | text | Имя типа события ожидания |
event | text | Имя события ожидания |
queryid | int8 | Идентификатор запроса |
planid | int8 | Идентификатор плана |
dbid | int8 | Идентификатор базы данных |
current_userid | int8 | Идентификатор пользователя |
client_addr | text | Адрес клиента |
session_start | TimestampTz | Время начала сеанса |
app_name | text | Имя приложения |
count | int8 | Число наблюдений |
F.66.3.2.4. Представление pg_wait_sampling_statements #
Представление pg_wait_sampling_statements содержит профиль событий ожидания, сгруппированных по идентификаторам операторов (идентификатору запроса и идентификатору плана). Эти данные хранятся в виде хеш-таблицы в памяти.
Таблица F.54. Представление pg_wait_sampling_statements
| Имя столбца | Столбец Тип | Описание |
|---|---|---|
queryid | int8 | Идентификатор запроса |
planid | int8 | Идентификатор плана |
events | jsonb | Сводная статистика событий ожидания |
F.66.3.2.5. Представление pg_wait_sampling_objects #
Представление pg_wait_sampling_objects содержит профиль событий ожидания, сгруппированных по объектам. Параметр pg_wait_sampling.profile_dimensions определяет набор измерений, собираемых для каждой выборки событий ожидания. В зависимости от настроенных измерений, объектами группировки могут быть кластеры, базы данных, пользователи, клиентские адреса, приложения, обслуживающие процессы или время начала сеанса.
Таблица F.55. Представление pg_wait_sampling_objects
| Имя столбца | Столбец Тип | Описание |
|---|---|---|
object_type | text | Тип объекта |
object_id | bigint | Идентификатор объекта |
object_name | text | Имя объекта |
events | jsonb | Сводная статистика событий ожидания |
F.66.3.3. Функции #
pg_wait_sampling_get_current(#pidint4)Возвращает представление
pg_wait_sampling_currentсо списком текущих событий ожидания. Если вы зададите аргументpid, представление будет отфильтровано по процессу с заданным идентификатором.Аргументы:
pid— Необязательный параметр. Идентификатор процесса, для которого будут выводиться текущие события ожидания.
pg_wait_sampling_reset_profile()#Сбрасывает профиль ожиданий и очищает память.
F.66.4. Авторы #
Александр Коротков
Ильдус Курбангалиев
<i.kurbangaliev@gmail.com>