F.59. pg_wait_sampling
pg_wait_sampling — это расширение Postgres Pro для периодического сбора статистики по событиям ожидания.
Начиная с версии 9.6, Postgres Pro Enterprise выдаёт информацию о текущих событиях ожидания для определённых процессов. Однако чтобы получить полезную общую статистику активности сервера, необходимо снимать показания по событиям ожидания неоднократно. Расширение pg_wait_sampling автоматизирует снятие показаний по событиям ожидания, запуская специальный рабочий процесс. Когда расширение pg_wait_sampling включено, вы можете получать следующую периодически собираемую информацию:
История ожиданий — список событий ожидания для недавних процессов, с отметками времени.
Профиль ожиданий — количество наблюдавшихся событий ожидания для всех процессов (в разрезе типов событий).
Текущие события ожидания для всех процессов, включая фоновые рабочие процессы.
Используя pg_wait_sampling, можно выявить проблемы зависимостей для запросов, выполняющихся дольше, чем ожидается. Вы можете видеть процессы в состоянии ожидания в каждый момент времени и анализировать статистику событий ожидания. Список возможных событий ожидания приведён в Таблице 27.4.
В сочетании с pg_stat_statements это расширение может также предоставлять статистику по каждому запросу.
См. также
Просмотр статистики по событиям ожидания
F.59.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.59.2. Использование
F.59.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.59.3. Справка
F.59.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.По умолчанию:
true
F.59.3.2. Представления pg_wait_sampling
F.59.3.2.1. Представление pg_wait_sampling_current
Представление pg_wait_sampling_current выдаёт информацию о текущих событиях ожидания для всех процессов, включая фоновые рабочие процессы.
Таблица F.43. Представление pg_wait_sampling_current
| Имя столбца | Столбец Тип | Описание |
|---|---|---|
pid | int4 | Идентификатор процесса |
event_type | text | Имя типа события ожидания |
event | text | Имя события ожидания |
queryid | int8 | Идентификатор запроса |
F.59.3.2.2. Представление pg_wait_sampling_history
Представление pg_wait_sampling_history содержит историю событий ожидания. Эти данные хранятся в кольцевом буфере в памяти.
Таблица F.44. Представление pg_wait_sampling_history
| Имя столбца | Столбец Тип | Описание |
|---|---|---|
pid | int4 | Идентификатор процесса |
ts | timestamptz | Время снятия показания |
event_type | text | Имя типа события ожидания |
event | text | Имя события ожидания |
queryid | int8 | Идентификатор запроса |
F.59.3.2.3. Представление pg_wait_sampling_profile
Представление pg_wait_sampling_profile содержит профиль событий ожидания. Эти данные хранятся в виде хеш-таблицы в памяти.
Таблица F.45. Представление pg_wait_sampling_profile
| Имя столбца | Столбец Тип | Описание |
|---|---|---|
pid | int4 | Идентификатор процесса |
event_type | text | Имя типа события ожидания |
event | text | Имя события ожидания |
queryid | int8 | Идентификатор запроса |
count | int8 | Число наблюдений |
F.59.3.3. Функции
pg_wait_sampling_get_current(pidint4)Возвращает представление
pg_wait_sampling_currentсо списком текущих событий ожидания. Если вы зададите аргументpid, представление будет отфильтровано по процессу с заданным идентификатором.Аргументы:
pid— Необязательный параметр. Идентификатор процесса, для которого будут выводиться текущие события ожидания.
pg_wait_sampling_reset_profile()Сбрасывает профиль ожиданий и очищает память.
F.59.4. Авторы
Александр Коротков
Ильдус Курбангалиев
<i.kurbangaliev@gmail.com>