Postgres Pro Enterprise 13
Анализ производительности
13
Авторские права
© Postgres Professional, 2023 год.
Авторы: Алексей Береснев, Илья Баштанов, Павел Толмачев
Использование материалов курса
Некоммерческое использование материалов курса (презентации,
демонстрации) разрешается без ограничений. Коммерческое
использование возможно только с письменного разрешения компании
Postgres Professional. Запрещается внесение изменений в материалы
курса.
Обратная связь
Отзывы, замечания и предложения направляйте по адресу:
Отказ от ответственности
Компания Postgres Professional не несет никакой ответственности за
любые повреждения и убытки, включая потерю дохода, нанесенные
прямым или непрямым, специальным или случайным использованием
материалов курса. Компания Postgres Professional не предоставляет
каких-либо гарантий на материалы курса. Материалы курса
предоставляются на основе принципа «как есть» и компания Postgres
Professional не обязана предоставлять сопровождение, поддержку,
обновления, расширения и изменения.
2
Темы
Расширение pgpro_stats
Агрегированная статистика
Дополнительные метрики
Статистика очистки
Статистика аннулирования кеша
Трассировка сеансов
3
Расширение pgpro_stats
Статистика запросов
Затраченные ресурсы, планы и события ожиданий
Основные настройки
pgpro_stats.max = 5000 предел количества запросов
pgpro_stats.track = top верхний уровень или все (all)
pgpro_stats.query_sample_rate = 1.0 доля запросов
pgpro_stats.enable_profile = true профиль ожиданий
pgpro_stats.profile_period = 10 ms период семплирования
Представление pgpro_stats_statements
Расширение pgpro_stats собирает статистику по выполняемым
операторам. По сравнению с pg_stat_statements добавлен сбор данных
о планах запросов и событиях ожидания для каждого типа запроса.
Расширения pgpro_stats и pg_stat_statements несовместимы.
Доступ к статистике через представление pgpro_stats_statements.
Максимальное число строк в представлении pgpro_stats_statements,
определяет параметр pgpro_stats.max. Значение по умолчанию — 5000.
Параметр pgpro_stats.track определяет, будут ли отслеживаться лишь
только непосредственно выполненные команды SQL (значение top —
по умолчанию), или также и вложенные операторы (значение all).
Для снижения нагрузки можно уменьшить частоту выборки, заданную
параметром pgpro_stats.query_sample_rate. Тогда для вычисления
статистики будет случайно выбираться заданная доля запросов.
Семплинг событий ожидания выполняется с периодичностью раз
в pgpro_stats.profile_period единиц времени (10 мс по умолчанию), если
установлен параметр pgpro_stats.enable_profile.
Статистика ожиданий доступна в поле pgpro_stats_statements.wait_stats
типа jsonb. Все показатели представлены в миллисекундах и кратны
параметру конфигурации pgpro_stats.profile_period.
Также собирается информация о затраченных ресурсах с точки зрения
операционной системы с помощью вызова rusage:
4
Агрегированная статистика
Статистика запросов, агрегированная по объектам
весь кластер, база данных, пользователь, адрес, приложение, процесс
Основные настройки
pgpro_stats.track_totals = on
pgpro_stats.track_cluster, pgpro_stats.track_databases и т. п.
pgpro_stats.max_totals = 1000 предел количества объектов
Представление pgpro_stats_totals
Модуль pgpro_stats позволяет агрегировать статистику запросов по
различным объектам:
cluster — весь кластер баз данных;
database — отдельная база данных;
user — пользователь;
client_addr — адрес клиента;
application — приложение;
backend — обслуживающий процесс;
session — сеанс.
Необходимость агрегации по конкретному типу объекта настраивается
параметрами pgpro_stats.tr ack_cluster, pgpro_stats.track_databases
и т. п.
Агрегированная статистика доступна в представлении
pgpro_stats_totals. Каждая строка в этом представлении содержит
значения по конкретному объекту. Количество объектов, по которым
отслеживается статистика, ограничено параметром
pgpro_stats .max_totals (по умолчанию — 1000). Когда количество
объектов превышает заданное, информация о наименее активно
используемых объектах удаляется.
6
Дополнительные метрики
Произвольные метрики на основе SQL-запросов
собираются фоновыми рабочими процессами
кольцевой буфер
Основные настройки
pgpro_stats.metrics_buffer_size = 16kB
pgpro_stats.metrics_workers = 2
pgpro_stats.metric_N_name имя метрики
pgpro_stats.metric_N_query SQL-запрос
pgpro_stats.metric_N_period = 1 min интервал сбора
pgpro_stats.metric_N_db список баз данных
pgpro_stats.metric_N_user пользователь
Представление pg_stats_metrics
Используя pgpro_stats, можно определить дополнительные метрики.
Собираемые статистические данные будут накапливаться в кольцевом
буфере для последующей передачи их в систему мониторинга.
Это лучше, чем опрос базы данных системой мониторинга, так как
в случае прерывания соединения собранные данные не будут
потеряны, а сохранятся в буфере и могут быть получены позднее
с помощью представления pgpro_stats_metrics.
Для определения дополнительной метрики в конфигурацию СУБД
необходимо поместить соответствующие параметры. Номер N в имени
параметра служит уникальным идентификатором метрики, к которой
будет применяться задаваемое значение; он должен быть
положительным и уникальным среди всех метрик. Параметры:
pgpro_stats.metric_N_nameимя метрики;
pgpro_stats.metric_N_query — запрос для получения метрики;
pgpro_stats.metric_N_period — периодичность измерений;
pgpro_stats.metric_N_db список баз данных;
pgpro_stats.metric_N_userпользователь, от имени которого будет
собираться метрика. Пользователь должен иметь доступ к базе
данных, в которой будет выполняться запрос для сбора метрики.
Обсуждение того, какие именно метрики имеет смысл собирать,
выходит за рамки курса, но порекомендуем книгу Алексея Лесовского
«Мониторинг PostgreSQL»:
8
Статистика очистки
Собирается ядром Postgres Pro Enterprise
Представления
pgpro_stats_vacuum_database — очистка баз данных
pgpro_stats_vacuum_tables — очистка таблиц текущей базы
pgpro_stats_vacuum_indexes — очистка индексов текущей базы
Представления pgpro_stats_vacuum_database,
pgpro_stats_vacuum_tables и pgpro_stats_vacuum_indexes содержат
статистику очистки, соответственно, баз данных, таблиц в текущей базе
данных и индексов в ней. Все эти три представления основаны на
одноименных функциях.
Эти данные собираются ядром Postgres Pro Enterprise как расширение
стандартного сборщика статистики.
Отслеживается подробная информация на уровне страниц
(в количественном и временнóм представлении) и журнальных записей.
10
Аннулирование кешей
Сообщения об аннулировании метаданных измененных
объектов в локальных кешах процессов
Представления
pgpro_stats_inval_status — состояние очереди сообщений
pgpro_stats_statements
pgpro_stats_totals
счетчики сообщений для операторов
Обслуживающие процессы кешируют метаданные объектов в
локальных кешах. При изменении процессом метаданных объекта
нужно обновить информацию в кешах других обслуживающих
процессов. Для этого другим процессам отправляется сообщение
аннулирования (Cache Invalidation), которое помещается в специальную
очередь.
Обслуживающие процессы получают сообщения аннулирования из
этой очереди. Если объект, для которого получено сообщение
аннулирования, находится в кеше, его метаданные в кеше
обновляются.
Когда обслуживающий процесс, добавляющий сообщения в очередь,
сталкивается с пределом размера очереди, он удаляет сообщения, уже
обработанные всеми обслуживающими процессами. Если какие-то
обслуживающие процессы не успевают обрабатывать сообщения
и задерживают очистку, им передается сигнал для сброса кеша.
В pgpro_stats значения большинства счетчиков сообщений
аннулирования увеличиваются при генерации сообщений, а сообщения
попадают в очередь после фиксации транзакции. При откате счетчики
не уменьшаются, хотя сообщения при этом не попадают в очередь.
Представление pgpro_stats_inval_status содержит одну строку
с текущим состоянием очереди аннулирования кеша. Представления
pgpro_stats_statements и pgpro_stats_totals для каждого объекта
показывают запись со счетчиками сообщений аннулирования кеша.
12
Трассировка сеансов
Трассировка сеансов в журнал сообщений или файл
Трассировка выполняется только для команд,
удовлетворяющих критериям фильтрации
pgpro_stats_trace_insert — создает фильтр
pgpro_stats_trace_update — изменяет фильтр
pgpro_stats_trace_delete — удаляет фильтр
pgpro_stats_trace_reset — удаляет все фильтры
pgpro_stats_trace_show — показывает фильтры
Расширение pgpro_stats позволяет выполнять трассировку сеансов,
записывая данные о выполняемых командах в журнал сообщений или
в файлы. Регистрируются команды, которые удовлетворяют фильтрам.
Фильтры размещаются в таблице в общей памяти. Строки таблицы
описывают фильтры, а столбцы содержат условия фильтрации.
Для управления фильтрами расширение pgpro_stats предоставляет
функции, показанные на слайде.
Изменения фильтров сразу влияют на трассировку во всех сеансах
экземпляра СУБД.
Условия фильтров включают:
идентифицирующие поля — проверяются на равенство;
ресурсные поля — проверяются на превышение порога;
поля, определяющие параметры EXPLAIN.
Например, database_name — идентифицирующее поле: сеанс,
в котором выполнена команда, должен быть в указанной базе данных.
Если же в фильтре указано ресурсное поле duration, то команда должна
выполняться более указанной длительности.
Подробности об условиях фильтров в документации:
14
Итоги
Расширение pgpro_stats позволяет выявлять и анализировать
ресурсоемкие операции
Собирается статистика по затраченным ресурсам, планам и
событиям ожиданий
Отдельно собирается агрегированная статистика
Можно использовать метрики, определенные пользователем
Имеется статистика по очистке и аннулированию кешей
Можно трассировать сеансы
15
Практика
1. Подготовьте СУБД для работы с расширением pgpro_stats.
2. Выполните запрос с двухпроходным хеш-соединением
в условиях недостаточной памяти work_mem.
3. Получите отчет pgpro_stats.
4. Выполните этот же запрос в условиях достаточной памяти
work_mem и снова получите отчет.
1. Подключите разделяемые библиотеки pgpro_stats, создайте базу
данных — копию базы данных demo и подключите к ней расширение.
2. Запустите транзакцию с установленными локальными параметрами
work_mem = '12MB' и hash_mem_multiplier = 1. В транзакции получите
реальный план запроса
SELECT *
FROM bookings b
JOIN tickets t ON b.book_ref = t.book_ref
3. Получите отчет pgpro_stats с помощью представления
pgpro_stats_statements, из которого необходимо вывести поля:
query, plan, calls, temp_blks_read, temp_blks_written.
4. Очистите статистику и второй раз запустите транзакцию
с настройками work_mem = '48MB' и hash_mem_multiplier = 3 и снова
получите такой же отчет. Обратите внимание во втором отчете на
отсутствие операций по работе с временными файлами.