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/lessons/pg-lab-17-1-buffer-cache

lesson ── postgres-labs ── ~22 мин ── 5 шагов

Загляни в буферный кеш и поймай попадания

PostgreSQL не читает данные с диска напрямую - он держит страницы в общем буферном кеше. Сейчас ты заглянешь в этот кеш через pg_buffercache, прогреешь таблицу запросом и поймаешь разницу между чтением с диска (read) и попаданием в кеш (hit). Перед каждым шагом предскажи, что покажет счётчик.

▶ интерактивный sandbox

Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.

запустить sandbox →

stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя

Шаги

  1. 01

    Подключи pg_buffercache

    sql
    CREATE EXTENSION IF NOT EXISTS pg_buffercache;

    Это линза для буферного кеша: она показывает каждый занятый буфер - какой странице какого отношения он принадлежит, грязный ли он, какой у него usage_count.

    ✓ Линза подключена — кеш больше не чёрный ящик.

  2. 02

    Прогрей таблицу запросом

    sql
    SELECT count(*) FROM tickets;
    SELECT count(*) AS buffers
    FROM pg_buffercache
    WHERE relfilenode = pg_relation_filenode('tickets');

    Первый запрос поднял страницы tickets в кеш. Предскажи: сколько буферов она теперь занимает - ноль или больше?

    ✓ Страницы таблицы в кеше — буфер занят.

  3. 03

    Поймай попадания в кеш

    sql
    SELECT count(*) FROM tickets;   -- повтор: данные уже в кеше
    SELECT heap_blks_hit, heap_blks_read
    FROM pg_statio_user_tables WHERE relname = 'tickets';

    Повторный запрос идёт из кеша - это попадания (hit), а не чтения с диска (read). Предскажи: какой счётчик будет расти при повторных запросах?

    подсказка

    Статистика обновляется с небольшой задержкой — если hit ещё ноль, повтори SELECT.

    ✓ Попадания в кеш растут — диск не трогаем.

  4. 04

    Сделай буферы грязными и посчитай их

    sql
    UPDATE tickets SET passenger = passenger || '*';
    SELECT buffers_used, buffers_dirty
    FROM pg_buffercache_summary();

    UPDATE изменил страницы в памяти - они стали «грязными» и отличаются от диска. buffers_dirty - сколько таких сейчас. Их потихоньку сбрасывают bgwriter и контрольная точка, так что число живое.

    ✓ Ты видишь грязные буферы — изменения пока только в памяти.

  5. 05

    Посмотри сводку по всему кешу

    sql
    SELECT buffers_used, buffers_unused, buffers_dirty,
           usagecount_avg
    FROM pg_buffercache_summary();

    pg_buffercache_summary (с PostgreSQL 16) отдаёт агрегат одним дешёвым запросом, не сканируя кеш построчно - удобно для мониторинга.

    ✓ Ты снял сводку по всему кешу — видно, сколько буферов в деле.

Что ты узнал

Буферный кеш держит страницы в разделяемой памяти. pg_buffercache показывает занятые буферы, pg_statio_user_tables - попадания и чтения, pg_buffercache_summary - дешёвый агрегат. Повторный запрос идёт из кеша (hit), UPDATE оставляет грязные буферы.

команды

  • SELECT count(*) FROM pg_buffercache WHERE relfilenode = pg_relation_filenode('tickets');буферы конкретной таблицы
  • SELECT heap_blks_hit, heap_blks_read FROM pg_statio_user_tables WHERE relname='tickets';попадания против чтений
  • SELECT * FROM pg_buffercache_summary();дешёвая сводка по кешу (PG16)

концепции

  • · повторный запрос идёт из кеша — это попадание (hit), а не чтение
  • · UPDATE делает буферы грязными — изменения пока только в памяти
  • · pg_buffercache_summary даёт агрегат без построчного скана

← предыдущая

Посмотри глазами autovacuum: пороги и раздувание

следующая →

Понаблюдай за WAL и поймай всплеск FPI после CHECKPOINT

Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки