F.50. pg_wait_sampling

pg_wait_sampling — это расширение Postgres Pro для периодического сбора статистики по событиям ожидания.

Начиная с версии 9.6, Postgres Pro Standard выдаёт информацию о текущих событиях ожидания для определённых процессов. Однако чтобы получить полезную общую статистику активности сервера, необходимо снимать показания по событиям ожидания неоднократно. Расширение pg_wait_sampling автоматизирует снятие показаний по событиям ожидания, запуская специальный рабочий процесс. Когда расширение pg_wait_sampling включено, вы можете получать следующую периодически собираемую информацию:

  • История ожиданий — список событий ожидания для недавних процессов, с отметками времени.

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

  • Текущие события ожидания для всех процессов, включая фоновые рабочие процессы.

Используя pg_wait_sampling, вы можете выявить проблемы зависимостей запросов, выполняющихся дольше чем ожидается. Вы можете видеть процессы в состоянии ожидания в каждый момент времени и проанализировать статистику событий ожидания. Список возможных событий ожидания приведён в Таблице 26.4.

См. также

Просмотр статистики по событиям ожидания

Справка

F.50.1. Установка

Расширение pg_wait_sampling входит в состав Postgres Pro Standard и не имеет особых требований.

Чтобы включить pg_wait_sampling, выполните следующее:

  1. Добавьте pg_wait_sampling в переменную shared_preload_libraries в файле postgresql.conf:

    shared_preload_libraries = 'pg_wait_sampling'
  2. Создайте расширение pg_wait_sampling, выполнив следующий запрос:

    CREATE EXTENSION pg_wait_sampling;
  3. Перезапустите сервер. Так как расширению pg_wait_sampling требуется дополнительная разделяемая память и фоновый рабочий процесс, вы должны перезапустить сервер после добавления или удаления pg_wait_sampling.

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

Если вы хотите остановить сбор статистики, удалите расширение pg_wait_sampling, уберите pg_wait_sampling из переменной shared_preload_libraries и перезагрузите сервер.

F.50.2. Использование

F.50.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, показывающему историю событий ожидания для последних процессов:

SELECT * FROM pg_wait_sampling_history;

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

F.50.3. Справка

F.50.3.1. Переменные GUC

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

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 для всех процессов принимается равным нулю и соответствующая строка в профиле отражает события ожидания для всех процессов.

По умолчанию: true

pg_wait_sampling.profile_queries (bool)

Режим обработки показаний для профиля ожиданий. Если установлено значение false, собирается общий профиль ожиданий для всех запросов. В этом случае значение queryid для каждого запроса устанавливается равным нулю, а соответствующая строка содержит показания по событиям ожидания для всех запросов. Чтобы собирать профиль ожиданий для каждого запроса отдельно, установите для параметра pg_wait_sampling.profile_queries значение true. При этом для вычисления идентификаторов запросов необходимо либо включить параметр compute_query_id, либо загрузить расширение pg_stat_statements.

По умолчанию: true

F.50.3.2. Представления pg_wait_sampling

F.50.3.2.1. Представление pg_wait_sampling_current

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

Таблица F.106. Представление pg_wait_sampling_current

Имя столбцаТип столбцаОписание
pidint4Идентификатор процесса
event_typetextИмя типа события ожидания
eventtextИмя события ожидания
queryidint8Идентификатор запроса

F.50.3.2.2. Представление pg_wait_sampling_history

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

Таблица F.107. Представление pg_wait_sampling_history

Имя столбцаТип столбцаОписание
pidint4Идентификатор процесса
tstimestamptzВремя снятия показания
event_typetextИмя типа события ожидания
eventtextИмя события ожидания
queryidint8Идентификатор запроса

F.50.3.2.3. Представление pg_wait_sampling_profile

Представление pg_wait_sampling_profile содержит профиль событий ожидания. Эти данные хранятся в виде хеш-таблицы в памяти.

Таблица F.108. Представление pg_wait_sampling_profile

Имя столбцаТип столбцаОписание
pidint4Идентификатор процесса
event_typetextИмя типа события ожидания
eventtextИмя события ожидания
queryidint8Идентификатор запроса
countint8Число наблюдений

F.50.3.3. Функции

pg_wait_sampling_get_current(pid int4)

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

Аргументы:

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

pg_wait_sampling_reset_profile()

Сбрасывает профиль ожиданий и очищает память.

F.50.4. Автор

Александр Коротков