- •Предисловие
- •Об этой книге
- •Глава 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
- •Предметный указатель
|
|
|
|
|
|
6.2. Отслеживание активности в журнале |
161 |
-rw------- |
1 |
postgres postgres |
16777216 |
Nov 18 |
06:19 000000010000004B000000FF |
|
|
-rw------- |
1 |
postgres postgres |
16777216 |
Nov 18 |
06:18 |
000000010000004C00000000 |
|
drwx------ |
2 |
postgres postgres |
4096 |
Nov 18 |
06:27 |
archive_status |
|
Запись в журнал может осуществляться как клиентом, так и фоновым процессом walwriter. По умолчанию все изменения в журнал пишутся клиентским процессом. Это может происходить при подтверждении транзакции командой COMMIT или при заполнении WAL-буфера (см. wal_buffers).Такая запись называется синхронной,и, передтем как отправить следующую команду или запрос, клиент вынужден дождаться завершения записи в журнал. Настройки СУБД позволяют переопределить поведение и использовать асинхронное подтверждение транзакций (см. synchronous_commit). В таком режиме запись в журнал делегируется процессу walwriter, который работает в фоновом режиме. Перекладывая задачу записи в журнал на фоновый процесс, клиентские процессы могут не дожидаться завершения записи и сразу отправлять серверу следующую команду. Однако следует помнить, что в таком режиме в случае сбоев есть риск потери последних транзакций,которые еще не были записаны процессом walwriter.Настройкаподтверждениятранзакцийимеетещенесколькорежимов,действующих при использовании репликации. Более подробно с ними можно ознакомиться в документации1.Можно найти и исчерпывающую информацию о работе WAL-журнала2,3.
6.2. Отслеживание активности в журнале
Журнал упреждающей записи является важной частью СУБД, и администратору необходимо иметь представление об активности, связанной с ним. Запись в журнал влияет на продолжительность транзакций, поэтому для хорошей производительности СУБД важно, чтобы запись проходила быстро и без задержек. Может возникнуть и ряд других вопросов: каковы объемы записи в журнал? Сколько времени уходит на запись? Какой объем записи в журнал выполняютте или иные типы запросов?
Для отслеживания активности,связанной с журналом,имеется несколько инструментов:
•pg_waldump и pg_walinspect — инструменты для детального анализа журнала, которые больше подходятдля отладки и поиска проблем или для образовательных целей;
•pg_stat_wal—общая статистика связанной с журналом активности;
•pg_stat_statements — это хорошо зарекомендовавшее себя расширение содержит также статистику,связанную с журналом,по отдельным типам запросов;
•EXPLAIN ANALYZE — средство для вывода плана запроса, которое показывает дополнительную информацию о записи в журнал при указании параметра WAL.
1 postgrespro.ru/docs/postgresql/current/wal-async-commit
2 postgrespro.ru/docs/postgresql/current/wal-configuration
3 www.interdb.jp/pg/pgsql09.html
162Глава 6. Журнал упреждающей записи
С точки зрения регулярного мониторинга особенно интересны представления pg_stat_wal и pg_stat_statements,поэтому рассмотрим их более подробно.
Представление pg_stat_wal
Представление pg_stat_wal содержит всего одну строку:
# TABLE pg_stat_wal;
-[ RECORD 1 ]---- |
+------------------------------ |
wal_records |
| 322508636 |
wal_fpi |
| 46090986 |
wal_bytes |
| 393680012729 |
wal_buffers_full |
| 15545 |
wal_write |
| 48958771 |
wal_sync |
| 48846599 |
wal_write_time |
| 5697276.907 |
wal_sync_time |
| 486414839.104 |
stats_reset |
| 2022-11-04 05:01:49.427562+00 |
Статистика носит накопительный характер и включает следующую информацию:
•wal_records—общее количество записей,отправленных в журнал;
•wal_fpi—общее количество записанных FPI-страниц (full page image);
•wal_bytes—общий объем данных,записанный в журнал,в байтах;
•wal_buffers_full — общее количество раз, когда данные в журнал были записаны из-за заполнения WAL-буфера;
•wal_write—количество операций ввода-вывода для записи данных из WAL-буфера;
•wal_sync — количество запросов на синхронизацию WAL-сегментов с основным хранилищем;
•wal_write_time—время,затраченное на запись содержимого WAL-буфера в основное хранилище,в миллисекундах.Можетвключать в себя время,затраченное на синхронизацию, если параметр wal_sync_method установлен в open_datasync или open_sync;
•wal_sync_time—время,затраченное на синхронизацию сегментов в основное хранилище, в миллисекундах;
•stats_reset—отметка времени сброса статистики.
Статистика по времени отслеживается только при включенном параметре track_wal_io_timing. На основеданных представления можно отслеживатьактивность,связанную с журналом,объ- емыипродолжительностьзаписиифакты,указывающиенанехваткуместавWAL-буфере,что может послужить поводом к пересмотру настройки параметра wal_buffers.
На основе метрик по этой статистике можно построить графики общей WAL-активности на уровне экземпляра СУБД.
6.2. Отслеживание активности в журнале |
163 |
На рис. 6.1 изображен график с количеством обычных записей и FPI-страниц, попадающих в журнал.Можно отметить,что объем записи в журнал стабильный,без значительных всплесков. Также можно отметить постоянный и пилообразный поток записи FPI-страниц. Продолжительность пиков укладывается в пятиминутный интервал, что соответствует значению checkpoint_timeout по умолчанию.Выполнение принудительных контрольныхточек визуально никак не сказывается на объеме записи FPI-страниц, и на графике это остается незаметным.
Рис. 6.1.Количество обычных записей и FPI-страниц в журнале
На рис. 6.2 изображен график объема записи в журнал в байтах, и здесь нагрузка также умеренно ровная. Но, если присмотреться, этот график, так же как и предыдущий, напоминает пилу с пятиминутными интервалами. Подобный график можно использовать для визуализации объема записи в журнал.
Рис. 6.2.Объем записи в журнал в байтах
164Глава 6. Журнал упреждающей записи
График на рис. 6.3 показывает количество операций записи данных из буфера в журнал
ипоследующих синхронизаций сегментов. В левой части графика количество операций записи совпадает с количеством синхронизаций. Это связано с тем, что запись и последующая синхронизация происходят при завершении каждой транзакции. Рядом показано количество подтвержденных транзакций (синяя линия commits), практически совпадающее с остальными метриками. Дальше, в правой части графика, при неизменном потоке транзакций количество синхронизаций сегментов сильно уменьшилось и затем через какое-то время вернулось на прежний уровень. Количество операций записи тоже уменьшилось, хотя
ине так сильно.В этот период был включен режим асинхронного подтверждения транзакций (synchronous_commit =off).В этом режиме задачи по записи в журнал и синхронизации сегментов перекладываются на процесс walwriter,который делает это согласно своим настройкам.
Важной информацией является и время,затраченное на запись и синхронизацию (рис. 6.4).
Рис. 6.3.Количество операций записи из WAL-буфера,синхронизаций сегментов и подтвержденных транзакций
Рис. 6.4.Время,затраченное на запись в журнал и синхронизацию сегментов
