- •Предисловие
- •Об этой книге
- •Глава 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
- •Предметный указатель
Глава 8
Очистка
Вэтой главе мы рассмотрим:
•что такое очистка и зачем она нужна;
•живые и мертвые строки;
•фоновый процесс автоочистки;
•при каких условиях и как часто выполняется очистка;
•как посмотреть очередьтаблиц на обработку;
•счетчик транзакций и предотвращение ошибок,связанных с его зацикливанием;
•транзакционный горизонт;
•как определить количество доступных идентификаторов транзакций;
•эффект раздувания;
•как определить,насколько раздулисьтаблицы и индексы;
•способы отслеживания активных процессов очистки.
Впредыдущих главах рассмотрена часть фоновых процессов СУБД,в этой продолжено их рассмотрение. Глава посвящена процессу очистки, более известной как очистка (vacuum). Далее втекстеябудуиспользоватьтермин«очистка»,подразумеваяобаеговарианта,какручной,так и автоматический; в контексте автоматической очистки будет использоваться термин «автоочистка».
Очистка представляет собой реализацию сборщика мусора (garbage collector) и является важной частью СУБД. Ее эффективная работа напрямую влияет на производительность. В этой главе в необходимом объеме будет рассмотрен механизм очистки, аспекты его работы,требующие отслеживания и,конечно же,необходимые для мониторинга инструменты СУБД.
8.1. Введение в очистку
Чтобы обеспечить высокую производительность конкурентной работы клиентов при значи-
тельныхнагрузках,PostgreSQLреализуетмодельMVCC1 (MultiversionConcurrencyControl).Эта модель минимизирует количество блокировок и позволяет читающим процессам не блокировать пишущие,а пишущим—читающие.
1 momjian.us/main/writings/pgsql/mvcc.pdf
196Глава 8. Очистка
При выполнении запросов и транзакций СУБД оперирует снимками (snapshot). Снимок определяетвидимоедлятранзакциисостояниеданныхивключаеттолькозафиксированныенамомент создания снимка изменения, а момент создания выбирается исходя из установленного уровня изоляции (isolation level) транзакций. Конкурентное выполнение транзакций (и запросов)предполагаетсуществованиенесколькихснимков,врамкахкоторыхможетосуществляться не только чтение,но и изменение данных.
Вмодели MVCC PostgreSQL строки не изменяются на месте (in-place); вместо этого различные операции выполняютдействия с версиями строк:
•операция INSERT вставляет первую версию новой строки;
•операция UPDATE вставляетновую версию строки,а предыдущую версию отмечаеткак удаленную;
•операция DELETE отмечает версию строки как удаленную.
Таким образом, для одной и той же строки может существовать несколько версий — одна актуальная,она же живая (live),и,возможно,несколько мертвых (dead).Строки,помеченные как удаленные, продолжают некоторое время храниться в тех же страницах и файлах данных, поскольку все еще могутпотребоватьсядругим активнымтранзакциям (то естьвходятв снимки, используемые этимитранзакциями).В случае высокой активности на запись может появляться все больше и больше версий строк, помеченных удаленными, что сказывается на размерах таблиц и индексов.С постепенным завершениемтранзакций мертвые строки в конечном счете становятся не нужными ни одной изтранзакций,и их можно безопасно удалить,освободив местодля новых строк.Более подробно о работе механизма MVCC можно прочитатьв соответ-
ствующей главе книги The Internals of PostgreSQL1.
Постепенностановясьненужными,мертвыеверсиистрокпродолжаютзаниматьпространство в страницах, что приводит к избыточным операциям ввода-вывода и расходу ресурсов, которого хотелось бы избежать. Так перед СУБД возникает необходимость в удалении устаревших версийстрок,которыебольшеникомуненужны.Этойзадачейизанимаетсяочистка.Вранних версиях PostgreSQL очистка была реализована в виде отдельной команды VACUUM, которую администратор был должен запускать вручную или с помощью внешнего планировщика задач (обычно cron). Помимо очистки, у команды VACUUM есть несколько дополнительных функций: сбор статистики планировщика, полная блокирующая очистка, заморозка строк и др. Больше информации о работе команды очистки можно узнать из документации2. Впоследствии была реализована автоматическая версия очистки в виде фоновых процессов, запускающихся по необходимости.
Первый процесс автоочистки autovacuum launcher поддерживает список баз данных и принимает решение, когда нужно запустить очистку в конкретной базе. Когда в этом возникает необходимость, autovacuum launcher отправляет сигнал головному процессу postmaster, и тот,
1 www.interdb.jp/pg/pgsql05.html
2 postgrespro.ru/docs/postgrespro/15/sql-vacuum
