#buffer-cache-basics
Как устроен буферный кеш и зачем он, если есть кеш файловой системы?
Что отвечать
Буферный кеш - общая для всех бэкендов область в разделяемой памяти, размером `shared_buffers`, нарезанная на слоты по 8 КБ. Любое чтение и запись страницы идёт через него: бэкенд не лезет в файл напрямую, а просит страницу у менеджера буферов. Если страница уже там - попадание, диск не трогается. Кеш ОС тоже есть и работает слоем ниже, но буферный кеш PostgreSQL знает про MVCC, грязные страницы и WAL, поэтому может гарантировать правило журнала предзаписи и не отдавать на диск то, что ещё не зафиксировано в WAL.
Что хотят услышать
Senior должен: - описать кеш как разделяемую память из 8-килобайтных буферов, через которую идут все обращения к страницам - объяснить, зачем свой кеш поверх кеша ОС: контроль грязных страниц и соблюдение правила WAL - понимать двойное кеширование: одна страница может лежать и в `shared_buffers`, и в page cache ОС - дать ориентир по размеру (около четверти ОЗУ как старт) и сказать, почему «больше» не всегда лучше
Подводные камни
- ✗ Ставить `shared_buffers` в почти всю память - кеш ОС тоже нужен, и контрольные точки начнут писать лавиной
- ✗ Думать, что бэкенд читает файл напрямую - всё идёт через менеджер буферов
- ✗ Путать попадание в буферный кеш с попаданием в кеш ОС - это два разных слоя
Follow-up
- ? Почему `shared_buffers` обычно не ставят в 90% памяти?
- ? Как `pg_buffercache` показывает, что сейчас в кеше?
- ? Что такое двойное кеширование и чем оно плохо?
Глубина в базе знаний