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
, выполните следующее:
Добавьте
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.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.106. Представление 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.107. Представление 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.108. Представление pg_wait_sampling_profile
Имя столбца | Тип столбца | Описание |
---|---|---|
pid | int4 | Идентификатор процесса |
event_type | text | Имя типа события ожидания |
event | text | Имя события ожидания |
queryid | int8 | Идентификатор запроса |
count | int8 | Число наблюдений |
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. Авторы
Александр Коротков
Ильдус Курбангалиев
<i.kurbangaliev@gmail.com>