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-cache

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

Буферный кеш и вытеснение

Буферный кеш - разделяемая память (shared_buffers), нарезанная на буферы по 8 КБ. Все бэкенды работают с одним кешем. Когда место кончается, буфер выселяется по приближённому алгоритму clock-sweep (счётчик usage_count), а не по честному LRU.

view as markdownaka: shared-buffers, buffer-pool, clock-sweep

Устройство

Буферный кеш - область разделяемой памяти размером shared_buffers, нарезанная на слоты по 8 КБ (страница). PostgreSQL никогда не работает с данными на диске напрямую: страница сначала поднимается в буфер, дальше чтение и изменение идут в памяти. Все процессы видят один кеш - если страницу поднял один бэкенд, остальные найдут её там же.

Clock-sweep вместо LRU

Когда нужен новый буфер, а все заняты, кого-то выселяют. Честный LRU дорого поддерживать под конкуренцией, поэтому используется приближённый clock-sweep:

  • у каждого буфера есть счётчик usage_count, растущий при обращении;
  • «стрелка» ходит по буферам по кругу;
  • если usage_count > 0 - уменьшает его и идёт дальше;
  • если usage_count = 0 и буфер не «прибит» (pinned) - выселяет его.

Часто используемые страницы переживают много кругов, одноразовые быстро вылетают. Грязный буфер перед выселением записывается на диск.

Кто пишет грязные буферы

  • bgwriter - заранее, фоном, чтобы бэкендам было куда селить страницы;
  • checkpointer - все грязные буферы в контрольной точке (см. checkpoint);
  • сам бэкенд - если нет свободных буферов; тормозит запрос, плохой признак.

Заглянуть в кеш

sql
CREATE EXTENSION IF NOT EXISTS pg_buffercache;
SELECT count(*), count(*) FILTER (WHERE isdirty) AS dirty
FROM pg_buffercache
WHERE relfilenode = pg_relation_filenode('flights');

pg_buffercache показывает каждый буфер; pg_buffercache_summary (PG16) отдаёт дешёвый агрегат без построчного скана. Состояния обращения разбирает buffer-states, а кольцо для больших сканов - buffer-ring.

§ команды

bash
SELECT * FROM pg_buffercache_summary();

Сводка по кешу: занято, грязных, средний usage_count (PG16)

bash
SELECT count(*) FROM pg_buffercache WHERE relfilenode = pg_relation_filenode('flights');

Сколько буферов занимает конкретная таблица

bash
SHOW shared_buffers;

Размер буферного кеша

§ см. также

  • buffer-statesЧетыре состояния буфераЛюбое обращение к данным сводится к одному из четырёх исходов: hit (страница в кеше), read (промах, чтение с диска), dirtied (изменён в памяти), written (сброшен на диск). Соотношение hit к read показывает эффективность кеша; в PG16 их детально считает pg_stat_io.
  • buffer-ringБуферное кольцо для seq scanБольшой последовательный скан или VACUUM не используют весь кеш, а крутят данные через маленькое буферное кольцо в несколько сотен КБ - иначе один отчёт вымыл бы весь кеш. Кольцо включается, когда таблица больше четверти shared_buffers.
  • checkpointКонтрольные точки и восстановлениеКонтрольная точка сбрасывает все грязные буферы на диск и фиксирует redo point - позицию журнала, с которой начнётся восстановление. Crash recovery проигрывает WAL от redo point вперёд; незакоммиченные транзакции откатываются через clog. Запускается по checkpoint_timeout / max_wal_size.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки