chore(db): Postgres tradein уходит со стоковых настроек — конфиг в compose #3012
1 changed files with 64 additions and 0 deletions
|
|
@ -125,6 +125,70 @@ services:
|
||||||
# тяжёлых PostGIS-сортировок бэктеста/эстиматора + autovacuum)
|
# тяжёлых PostGIS-сортировок бэктеста/эстиматора + autovacuum)
|
||||||
mem_limit: 3g
|
mem_limit: 3g
|
||||||
memswap_limit: 3g
|
memswap_limit: 3g
|
||||||
|
# ⚠️ При переезде на выделенный сервер (#2989) mem_limit поднимать ДО правки
|
||||||
|
# shared_buffers, а не после: лимит контейнера срабатывает РАНЬШЕ postgresql.conf,
|
||||||
|
# и shared_buffers=16GB при mem_limit=3g даёт OOM-kill на старте. Целевое на
|
||||||
|
# 64 ГБ — 40-48g, а не 64g: нужен запас под page cache ВНЕ контейнера.
|
||||||
|
shm_size: 512m
|
||||||
|
# /dev/shm по умолчанию 64 МБ. Параллельные воркеры кладут туда shared memory
|
||||||
|
# segments; на тяжёлых PostGIS-сортировках это «could not resize shared memory».
|
||||||
|
#
|
||||||
|
# ── Конфигурация Postgres (#2991) ─────────────────────────────────────────
|
||||||
|
# До этого контейнер шёл на ПОЛНОСТЬЮ стоковых настройках. Замер прода 2026-08-20:
|
||||||
|
# 169 млрд blks_read за 91,75 сут ≈ 175 МБ/с мимо кеша при shared_buffers=128 МБ.
|
||||||
|
#
|
||||||
|
# Значения подобраны под ТЕКУЩИЙ сервер и НЕ выходят за mem_limit=3g.
|
||||||
|
# После переезда пересчитать под 64 ГБ.
|
||||||
|
command:
|
||||||
|
- postgres
|
||||||
|
# Память. 768MB shared_buffers — 6× от стоковых 128MB, с запасом внутри 3g
|
||||||
|
# (idle-замер контейнера был 292 МБ, work_mem-спайки и autovacuum сверху).
|
||||||
|
- -c
|
||||||
|
- shared_buffers=768MB
|
||||||
|
# effective_cache_size — подсказка планировщику, НЕ аллокация. На хосте
|
||||||
|
# MemAvailable 6,1 ГБ, поэтому 6GB честно отражает доступный page cache.
|
||||||
|
- -c
|
||||||
|
- effective_cache_size=6GB
|
||||||
|
- -c
|
||||||
|
- work_mem=16MB
|
||||||
|
# maintenance_work_mem: autovacuum по listings идёт 193 раза в сутки,
|
||||||
|
# с 64MB каждый проход перечитывает индексы лишними итерациями.
|
||||||
|
- -c
|
||||||
|
- maintenance_work_mem=256MB
|
||||||
|
# Чекпойнты. ГЛАВНОЕ: 288 чекпойнтов в сутки — это ровно 24ч/288 = 5 минут,
|
||||||
|
# то есть дефолтный checkpoint_timeout, а НЕ max_wal_size. При WAL 7 ГБ/сут
|
||||||
|
# лимит в 1 ГБ дал бы 7 чекпойнтов, а не 288. Поэтому поднимаем ИМЕННО
|
||||||
|
# timeout — иначе правка max_wal_size ничего бы не изменила.
|
||||||
|
# Реже чекпойнты → реже full-page images (сейчас 55-86% всего объёма WAL).
|
||||||
|
- -c
|
||||||
|
- checkpoint_timeout=30min
|
||||||
|
- -c
|
||||||
|
- checkpoint_completion_target=0.9
|
||||||
|
# max_wal_size=4GB, а не 8GB: на диске сейчас всего 38 ГБ свободно, а pg_wal
|
||||||
|
# растёт до этого значения. При timeout=30min и 7 ГБ/сут между чекпойнтами
|
||||||
|
# накапливается ~0,15 ГБ, так что 4GB — потолок с большим запасом.
|
||||||
|
- -c
|
||||||
|
- max_wal_size=4GB
|
||||||
|
- -c
|
||||||
|
- min_wal_size=1GB
|
||||||
|
# Самая дешёвая победа при доле FPI 55-86%. zstd доступен с PG15, у нас 16.
|
||||||
|
- -c
|
||||||
|
- wal_compression=zstd
|
||||||
|
# Диск NVMe, а стоковый random_page_cost=4 — настройка под HDD: планировщик
|
||||||
|
# систематически недооценивает индексные сканы и уходит в Seq Scan.
|
||||||
|
- -c
|
||||||
|
- random_page_cost=1.1
|
||||||
|
- -c
|
||||||
|
- effective_io_concurrency=200
|
||||||
|
# pg_stat_statements: расширение есть в образе, но не подключено. Без него
|
||||||
|
# следующий разбор снова придётся вести по косвенным признакам.
|
||||||
|
# shared_preload_libraries требует рестарта — поэтому именно здесь.
|
||||||
|
- -c
|
||||||
|
- shared_preload_libraries=pg_stat_statements
|
||||||
|
- -c
|
||||||
|
- pg_stat_statements.max=5000
|
||||||
|
- -c
|
||||||
|
- pg_stat_statements.track=top
|
||||||
logging: *default-logging
|
logging: *default-logging
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_DB: tradein
|
POSTGRES_DB: tradein
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue