Мини-гайд по трём ключевым сущностям PostgreSQL: соединения, буфер и WAL
1. Соединения (Connections)
PostgreSQL по умолчанию позволяет одновременно до 100 соединений (max_connections).
Проблема: слишком много прямых соединений создают нагрузку на память и CPU.
Решение: используйте пуллинг через PgBouncer или Pgpool-II.
Совет: на проде стремитесь держать max_connections < 200 и масштабируйте через пуллер.
2. Буфер (Shared Buffers & Work Mem)
PostgreSQL активно использует память для кэширования страниц и сортировок.
shared_buffers – основной буфер кэша:
work_mem – память на сортировку/слияние одного потока:
Best practice:
Установите shared_buffers ≈ 25% RAM.
Настройте work_mem исходя из числа параллельных операций, не превышайте общий объём памяти.
3. WAL (Write-Ahead Log)
WAL обеспечивает надёжность и репликацию.
wal_level – детальность логирования:
checkpoint_timeout и max_wal_size:
Архивация WAL для резервных копий:
Рекомендации:
Увеличьте max_wal_size, если у вас большие всплески нагрузки.
Настройте сжатие WAL (pg_wal) для экономии места.
1. Соединения (Connections)
PostgreSQL по умолчанию позволяет одновременно до 100 соединений (max_connections).
Проблема: слишком много прямых соединений создают нагрузку на память и CPU.
Решение: используйте пуллинг через PgBouncer или Pgpool-II.
INI:
[databases]
mydb = host=127.0.0.1 port=5432 dbname=mydb
[pgbouncer]
listen_addr = 0.0.0.0
listen_port = 6432
pool_mode = transaction
max_client_conn = 500
default_pool_size = 20
2. Буфер (Shared Buffers & Work Mem)
PostgreSQL активно использует память для кэширования страниц и сортировок.
shared_buffers – основной буфер кэша:
Код:
shared_buffers = 4GB # ≈25% от RAM на выделенном сервере
Код:
work_mem = 64MB # для сложных запросов с сортировками и хэш-джоинами
maintenance_work_mem = 512MB # для VACUUM/CREATE INDEX
Установите shared_buffers ≈ 25% RAM.
Настройте work_mem исходя из числа параллельных операций, не превышайте общий объём памяти.
3. WAL (Write-Ahead Log)
WAL обеспечивает надёжность и репликацию.
wal_level – детальность логирования:
Код:
wal_level = replica # для потоковой репликации
Код:
checkpoint_timeout = 10min
max_wal_size = 1GB
Bash:
archive_mode = on
archive_command = 'cp %p /mnt/backup/wal/%f'
Рекомендации:
Увеличьте max_wal_size, если у вас большие всплески нагрузки.
Настройте сжатие WAL (pg_wal) для экономии места.