- •Предисловие
- •Об этой книге
- •Глава 1. Обзор статистики
- •Внутреннее устройство PostgreSQL
- •Установка соединений и работа сеансов
- •Запросы как базовая единица рабочей нагрузки
- •Планирование и выполнение запросов
- •Ввод-вывод при выполнении запросов
- •Журнал сообщений СУБД
- •Репликация изменений
- •Архивирование журнала предзаписи
- •Фоновая синхронизация данных
- •Автоочистка
- •Интерфейс статистики
- •Статистика как отправная точка инструментов мониторинга
- •Особенности статистики
- •Тестовое окружение
- •Глава 2. Статистика активности
- •Ключ к пониманию происходящего в СУБД
- •Взаимодействие клиента и сервера
- •Источники информации об активности
- •Представление pg_stat_activity
- •Представление pg_locks
- •Особенности pg_stat_activity и pg_locks
- •Представление pg_stat_database
- •Подключенные клиенты
- •Отслеживание клиентских сеансов
- •Транзакционная активность
- •Статусы завершения сеансов
- •Состояния сеансов
- •Отслеживание состояний
- •Ожидания и блокировки
- •Отслеживание состояний с учетом ожиданий
- •Взаимоблокировки
- •Бездействующие транзакции
- •Время выполнения запросов и транзакций
- •Отслеживание времени ожидания блокировок
- •Использование pg_locks.waitstart
- •Использование pg_stat_activity.state_change
- •Дерево блокировок
- •Глава 3. Выполнение запросов и функций
- •Зачем нужен мониторинг запросов
- •Расширение pg_stat_statements
- •Метаданные запроса
- •Планирование запроса
- •Исполнение запроса
- •Сквозная идентификация с queryid
- •Построение отчетов на основе pg_stat_statements
- •Представление pg_stat_statements_info
- •Выполнение процедур и функций
- •Глава 4. Базы данных
- •Иерархия объектов СУБД
- •Кластер баз данных
- •Табличные пространства
- •Базы данных
- •Схемы
- •Таблицы и индексы
- •TOAST
- •События в кластере баз данных
- •Рабочая нагрузка в отношении таблиц и индексов
- •Ошибки и нежелательные события
- •Функции для работы с объектами СУБД
- •Определение размеров объектов СУБД
- •Размещение объектов в файловой системе
- •Глава 5. Область общей памяти и ввод-вывод
- •Анализ общей памяти
- •Представление pg_buffercache
- •Представление pg_shmem_allocations
- •Анализ памяти клиентских процессов
- •Оценка использования SLRU-кешей
- •Ввод-вывод в контексте объектов СУБД
- •Базы данных
- •Ввод-вывод в контексте выполнения запросов
- •Временные файлы
- •Уровень баз данных
- •Ввод-вывод при выполнении запросов
- •Отслеживание в журнале сообщений
- •Отслеживание активных временных файлов
- •Ввод-вывод фоновых процессов
- •Глава 6. Журнал упреждающей записи
- •Отслеживание активности в журнале
- •Представление pg_stat_wal
- •Представление pg_stat_statements
- •Архивирование журнала
- •Представление pg_stat_archiver
- •Очередь архивирования
- •Глава 7. Репликация
- •Обзор репликации
- •Инструменты отслеживания репликации
- •Представление pg_stat_replication
- •Представление pg_stat_wal_receiver
- •Cлоты репликации и pg_replication_slots
- •Публикации и подписки
- •Конфликты восстановления
- •Глава 8. Очистка
- •Введение в очистку
- •Особенности очистки на практике
- •Когда выполняется автоочистка?
- •Статистика выполнения очистки
- •Счетчик транзакций и предотвращение ошибок, связанных с его зацикливанием
- •Раздувание таблиц и индексов
- •Отслеживание активных процессов очистки
- •Представление pg_stat_activity
- •Представление pg_stat_progress_vacuum
- •Глава 9. Ход выполнения операций
- •Представление pg_stat_progress_analyze
- •Представление pg_stat_progress_basebackup
- •Представление pg_stat_progress_cluster
- •Представление pg_stat_progress_create_index
- •Представление pg_stat_progress_copy
- •Предметный указатель
Глава 3
Выполнение запросов и функций
Вэтой главе мы рассмотрим:
•зачем нужен мониторинг запросов;
•расширение pg_stat_statements;
•метаданные запроса;
•статистику планирования и исполнения запросов;
•практические примеры использования pg_stat_statements;
•сквозную идентификацию запросов по всем источникам статистики;
•примеры отчетов на основе pg_stat_statements;
•представление pg_stat_statements_info;
•представление pg_stat_user_functions.
Впредыдущей главе мы рассмотрели клиентские процессы и сеансы, связанную с ними статистикуипримерыееиспользованиядлязадачмониторинга.Далее,вэтойглаве,мызаглянем внутрьклиентскихсеансовирассмотримспособыанализарабочейнагрузки.Запросы,отправляемыеклиентом,определяютрабочуюнагрузку;ееэффективноевыполнениесерверомСУБД определяет общую производительность системы. Статистика СУБД дает администратору возможность рассматривать нагрузку с разных точек зрения и разбирать общий поток рабочей нагрузки на отдельные запросы. Рассматривая запросы по отдельности, мы можем наметить отправные точки их оптимизации, что в итоге положительно скажется на общей производительности СУБД.
3.1. Зачем нужен мониторинг запросов
После установки соединения и настройки сеанса СУБД готова выполнять команды клиента. Посредством команд клиент может запрашивать и изменять данные (DML-команды), управлять объектами схемы (DDL-команды),выполнять служебные операции и т. п.Полный список команд можно найти в официальной документации1. Базовой единицей выполнения в рабочей нагрузке можно считать запросы (queries) — это, как правило, команды на извлечение и изменение данных: SELECT,INSERT,UPDATE,DELETE.
1 postgrespro.ru/docs/postgresql/current/sql-commands.html
72 |
Глава 3. Выполнение запросов и функций |
Команда,оператор,запрос?
Помимо термина запрос, в документации можно встретить термин оператор (statement). Это понятие имеет более широкий смысл: «оператор» охватывает весь диапазон существующих команд, в то время как «запрос» — это подмножество команд, которые возвращают результат или изменяют данные. Далее в этой главе вместо слов «команда» и «оператор» я буду использовать более привычный термин «запрос».
Запросы, их количество и типы, а также участвующие в них объекты БД формируют индивидуальный для каждой СУБД профиль рабочей нагрузки, для выполнения которой требуются ресурсы. Оптимизируя отдельные типы запросов, можно в конечном счете оптимизировать использование ресурсов самой СУБД и добиться существенного увеличения производительности (или сокращения избыточно выделенных ресурсов, которые ранее были необходимы).
Часто на практике приходится быть свидетелем попыток решить проблемы производительности поиском магического параметра в настройках, включение которого ускорит все и сразу. К сожалению,«ускорения»,вызванныетакими параметрами,жертвуютстабильностью или надежностью системы,так что нужно заранее хорошо оценивать риски.Болеетого,таким способом нельзядобиться качественного улучшения производительности итого вау-эффекта (ускорения на порядки), которого можно достичь только с помощью оптимизации запросов. Наиболее правильный путь—это рефакторинг запроса или в простом случае добавление индекса под конкретный тип запроса. Поэтому понимание того, какие запросы выполняются в системе,является ключевым пунктом для будущей оптимизации производительности.
Для оценки профиля рабочей нагрузки и выполняемых запросов используется несколько представлений:
•pg_stat_statements — представление с кумулятивной статистикой по запросам, предоставляемое одноименным расширением;
•pg_stat_user_functions — представление со статистикой выполнения пользовательских функций.
Помимо этих стандартных средств, есть и другие инструменты, которые разрабатываются со-
обществом на основе pg_stat_statements:
•pg_stat_kcache1 — расширение собирает статистику о фактическом использовании системных ресурсов отдельными запросами клиентских процессов. Для учета статистики используется системный вызов getrusage2, и это может накладывать некоторые ограничения на платформы,отличные от Linux;
•pg_stat_monitor3 — расширение позиционируется как дополнение к pg_stat_statements, в котором есть расширенные средства для оценки запросов: агрегация статистики по интервалам,сбор планов,учеттаблиц,участвующих в запросах,и многое другое.
1 github.com/powa-team/pg_stat_kcache
2 man7.org/linux/man-pages/man2/getrusage.2.html
3 github.com/percona/pg_stat_monitor
3.2. Расширение pg_stat_statements |
73 |
Расширения добавляют отдельные представления, которые дополняют функциональность pg_stat_statementsновыми возможностями.Однако я оставлю их рассмотрение в качестведомашнего задания читателю.
3.2. Расширение pg_stat_statements
Представление pg_stat_statements является одним из основных источников статистики по всем запросам, которые выполняются в СУБД. Представление служит интерфейсом к одноименному расширению, которое отслеживает стадии выполнения запросов и хранит накопленную статистику. Расширение сохраняет статистику по всем успешно выполненным запросам. В случаях, когда запрос завершился ошибкой (или был прерван администратором), статистика о нем не будет сохранена, что, пожалуй, можно считать некоторым недостатком при учете ресурсов.
По умолчанию расширение pg_stat_statements выключено, однако рекомендуется всегда его включать.Сделать это можно следующим образом:
1.Указать расширение в параметре shared_preload_libraries,после чего перезапустить сервер. Это необходимо для резервирования места в общей памяти, инициализация которой выполняется только при старте; получить место в уже выделенной общей памяти на лету во время работы СУБД невозможно.
2.После перезапуска СУБД расширение нужно установить в конкретной базе. Для этого подходит любая база: можно использовать базу данных postgres, которая всегда создается по умолчанию. Несмотря на то что расширение устанавливается в конкретную базу, сбор статистики осуществляется глобально для всех запросов независимо от того, в каких базах они работают. Установка выполняется с помощью команды CREATE EXTENSION pg_stat_statements;.
Втестовом окружении расширение pg_stat_statements уже установлено и настроено, поэтому дополнительного ничего делать не нужно. После установки расширения сбор статистики начинается автоматически. Убедиться в этом можно простым запросом к pg_stat_statements с подсчетом количества строк в представлении:
# SELECT count(*) FROM pg_stat_statements; count
-------
113
Наданный моментуже накоплена статистика по 113 типам запросов.Запросы,даже оченьпохожиедругнадруга,могутотличаться значениями параметров.Хранитьв статистике запросы со всеми значениями параметров избыточно—запросы могутсодержатьсотни итысячи параметров и уникальных значений. Поэтому в процессе сбора для каждого запроса выполняется
74Глава 3. Выполнение запросов и функций
нормализация—конкретныепараметрызаменяютсяпронумерованнымизаполнителямивида $1,$2,$3ит.д.Нормализация позволяетотнести запрос к некоторомутипу и учитыватьобъем использованных ресурсов для этого типа.
Вместе с основным представлением устанавливается еще одно — pg_stat_statements_info с метаданными о работе самого расширения; оба представления основаны на одноименных функциях. Вместе с представлениями в составе расширения есть служебная функция pg_stat_statements_reset,предназначенная для сброса накопленной статистики.
Помимо обязательного указания в shared_preload_libraries, расширение имеет несколько параметров конфигурации, которые позволяют подстраивать работу расширения под различные условия эксплуатации СУБД:
•pg_stat_statements.max — максимальное количество типов запросов, отслеживаемых расширением, что соответствует количеству строк в представлении. При регистрации большогоколичествазапросоврежеобновляемаячастьстатистикиможетбытьудалена.Факты удаления можно отследить с помощью pg_stat_statements_info.dealloc. Значение параметра устанавливается только при старте сервера. На практике значения по умолчанию (5000) обычно достаточно, но на производственных серверах с большим разнообразием запросов его имеет смысл сразу увеличивать как минимум вдвое,чтобы избежать перезапуска СУБД в будущем.
•pg_stat_statements.track —уровень отслеживаемых запросов.Возможные значения:
—top—отслеживатьвызовыверхнегоуровня,тоестьзапрошенныеклиентом.Включено по умолчанию;
—all—отслеживать все вызовы,включая вложенные в функции и процедуры;
—none—отключить сбор и хранение статистики.
При наличии хранимых процедур и функций имеет смысл устанавливать значение all, что позволит иметь более детальную статистику о выполняемой рабочей нагрузке.
•pg_stat_statements.track_utility — отслеживать ли статистику для служебных команд, отличных от DML-запросов вроде SELECT, INSERT, UPDATE и DELETE. Если на основе представленияpg_stat_statementsстроятсяотчетыпроизводительности,включениеэтогопараметра позволитполучитьболееполнуюиточнуюкартинуорабочейнагрузке.Новажнопомнить, что отслеживаемые служебные команды также будут занимать место в памяти и может возникнуть риск удаления статистики из-за достижения pg_stat_statements.max.
•pg_stat_statements.track_planning — собирать ли статистику о планировании запросов. Поумолчаниюсборвыключен,таккакможетприводитькснижениюпроизводительности, особенновслучае,когдазапросысодинаковойструктуройвыполняютсямножествомклиентов (что характерно для OLTP-нагрузки), поскольку это вызывает конкуренцию за обновление одних и тех же элементов статистики.
•pg_stat_statements.save — сохранять ли статистику при перезапусках или выключении сервера.По умолчанию включено,и обычно эту настройку можно оставить без изменений.
