Найти в Дзене
Postgres DBA

План экспериментов - увеличение shared_buffers для HighLoad

Какое максимальное значение для shared_buffers для СУБД PostgreSQL можно установить для базы данных размером 10TB , размером памяти 1TB и значением параметра max_connections = 6000 для нагрузки генерируемой pgbench при равномерном росте нагрузки начиная с 5 до 1000 одновременных сессий ? Для определения максимального значения shared_buffers в PostgreSQL на системе с 1 ТБ RAM, базой данных 10 ТБ и max_connections = 6000 (при нагрузке до 1000 активных сессий) необходимо учесть следующие факторы: 1024 ГБ - 20 ГБ (сессии) - 300 ГБ (page cache) = 704 ГБ. shared_buffers = 400GB Вывод: Максимальное значение shared_buffers без ущерба для стабильности — 400 ГБ. Это обеспечит баланс между буферизацией PostgreSQL и кэшированием в ОС для нагрузки до 1000 сессий. ⚠️max_connections = 1100 (нагрузка до 1000 соединений + 100 резерв) Настройка Linux
Оглавление

Начало

Вопрос нейросети DeepSeek

Какое максимальное значение для shared_buffers для СУБД PostgreSQL можно установить для базы данных размером 10TB , размером памяти 1TB и значением параметра max_connections = 6000 для нагрузки генерируемой pgbench при равномерном росте нагрузки начиная с 5 до 1000 одновременных сессий ?

Ответ нейросети

Для определения максимального значения shared_buffers в PostgreSQL на системе с 1 ТБ RAM, базой данных 10 ТБ и max_connections = 6000 (при нагрузке до 1000 активных сессий) необходимо учесть следующие факторы:

Ключевые рекомендации:

  1. Общий объем RAM: 1 ТБ (1024 ГБ).
  2. Требования к памяти для соединений:
  3. Каждое соединение потребляет память под служебные структуры (автономно от shared_buffers). Ориентировочно:
  4. 2–4 МБ на соединение для фоновых процессов и состояний сессий.
  5. При 1000 активных сессий: 1000 × 4 МБ = 4 ГБ.
  6. Дополнительно требуется память под work_mem (для сортировок, хешей) и maintenance_work_mem (для VACUUM, индексов). При агрессивных настройках это может достигать сотен ГБ.
  7. Роль page cache ОС:
  8. PostgreSQL активно использует кэш ОС для данных, не попавших в shared_buffers. Особенно критично для БД 10 ТБ (превышает RAM в 10 раз).
  9. Минимально рекомендуемый резерв под page cache: 30–40% от RAM (300–400 ГБ).
  10. Практические ограничения для shared_buffers:
  11. Более 40% RAM может снизить эффективность page cache и вызвать contention в буферном менеджере.
  12. Для гигантских RAM (>512 ГБ) типичный максимум — ~40% (около 400 ГБ).

Расчёт:

  • Доступная RAM: 1024 ГБ.
  • Резерв под соединения и процессы:
  • 1000 сессий × 4 МБ = 4 ГБ.
  • work_mem (при 10 МБ на сессию): 1000 × 10 МБ = 10 ГБ.
  • maintenance_work_mem (нагрузка pgbench): 1–2 ГБ.
  • Итого: ~15–20 ГБ.
  • Резерв под page cache: минимум 300 ГБ (для эффективной работы с БД 10 ТБ).
  • Максимум для shared_buffers:
1024 ГБ - 20 ГБ (сессии) - 300 ГБ (page cache) = 704 ГБ.
  • Однако это теоретический предел. На практике значение выше 400 ГБ редко даёт выгоду из-за:
  • Уменьшения page cache.
  • Роста накладных расходов на управление буферами.

Рекомендуемое значение:

  • Оптимальный диапазон: 256–384 ГБ (25–37.5% RAM).
  • Максимальное безопасное значение: 400 ГБ (39% RAM).

Почему 400 ГБ?

  • Оставляет 624 ГБ под:
  • Page cache: >400 ГБ (достаточно для кэширования "горячих" данных).
  • Память сессий: даже при work_mem=64 МБ на 1000 сессий: 64 ГБ.
  • Процессы ОС и резерв.
  • Для pgbench (OLTP-нагрузка) такое значение обеспечит:
  • Быстрый доступ к часто используемым страницам (таблицы branches, tellers).
  • Минимизацию чтений с диска.

Настройка в postgresql.conf:

shared_buffers = 400GB

Важные дополнения:

  1. Тестирование: Запустите pgbench с постепенным ростом сессий (5 → 1000), мониторя:
  2. Hit ratio в pg_stat_bgwriter.
  3. Использование RAM (через free -h, top).
  4. Latency транзакций.
  5. Параметры-компаньоны:
  6. work_mem = 4–64 MB (начинайте с малого).
  7. maintenance_work_mem = 2GB.
  8. effective_cache_size = 900GB (оценка RAM для оптимизатора).
  9. ОС: Убедитесь, что:
  10. vm.overcommit_memory = 2 (Linux).
  11. kernel.shmall и kernel.shmmax настроены под 400 ГБ.

Вывод: Максимальное значение shared_buffers без ущерба для стабильности — 400 ГБ. Это обеспечит баланс между буферизацией PostgreSQL и кэшированием в ОС для нагрузки до 1000 сессий.

Планируемые эксперименты

⚠️max_connections = 1100 (нагрузка до 1000 соединений + 100 резерв)

Настройка Linux

  1. shared_buffers = 40% RAM
  2. shared_buffers = 50% RAM
  3. shared_buffers = 60% RAM