F.50. pg_wait_sampling
pg_wait_sampling — это расширение Postgres Pro для периодического сбора статистики по событиям ожидания.
Начиная с версии 9.6, Postgres Pro Enterprise выдаёт информацию о текущих событиях ожидания для определённых процессов. Однако чтобы получить полезную общую статистику активности сервера, необходимо снимать показания по событиям ожидания неоднократно. Расширение pg_wait_sampling автоматизирует снятие показаний по событиям ожидания, запуская специальный рабочий процесс. Когда расширение pg_wait_sampling включено, вы можете получать следующую периодически собираемую информацию:
История ожиданий — список событий ожидания для недавних процессов, с отметками времени.
Профиль ожиданий — количество наблюдавшихся событий ожидания для всех процессов, в разрезе типов событий.
Текущие события ожидания для всех процессов, включая фоновые рабочие процессы.
Используя pg_wait_sampling, вы можете выявить проблемы зависимостей запросов, выполняющихся дольше чем ожидается. Вы можете видеть процессы в состоянии ожидания в каждый момент времени и проанализировать статистику событий ожидания. Список возможных событий ожидания приведён в Таблице 28.4.
См. также
Просмотр статистики по событиям ожидания
F.50.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, выполнив следующий запрос: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.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для всех процессов принимается равным нулю и соответствующая строка в профиле отражает события ожидания для всех процессов.По умолчанию:
truepg_wait_sampling.profile_queries(bool)Режим обработки показаний для профиля ожиданий. Если установлено значение
false, собирается общий профиль ожиданий для всех запросов. В этом случае значениеqueryidдля каждого запроса устанавливается равным нулю, а соответствующая строка содержит показания по событиям ожидания для всех запросов. Чтобы собирать профиль ожиданий для каждого запроса отдельно, загрузите расширение pg_stat_statements и установите для параметраpg_wait_sampling.profile_queriesзначениеtrue.По умолчанию:
true
F.50.3.2. Представления pg_wait_sampling
F.50.3.2.1. Представление pg_wait_sampling_current
Представление pg_wait_sampling_current выдаёт информацию о текущих событиях ожидания для всех процессов, включая фоновые рабочие процессы.
Таблица F.37. Представление pg_wait_sampling_current
| Имя столбца | Тип столбца | Описание |
|---|---|---|
pid | int4 | Идентификатор процесса |
event_type | text | Имя типа события ожидания |
event | text | Имя события ожидания |
queryid | int8 | Идентификатор запроса |
F.50.3.2.2. Представление pg_wait_sampling_history
Представление pg_wait_sampling_history содержит историю событий ожидания. Эти данные хранятся в кольцевом буфере в памяти.
Таблица F.38. Представление pg_wait_sampling_history
| Имя столбца | Тип столбца | Описание |
|---|---|---|
pid | int4 | Идентификатор процесса |
ts | timestamptz | Время снятия показания |
event_type | text | Имя типа события ожидания |
event | text | Имя события ожидания |
queryid | int8 | Идентификатор запроса |
F.50.3.2.3. Представление pg_wait_sampling_profile
Представление pg_wait_sampling_profile содержит профиль событий ожидания. Эти данные хранятся в виде хеш-таблицы в памяти.
Таблица F.39. Представление pg_wait_sampling_profile
| Имя столбца | Тип столбца | Описание |
|---|---|---|
pid | int4 | Идентификатор процесса |
event_type | text | Имя типа события ожидания |
event | text | Имя события ожидания |
queryid | int8 | Идентификатор запроса |
count | int8 | Число наблюдений |
F.50.3.3. Функции
pg_wait_sampling_get_current(pidint4)Возвращает представление
pg_wait_sampling_currentсо списком текущих событий ожидания. Если вы зададите аргументpid, представление будет отфильтровано по процессу с заданным идентификатором.Аргументы:
pid— Необязательный параметр. Идентификатор процесса, для которого будут выводиться текущие события ожидания.
pg_wait_sampling_reset_profile()Сбрасывает профиль ожиданий и очищает память.
F.50.4. Автор
Александр Коротков