Перейти к основному содержимому

pg_wait_sampling. Расследование проблем производительности

В исходном дистрибутиве установлено по умолчанию: нет.

Связанные компоненты: отсутствуют.

Схема размещения: не используется.

СУБД Pangolin предоставляет информацию о текущем событии ожидания конкретного процесса. Однако, чтобы собрать описательную статистику поведения сервера, пользователь должен выполнить выборку текущего события ожидания несколько раз. pg_wait_sampling - это расширение для сбора статистики выборки событий ожидания.

При использовании с pg_stat_statements рекомендуется указывать pg_stat_statements перед pg_wait_sampling в shared_preload_libraries, чтобы идентификаторы служебных запросов не переписывались первыми.

Когда расширение активно pg_wait_sampling, оно собирает два вида статистики:

  • Историю событий ожидания. Это реализовано в виде кольцевого буфера в памяти, в который записываются выборки событий ожидания каждого процесса с заданным (настраиваемым) периодом. Таким образом, для каждого запущенного процесса пользователь может видеть некоторое количество последних выборок в зависимости от размера истории (настраиваемого). Предполагается, что есть клиент, который периодически читает эту историю и куда-то ее сбрасывает, пользователь может иметь непрерывную историю.
  • Профиль ожидания. Реализован в виде хеш-таблицы в памяти, где количество выборок накапливается для каждого процесса и каждого события ожидания (и каждого запроса с pg_stat_statements). Эта хеш-таблица может быть сброшена по запросу пользователя. Предполагается, что есть клиент, который периодически удаляет профиль и сбрасывает его, пользователь может получать статистику интенсивности событий ожидания в зависимости от времени.

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

pg_wait_sampling запускает специальный фоновый обработчик для сбора приведенной выше статистики.

Объекты

Представления

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

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

pg_wait_sampling_history — представление, содержащее историю событий ожидания, полученную путем выборки в кольцевой буфер в памяти.

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

pg_wait_sampling_profile — представление, содержащее профиль событий ожидания, полученный путем выборки в хеш-таблицу в памяти.

Название поляТип данныхОписание
pidint4Идентификатор процесса
event_typetextНазвание типа события ожидания
eventtextНазвание события ожидания
queryidint8Идентификатор запроса
counttextКоличество выборок

Функции

Функция pg_wait_sampling_get_current(pid int4) возвращает таблицу с данными из предоставления pg_wait_sampling_current для конкретного процесса.

Функция pg_wait_sampling_reset_profile() сбрасывает профиль.

Конфигурационные параметры

Параметр

Тип данных

Значение по умолчанию

Описание

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

Флаг, указывающий, должен ли профиль быть на основе PID. Если установлен в false, профиль не будет собираться для каждого процесса отдельно. В этом случае значение PID всегда будет равно нулю, а соответствующая строка будет содержать выборки среди всех процессов

pg_wait_sampling.profile_queries

enum

top

Флаг, указывающий, должен ли профиль быть на основе запроса. Если установлен в none, поле queryid в представлениях будет равно нулю. Если установлен в top, записываются только queryId верхнеуровневых операторов. Если установлен в all, записываются queryId вложенных операторов

pg_wait_sampling.sample_cpu

bool

true

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

Значения данных GUC-параметров можно изменять только через файл конфигурации или с помощью команды ALTER SYSTEM. После изменения необходимо перечитать конфигурацию сервера (например, с помощью функции pg_reload_conf), чтобы изменения вступили в силу.

Доработка

Доработка не проводилась.

Ограничения

Ограничения отсутствуют.

Установка

Для начала использования расширения выполните следующие действия:

  1. Пропишите в конфигурационном файле (postgresql.conf/postgres.yml) СУБД Pangolin название расширения в настроечный параметр shared_preload_libraries:

    shared_preload_libraries = 'pg_wait_sampling'
  2. Далее расширение нужно установить в целевую БД командой:

    CREATE EXTENSION pg_wait_sampling;
  3. Выполните перезапуск сервера:

    systemctl restart postgresql

Настройка

Для настройки расширения выполните настройку параметров конфигурации.

Использование модуля

  • Увидеть все текущие ожидания в представлении 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;
  • Для отслеживания ожиданий в базе данных в течение длительного времени используется представление pg_wait_sampling_profile:
SELECT * FROM pg_wait_sampling_profile;
  • Так как статистика по ожиданиям находится в RAM, важно очищать профиль со статистикой время от времени во избежание переполнения памяти.
pg_wait_sampling_reset_profile();

Ссылки на документацию разработчика

Дополнительно поставляемый модуль pg_wait_sampling.