- •Предисловие
- •Об этой книге
- •Глава 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.9. Выполнение процедур и функций |
95 |
пути источником данных может быть система мониторинга.Если ограничение еще не достигнуто, проблему можно решить на уровне конфигурации СУБД, увеличив значение pg_stat_statements.max,но это потребует перезапустить сервер.
•stats_reset—отметка времени последнего сброса статистики.Позволяет четко представлять,за какой интервал времени накоплена статистика по запросам.
Пример вывода:
# SELECT |
dealloc, now() - stats_reset AS age FROM pg_stat_statements_info; |
|
dealloc |
| |
age |
--------- |
+ |
------------------------- |
0 |
| 18 days 11:51:27.117115 |
|
Вприведенномпримеревидно,чтосуществующейемкостидостаточноиудалениястатистики не происходило (как минимум за последние 18 дней).
3.9. Выполнение процедур и функций
Для реализации сложной логики при обработке данных можно использовать функции. Такие функции могут быть написаны на SQL и могут объединять в себе несколько запросов. Кроме SQL поддерживаются и такие процедурные языки (procedural language, PL), как PL/pgSQL, PL/Tcl, PL/Perl и PL/Python. Когда в рабочей нагрузке присутствуют запросы с вызовами функций, перед администратором возникает задача поиска медленных функций и их оптимизации. Для простейшего анализа производительности функций СУБД есть представление pg_stat_user_functions,котороесодержитнеобходимыйминимумстатистикиповыполнению функций. Для более детального профилирования функций придется использовать сторонние инструменты.
Основной сценарий использования pg_stat_user_functions — это оптимизация производительности не отдельных запросов, а приложений. С помощью представления можно выявить наиболее горячие функции, которые чаще всего вызываются целевым приложением, и оптимизировать их,тем самым улучшая производительность приложения.
Совместно с pg_stat_user_functions можно использовать и pg_stat_statements. Во втором представленииможнонайтизапросы,вкоторыхвызываетсяфункция,ипоимеющимсяполям получить информацию о времени выполнения и используемых ресурсах.
Для управления сбором статистики выполнения функций в конфигурации есть параметр track_functions, который может принимать одно из следующих значений (для вступления изменений в силу достаточно перезагрузки конфигурации):
•none—выключает отслеживание статистики (значение по умолчанию);
•pl—включает отслеживание только функций на процедурных языках;
•all—включает отслеживание всех функций,включая функции на языках SQL и С.
96Глава 3. Выполнение запросов и функций
Стоитотметить,что SQL-функции,которые встраиваются (inline) в вызываемый запрос,не отслеживаются при любом значении параметра.
Представление pg_stat_user_functions содержит относительно небольшой объем данных:
•funcid—уникальный идентификатор функции;
•schemaname—имя схемы,которой принадлежит функция;
•funcname—имя функции,которое можетбытьнеуникальным внутри схемы,посколькудопускаются перегруженные функции,отличающиеся набором входных параметров;
•calls—общее количество вызовов функции;
•total_time — общее время выполнения функции (в миллисекундах), включая и время выполнения вложенных функций,если таковые имеются;
•self_time—общее время выполнения самой функции (в миллисекундах) без учета времени выполнения вложенных функций.
Какяужеотмечал,основнойсценарийиспользованияэтойстатистики—этоопределениенаи- более часто вызываемых функций и функций, выполнение которых занимает больше всего времени. В тестовой нагрузке на основе стандартного сценария pgbench отсутствуют вызовы функций,поэтому статистики будетнемного и она будетвключатьв себятолько вызовы функций из расширений:
# SELECT * FROM pg_stat_user_functions; |
|
|
|
|
|
|
||||
funcid | |
schemaname | |
funcname |
| calls | |
total_time | self_time |
||||||
-------- |
+ |
------------ |
+ |
------------------------- |
+ |
------- |
+ |
------------ |
+ |
------------ |
16398 |
| |
public |
| |
pg_stat_statements_info |
| |
1 |
| |
0.006 |
| |
0.006 |
16409 |
| |
public |
| |
pg_stat_statements |
| 14751 |
| |
14246.418 |
| |
14246.418 |
|
16416 |
| |
public |
| |
pg_buffercache_pages |
| 28936 |
| |
122401.529 |
| 122401.529 |
||
В этом запросе нетдополнительных условий или сортировок,так как я заранее знаю,что в статистике немного данных. Есть статистика только по трем функциям, принадлежащим двум расширениям: pg_buffercache и pg_stat_statements. Две из них запрашиваются агентом мониторинга, и в поле calls отражается количество вызовов. Время total_time и self_time для обеихфункцийсовпадает,посколькувнихнеиспользуютсявложенныевызовыдругихпользовательских функций.Суммарное время выполнения функций составило примерно 122 и 14 секунд. Функция pg_buffercache_pages вызывается в два раза чаще, однако ее общее время выполнения больше примерно в 8,5 раза,то есть ее выполнение обходится СУБД дороже.
Используя такой подход и сравнивая время выполнения функций, можно находить наиболее долгие.Следующим запросом можно получить статистику из мониторинга:
# increase(postgres_function_total_time_seconds_total{service_id="primary"}[1m])
Резюме 97
Взапросеиспользуетсяincreaseвместоrate.Посколькуэтифункциивызываютсятолькоагентом мониторинга, то очевидно, что вызовы происходят относительно редко, несколько раз в минуту,поэтому с этойточки зрения удобнее видеть,сколько временитратится на выполнениефункцийзаоднуминуту(вместооднойсекунды).Вслучаежепроизводственныхнагрузок, где выполнение функций может происходить чаще и конкурентно в нескольких сеансах, использование rate может быть более предпочтительным.
Нарис.3.8отражаетсято,чтоможнобыловидетьввыводезапросакpg_stat_user_functions,— выполнение функции pg_buffercache_pages занимает бóльшую часть времени:
Рис. 3.8.Функции с наибольшим временем выполнения
В среднем за минуту выполнение этой функции занимает 33 миллисекунды, против 4 милли-
секунд для функции pg_stat_statements.
Резюме
•Запросы являются базовой единицей выполнения рабочей нагрузки.
•Мониторинг запросов обязателен и важен для понимания рабочей нагрузки.
•Для анализа рабочей нагрузки используется расширение pg_stat_statements, которое выключено по умолчанию.
•Представление pg_stat_statements содержитстатистику по планированию и выполнению запросов,утилизации ресурсов,времени ввода-вывода,генерации WAL.
•Представление pg_stat_statements является важным источником данных для графиков мониторинга и отчетов о работе СУБД.
•СУБД предоставляет сквозную идентификацию запросов для анализа статистики из разных источников.
98Глава 3. Выполнение запросов и функций
•Представление pg_stat_statements_info содержит полезную информацию о работе рас-
ширения pg_stat_statements.
•Статистика выполнения пользовательских функций находится в pg_stat_user_functions.
