F.64. pg_wait_sampling — периодический сбор статистики по событиям ожидания #
pg_wait_sampling — это расширение Postgres Pro для периодического сбора статистики по событиям ожидания.
Начиная с версии 9.6, Postgres Pro Enterprise выдаёт информацию о текущих событиях ожидания для определённых процессов. Однако чтобы получить полезную общую статистику активности сервера, необходимо снимать показания по событиям ожидания неоднократно. Расширение pg_wait_sampling автоматизирует снятие показаний по событиям ожидания, запуская специальный рабочий процесс. Когда расширение pg_wait_sampling включено, вы можете получать следующую периодически собираемую информацию:
- История ожиданий — список событий ожидания для недавних процессов, с отметками времени. 
- Профиль ожиданий — количество наблюдавшихся событий ожидания для всех процессов (в разрезе типов событий). 
- Текущие события ожидания для всех процессов, включая фоновые рабочие процессы. 
Используя pg_wait_sampling, можно выявить проблемы зависимостей для запросов, выполняющихся дольше, чем ожидается. Вы можете видеть процессы в состоянии ожидания в каждый момент времени и анализировать статистику событий ожидания. Список возможных событий ожидания приведён в Таблице 28.4.
В сочетании с pg_stat_statements это расширение может также предоставлять статистику по каждому запросу.
См. также
Просмотр статистики по событиям ожидания
F.64.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.64.2. Использование #
F.64.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.64.3. Справка #
F.64.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для всех процессов принимается равным нулю и соответствующая строка в профиле отражает события ожидания для всех процессов.- По умолчанию: - 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. За подробностями обратитесь к Подразделу 19.9.2.- По умолчанию: - top
- pg_wait_sampling.sample_cpu(- bool)
- Режим обработки показаний, который определяет, следует ли собирать показания о процессах, обрабатываемых в данный момент процессором. Если для - pg_wait_sampling.sample_cpuустановлено значение- true, то выборка также включает процессы, которые ничего не ожидают. Столбцы событий ожидания для таких процессов будут иметь значение- NULL.- По умолчанию: - true
F.64.3.2. Представления pg_wait_sampling #
F.64.3.2.1. Представление pg_wait_sampling_current #
Представление pg_wait_sampling_current выдаёт информацию о текущих событиях ожидания для всех процессов, включая фоновые рабочие процессы.
Таблица F.46. Представление pg_wait_sampling_current
| Имя столбца | Столбец Тип | Описание | 
|---|---|---|
| pid | int4 | Идентификатор процесса | 
| event_type | text | Имя типа события ожидания | 
| event | text | Имя события ожидания | 
| queryid | int8 | Идентификатор запроса | 
F.64.3.2.2. Представление pg_wait_sampling_history #
Представление pg_wait_sampling_history содержит историю событий ожидания. Эти данные хранятся в кольцевом буфере в памяти.
Таблица F.47. Представление pg_wait_sampling_history
| Имя столбца | Столбец Тип | Описание | 
|---|---|---|
| pid | int4 | Идентификатор процесса | 
| ts | timestamptz | Время снятия показания | 
| event_type | text | Имя типа события ожидания | 
| event | text | Имя события ожидания | 
| queryid | int8 | Идентификатор запроса | 
F.64.3.2.3. Представление pg_wait_sampling_profile #
Представление pg_wait_sampling_profile содержит профиль событий ожидания. Эти данные хранятся в виде хеш-таблицы в памяти.
Таблица F.48. Представление pg_wait_sampling_profile
| Имя столбца | Столбец Тип | Описание | 
|---|---|---|
| pid | int4 | Идентификатор процесса | 
| event_type | text | Имя типа события ожидания | 
| event | text | Имя события ожидания | 
| queryid | int8 | Идентификатор запроса | 
| count | int8 | Число наблюдений | 
F.64.3.3. Функции #
- pg_wait_sampling_get_current(- pid- int4)
- Возвращает представление - pg_wait_sampling_currentсо списком текущих событий ожидания. Если вы зададите аргумент- pid, представление будет отфильтровано по процессу с заданным идентификатором.- Аргументы: - pid— Необязательный параметр. Идентификатор процесса, для которого будут выводиться текущие события ожидания.
 
- pg_wait_sampling_reset_profile()
- Сбрасывает профиль ожиданий и очищает память. 
F.64.4. Авторы #
- Александр Коротков 
- Ильдус Курбангалиев - <i.kurbangaliev@gmail.com>