linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/kb/Буферный кеш и WAL/buffer-ring

kb/buffers-wal ── Буферный кеш и WAL ── advanced

Буферное кольцо для seq scan

Большой последовательный скан или VACUUM не используют весь кеш, а крутят данные через маленькое буферное кольцо в несколько сотен КБ - иначе один отчёт вымыл бы весь кеш. Кольцо включается, когда таблица больше четверти shared_buffers.

view as markdownaka: ring-buffer, bulk-read-ring, synchronize-seqscans

Зачем

Представьте SELECT count(*) по таблице в десятки гигабайт. Читай он страницы в обычном порядке через весь кеш - вытеснил бы оттуда всё полезное, набив одноразовыми данными, которые после прохода не нужны. Один отчёт - и кеш холодный для всех.

Как устроено

Чтобы этого не было, большие последовательные сканы используют не весь кеш, а маленькое буферное кольцо (ring buffer) - фиксированный небольшой набор буферов, который переиспользуется по кругу. Прочитал страницу, обработал, в том же кольце читаешь следующую. Основной кеш не трогается.

Кольца разного размера у разных операций:

  • большое последовательное чтение (bulk read) - порядка 256 КБ;
  • VACUUM (см. vacuum) - своё кольцо (в PG16+ настраивается через vacuum_buffer_usage_limit);
  • массовая запись (COPY, bulk write) - больше, порядка 16 МБ.

Кольцо для чтения включается, когда таблица больше четверти shared_buffers.

Практическое следствие

Большой отчёт может быть медленным каждый раз - его данные намеренно не оседают в кеше, чтобы не вымыть полезное. Это не баг, а защита кеша.

Объединение сканов

Если две сессии одновременно последовательно сканируют одну большую таблицу, PostgreSQL может пристроить вторую к идущему скану первой - они читают страницы с одной позиции «паровозиком», один проход по диску обслуживает оба. Управляется параметром synchronize_seqscans.

Кольцо - часть логики buffer-cache; на состояниях буфера (см. buffer-states) это видно как стабильно высокий read даже после «прогрева».

§ команды

bash
SHOW shared_buffers;

Порог кольца — таблица больше четверти этого размера сканируется кольцом

bash
SET vacuum_buffer_usage_limit = '2MB';

Размер буферного кольца для VACUUM (PG16+)

§ см. также

  • buffer-cacheБуферный кеш и вытеснениеБуферный кеш - разделяемая память (shared_buffers), нарезанная на буферы по 8 КБ. Все бэкенды работают с одним кешем. Когда место кончается, буфер выселяется по приближённому алгоритму clock-sweep (счётчик usage_count), а не по честному LRU.
  • buffer-statesЧетыре состояния буфераЛюбое обращение к данным сводится к одному из четырёх исходов: hit (страница в кеше), read (промах, чтение с диска), dirtied (изменён в памяти), written (сброшен на диск). Соотношение hit к read показывает эффективность кеша; в PG16 их детально считает pg_stat_io.
  • walWAL: принцип write-ahead и LSNWAL - последовательный журнал изменений. Правило write-ahead: запись об изменении попадает на диск раньше самой страницы данных, поэтому сбой не теряет подтверждённые данные. LSN - смещение в потоке журнала. COMMIT при synchronous_commit=on ждёт сброса журнала на диск.
  • vacuumVACUUM и removable cutoffVACUUM удаляет мёртвые версии из таблицы и индексов, обновляет Free Space Map и Visibility Map, продвигает горизонт заморозки. Удаляет только версии старше removable cutoff. Обычный VACUUM не уменьшает файл - это делает VACUUM FULL под эксклюзивной блокировкой.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки