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.

В сочетании с pg_stat_statements это расширение может также предоставлять статистику по каждому запросу.

См. также

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

Справка

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'

    Важно

    При использовании pg_wait_sampling с расширением pg_stat_statements поместите pg_stat_statements перед pg_wait_sampling в переменной shared_preload_libraries. Это гарантирует, что расширение pg_stat_statements не перезапишет идентификаторы запросов, которые используются 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 (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. За подробностями обратитесь к Подраздел 18.9.2.

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

pg_wait_sampling.sample_cpu (bool)

Режим обработки показаний, который определяет, следует ли собирать показания о процессах, обрабатываемых в данный момент процессором. Если для pg_wait_sampling.sample_cpu установлено значение true, то выборка также включает процессы, которые ничего не ожидают. Столбцы событий ожидания для таких процессов будут иметь значение NULL.

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

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

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

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

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

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

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

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

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

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

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

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

Таблица F.34. Представление 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. Авторы #