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/Эксплуатация и наблюдаемость/memory-config

kb/ops ── Эксплуатация и наблюдаемость ── intermediate

Конфигурация памяти в контексте механизма

Четыре параметра памяти решают разные задачи. shared_buffers - общий кеш страниц на весь кластер. work_mem - лимит на ОДНУ операцию сортировки или хеша в ОДНОМ запросе, и его легко умножить на сотни. maintenance_work_mem - для vacuum и build индекса. effective_cache_size - подсказка планировщику, не аллокация.

view as markdownaka: work-mem

Память настраивают по механизму, а не по рецепту

«Поставь work_mem побольше» - совет без понимания того, как параметр расходуется, и так роняют сервер. Каждый из четырёх параметров живёт в своей подсистеме.

shared_buffers - общий кеш

Один блок разделяемой памяти на весь кластер - это и есть буферный кеш (buffer-cache). Сюда кладутся страницы таблиц и индексов, чтобы не читать их с диска повторно. Выделяется один раз при старте. Типичная отправная точка - около четверти ОЗУ машины; больше не всегда лучше, потому что под кешем работает ещё и страничный кеш ОС.

work_mem - самый коварный

Лимит памяти на одну операцию: сортировку (ORDER BY), хеш-соединение (см. join-algorithms), хеш-агрегацию. Ключевое слово - «одну». В одном запросе таких операций может быть несколько, и каждая берёт до work_mem. Умножь на число параллельных соединений - и получишь реальный аппетит.

пиковый расход ≈ work_mem × (операций в запросе) × (одновременных запросов)

Поэтому work_mem = 1GB на сервере с сотней коннектов - это заявка на OOM, а не оптимизация. Параметр поднимают точечно: глобально скромный, а под конкретный тяжёлый отчёт - SET work_mem в его сессии.

Что происходит при нехватке work_mem

Операция не падает - она «проливается» на диск (temp-файлы). Сортировка становится внешней, хеш разбивается на пакеты. Запрос отработает, но медленно. Сигнал виден в плане (Sort Method: external merge Disk: NNNN kB) и в счётчиках:

sql
SELECT datname, temp_files, pg_size_pretty(temp_bytes) AS temp
FROM pg_stat_database WHERE temp_files > 0;

Растущий temp_files под нагрузкой - прямая подсказка, что work_mem мал для текущих запросов. Включённый log_temp_files = 0 пишет каждый пролив в лог.

maintenance_work_mem - для обслуживания

Отдельный лимит для VACUUM, CREATE INDEX, ALTER TABLE. Этих операций мало и они не параллелятся клиентами, поэтому его ставят заметно выше work_mem: больше памяти - быстрее vacuum собирает мёртвые идентификаторы, быстрее строится индекс.

effective_cache_size - подсказка, не аллокация

Этот параметр ничего не выделяет. Он сообщает планировщику, сколько суммарно памяти под кеш доступно (shared_buffers плюс страничный кеш ОС). По нему планировщик оценивает, насколько вероятно, что нужные страницы уже в памяти, и охотнее выбирает index scan вместо seq scan. Заниженное значение отпугивает планировщик от индексов.

Как находить запросы, которым не хватает work_mem - pg-stat-map. Почему запрос вообще выбрал сортировку и индекс - это уже планировщик и его стоимостная модель (см. cost-model).

§ команды

bash
SHOW work_mem;

Текущий лимит на одну операцию сортировки/хеша

bash
SET work_mem = '64MB';

Поднять лимит только в текущей сессии - под конкретный тяжёлый запрос

bash
SELECT datname, temp_files, temp_bytes FROM pg_stat_database WHERE temp_files > 0;

Проливы на диск из-за нехватки work_mem

bash
SHOW effective_cache_size;

Подсказка планировщику об общем объёме кеша (не аллокация)

§ см. также

  • pg-stat-mapКарта pg_stat_* и pg_stat_statementsСистемные представления pg_stat_* - встроенный мониторинг PostgreSQL. pg_stat_activity показывает, кто что делает прямо сейчас; pg_stat_*_tables и pg_statio_* - накопленную статистику по таблицам; pg_stat_statements - агрегат по нормализованным запросам, главный инструмент поиска медленного SQL.
  • anti-patternsКаталог анти-паттернов (cheat sheet)Набор ошибок, которые компилируются и проходят тесты, но врут на проде. NOT IN с NULL глотает строки. BETWEEN по времени ловит лишнюю границу. COUNT по nullable-колонке считает не то. Целочисленное деление режет дробь. char(n), money и timestamp без TZ создают проблемы на пустом месте.
  • buffer-cacheБуферный кеш и вытеснениеБуферный кеш - разделяемая память (shared_buffers), нарезанная на буферы по 8 КБ. Все бэкенды работают с одним кешем. Когда место кончается, буфер выселяется по приближённому алгоритму clock-sweep (счётчик usage_count), а не по честному LRU.
  • cost-modelСтоимостная модельСтоимость - условные единицы, где последовательное чтение страницы = 1.0. Seq Scan стоит relpages × seq_page_cost + reltuples × cpu_tuple_cost. Планировщик выбирает план с минимальной оценкой, а не «правильный».
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки