Конфигурация сервера: ключевые параметры

Рейтинг: 62.1% · 15 голосов
Подробный курс по PostgreSQL: SQL по демобазе, типы данных и JSONB, индексы, транзакции и MVCC, VACUUM, EXPLAIN и планировщик, роли и привилегии, репликация, бэкап, настройка под нагрузку и под 1С. Актуально на 2026.
Ответить
Аватара пользователя
Egor_DBA
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Конфигурация сервера: ключевые параметры

Сообщение Egor_DBA »

Оглавление курса (47)
  1. Что такое PostgreSQL: история, философия, где применяется
  2. Урок 1. Что нового в PostgreSQL 15 и далее (15 -> 16 -> 17)
  3. Установка и первый запуск: Linux, Windows, Docker
  4. psql детально: метакоманды и работа в консоли
  5. Демобаза Авиаперевозки Postgres Pro: структура и развёртывание
  6. SELECT: проекция, фильтрация, сортировка
  7. Транзакции и ACID
  8. Уровни изоляции транзакций: Read Committed, Repeatable Read, Serializable
  9. Соединения таблиц (JOIN)
  10. Агрегация: GROUP BY, HAVING, GROUPING SETS
  11. Подзапросы и CTE (WITH), рекурсия
  12. Оконные функции
  13. Изменение данных: INSERT/UPDATE/DELETE, UPSERT, MERGE
  14. Числовые и булевы типы, NULL и трёхзначная логика
  15. Строки, текст, дата и время, таймзоны
  16. Массивы, диапазоны, enum, составные типы
  17. JSON и JSONB: операторы и индексация
  18. DDL: CREATE TABLE, схемы, ALTER
  19. Ограничения целостности
  20. Представления и материализованные представления
  21. Последовательности, IDENTITY, генерируемые столбцы
  22. Индексы: B-tree и когда индекс не используется
  23. Типы индексов: Hash, GiST, SP-GiST, GIN, BRIN
  24. Продвинутые индексы: частичные, по выражению, покрывающие
  25. Обслуживание индексов и таблиц: bloat, REINDEX, CONCURRENTLY
  26. Полнотекстовый поиск
  27. Роли и пользователи
  28. Привилегии: GRANT/REVOKE
  29. Row-Level Security и безопасность данных
  30. Подключение приложения: pg_hba.conf, SSL, пулы соединений
  31. Серверное программирование: функции и процедуры
  32. Триггеры и события
  33. Архитектура PostgreSQL: процессы и память
  34. MVCC: версии строк и видимость
  35. VACUUM, autovacuum, freeze и wraparound
  36. WAL, контрольные точки и долговечность
  37. Блокировки и взаимоблокировки
  38. Планировщик запросов
  39. EXPLAIN и EXPLAIN ANALYZE: чтение планов
  40. Конфигурация сервера: ключевые параметры (вы здесь)
  41. Настройка под нагрузку и под 1С
  42. Параллельные запросы и партиционирование
  43. Резервное копирование и восстановление
  44. Репликация: потоковая и hot standby
  45. Логическая репликация и кластерные решения
  46. Внешние данные, расширения и сертификация
  47. Разбор планов запросов на explain.tensor.ru: глубокое чтение EXPLAIN ANALYZE
Урок 39. Конфигурация сервера: ключевые параметры

Свежеустановленный PostgreSQL запускается с очень осторожными настройками по умолчанию: он рассчитан на то, чтобы стартовать даже на слабой машине. На реальном сервере с десятками гигабайт памяти эти дефолты оставляют половину ресурсов простаивать, а запросы тормозят без видимой причины. В этом уроке разберём, какие параметры в postgresql.conf реально влияют на скорость, как сервер делит память между буферами и сортировками, как работают WAL и контрольные точки, зачем нужен autovacuum и как менять всё это без ручного редактирования файла через ALTER SYSTEM и pg_reload_conf. По сути это базовый тюнинг postgresql, который стоит сделать сразу после установки, в том числе под нагрузку вроде postgresql для 1с.

Изображение

Как это работает

Конфигурация живёт в текстовом файле postgresql.conf. При старте сервер читает его построчно, а затем накладывает сверху файл postgresql.auto.conf, который пишет команда ALTER SYSTEM. Поэтому значение из auto.conf всегда побеждает то, что вы руками вписали в основной файл - это частый источник путаницы.

Параметры делятся на категории по тому, когда они вступают в силу. Часть применяется мгновенно после перечитывания конфига (sighup), часть требует переподключения сессии (user), а самые тяжёлые, вроде размера общих буферов, просят полный перезапуск (postmaster). Узнать категорию можно в системном представлении pg_settings в колонке context.

Память сервер делит на две принципиально разные части. Общая память (shared_buffers) выделяется один раз на весь экземпляр и служит кешем страниц таблиц и индексов: данные сначала читаются с диска сюда, и пока страница тут, повторное обращение идёт без обращения к диску. Локальная память выделяется каждой операции сортировки или хеширования отдельно через work_mem - и вот тут кроется ловушка масштабирования, о которой ниже.

Параметр effective_cache_size память не выделяет вообще. Это подсказка планировщику: сколько примерно гигабайт суммарно кешируют PostgreSQL и операционная система. Чем больше это число, тем охотнее планировщик выбирает индексное чтение вместо полного перебора, потому что верит, что нужные страницы уже в кеше. Похожую роль играет random_page_cost - оценка стоимости случайного чтения относительно последовательного. На SSD случайное чтение почти так же дёшево, как последовательное, поэтому дефолтные 4.0 завышены и мешают использовать индексы.

Запись на диск устроена через журнал WAL. Любое изменение сначала пишется в журнал, и только потом - когда-нибудь - грязные страницы из буферов попадают в файлы данных. Это сбрасывание называется контрольной точкой (checkpoint). Если контрольные точки случаются слишком часто, диск захлёбывается от записи; если редко - восстановление после сбоя затягивается, а сами точки бьют по диску пиками.

Наконец, autovacuum - фоновый процесс, который убирает мёртвые версии строк, оставшиеся после UPDATE и DELETE (это про MVCC и vacuum), и обновляет статистику для планировщика. Без него таблицы пухнут, а планы деградируют.

SQL и примеры

Посмотреть текущее значение и категорию параметра:

Код: Выделить всё

SELECT name, setting, unit, context
FROM pg_settings
WHERE name IN ('shared_buffers','work_mem','random_page_cost');
Колонка context подскажет, понадобится ли перезапуск. Удобная команда в psql - SHOW shared_buffers; для одного значения.

Базовый набор правок через ALTER SYSTEM - он пишет в postgresql.auto.conf, файл руками трогать не надо:

Код: Выделить всё

ALTER SYSTEM SET shared_buffers = '4GB';
ALTER SYSTEM SET effective_cache_size = '12GB';
ALTER SYSTEM SET work_mem = '32MB';
ALTER SYSTEM SET maintenance_work_mem = '512MB';
ALTER SYSTEM SET random_page_cost = 1.1;
ALTER SYSTEM SET max_connections = 100;
Здравые ориентиры для сервера с 16 ГБ ОЗУ: shared_buffers около 25 процентов памяти, effective_cache_size около 60-75 процентов, work_mem поднимаем умеренно, maintenance_work_mem делаем щедрым, потому что от него зависит скорость VACUUM и построения индексов, random_page_cost опускаем до 1.1 для SSD.

Параметры sighup-категории применяются без перезапуска:

Код: Выделить всё

SELECT pg_reload_conf();
Но shared_buffers и max_connections относятся к postmaster - их подхватит только рестарт сервиса.

Настройка контрольных точек, чтобы запись размазалась во времени, а не шла пиками:

Код: Выделить всё

ALTER SYSTEM SET checkpoint_timeout = '15min';
ALTER SYSTEM SET max_wal_size = '4GB';
ALTER SYSTEM SET checkpoint_completion_target = 0.9;
SELECT pg_reload_conf();
Проверим, что effective_cache_size действительно толкает планировщик к индексам. На демобазе Авиаперевозки посчитаем число посадочных талонов на конкретный рейс - тут хочется именно индексное чтение по boarding_passes, а не полный перебор:

Код: Выделить всё

EXPLAIN ANALYZE
SELECT count(*)
FROM boarding_passes
WHERE flight_id = 12345;
Если в плане вы видите Seq Scan на большой таблице там, где есть подходящий индекс, попробуйте снизить random_page_cost и перезапустить explain analyze - часто план меняется на Index Scan.

Полезно подсмотреть, как autovacuum относится к самой нагруженной таблице бронирований:

Код: Выделить всё

SELECT relname, n_live_tup, n_dead_tup, last_autovacuum
FROM pg_stat_user_tables
WHERE relname = 'ticket_flights';
Если n_dead_tup сопоставимо с n_live_tup, autovacuum не успевает - стоит сделать его агрессивнее.

Частые грабли
  • Правка в postgresql.conf не сработала, потому что то же значение раньше выставили через ALTER SYSTEM - auto.conf перекрывает основной файл. Сбросить можно ALTER SYSTEM RESET имя_параметра.
  • work_mem умножается на число операций сортировки и хеша во всех активных запросах. 256MB при 100 соединениях с несколькими сортировками в каждом - это уже десятки гигабайт и риск ухода в своп. Считайте work_mem на операцию, а не на сервер.
  • Поставили shared_buffers и удивляетесь, что не применилось: это postmaster-параметр, нужен полный перезапуск, а не pg_reload_conf.
  • Задрали max_connections до тысяч вместо пула соединений. Каждый бэкенд - отдельный процесс со своей памятью; для многих коротких соединений нужен PgBouncer, а не огромный max_connections.
  • random_page_cost оставили дефолтным 4.0 на SSD - планировщик избегает индексов и валится в полный перебор.
  • Отключили autovacuum, чтобы не мешал нагрузке. Через сутки таблицы распухли, а планы развалились из-за устаревшей статистики. Autovacuum не выключают - его настраивают.
  • effective_cache_size приняли за выделение памяти и испугались большого числа. Это только подсказка планировщику, ни байта он не резервирует.
Мини-лаба
  • Подключитесь psql и выполните SHOW shared_buffers; SHOW work_mem; SHOW random_page_cost; - запишите дефолты.
  • Через SELECT по pg_settings найдите колонку context для shared_buffers и work_mem, отметьте, какому нужен перезапуск.
  • Выполните ALTER SYSTEM SET work_mem = '16MB'; и ALTER SYSTEM SET random_page_cost = 1.1; затем SELECT pg_reload_conf();
  • Проверьте новые значения через SHOW - убедитесь, что work_mem применился без рестарта.
  • На демобазе bookings запустите EXPLAIN ANALYZE для выборки из ticket_flights по одному flight_id и зафиксируйте узел плана (Seq Scan или Index Scan).
  • Выполните ALTER SYSTEM SET shared_buffers = '256MB'; pg_reload_conf и убедитесь, что значение НЕ изменилось без перезапуска - объясните почему.
  • Откатите эксперимент: ALTER SYSTEM RESET ALL; и перечитайте конфиг.
Контрольные вопросы
  • Чем shared_buffers принципиально отличается от work_mem по способу выделения памяти?
  • Почему большое значение work_mem опаснее большого shared_buffers при многих соединениях?
  • Что произойдёт, если задать параметр и в postgresql.conf, и через ALTER SYSTEM с разными значениями?
  • Зачем планировщику effective_cache_size, если этот параметр не выделяет ни байта памяти?
  • Каким параметром снижают random_page_cost на SSD и к чему это приводит в планах запросов?
  • Чем грозит частые контрольные точки и как их размазать во времени?
👍2 ❤️3 🔥 😄 🤔
Аватара пользователя
kotlindev
Сообщения: 1
Зарегистрирован: 28 май 2026, 00:54

Re: Конфигурация сервера: ключевые параметры

Сообщение kotlindev »

А есть простое правило для work_mem? У меня 32 ГБ ОЗУ и max_connections 200, боюсь словить своп если подниму выше дефолта.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
ceph2026
Сообщения: 1
Зарегистрирован: 23 май 2026, 05:24

Re: Конфигурация сервера: ключевые параметры

Сообщение ceph2026 »

Поставил random_page_cost 1.1 на SSD и тот же запрос по ticket_flights в explain analyze переключился с Seq Scan на Index Scan, время упало в разы. Реально работает.
👍 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
EXPLAIN и EXPLAIN ANALYZE: чтение планов
Следующая глава →
Настройка под нагрузку и под 1С

Все главы курса «PostgreSQL: от первого запроса до продакшена»

Поделиться темой: ✈ Telegram VK

Вернуться в «PostgreSQL: от первого запроса до продакшена»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость