chore(db): Postgres tradein уходит со стоковых настроек — конфиг в compose #3012
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3012
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "chore/2991-postgres-config"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Закрывает блокер переезда #2991. Эпик #2989.
⚠️ Мержить только по команде владельца
Правка
docker-compose.prod.ymlтриггеритdeploy-tradein.yml, а изменениеcommand:пересоздаёт контейнер → рестарт боевого Postgres.shared_buffersиshared_preload_librariesиначе и не применить — они требуют рестарта, SIGHUP не помогает.Ветка готова и ждёт согласованного окна. Сам не мержу.
Что было
Контейнер шёл на полностью стоковой конфигурации: ни
command:, ни смонтированногоpostgresql.conf. Проверено на main — в сервисеpostgresбыли толькоimage,mem_limit,environment,volumes,healthcheck.Замер прода 2026-08-20: 169 млрд
blks_readза 91,75 суток ≈ 175 МБ/с мимо кеша приshared_buffers128 МБ.Поправка к диагнозу из issue
Issue связывает 288 чекпойнтов в сутки с
max_wal_size=1GB. Это не так: 24ч / 288 = ровно 5 минут, то есть дефолтныйcheckpoint_timeout. При WAL 7 ГБ/сутки лимит в 1 ГБ дал бы 7 чекпойнтов, а не 288 — значит связывающим ограничением был таймаут, и правка одного лишьmax_wal_sizeне изменила бы ничего.Поэтому поднят именно
checkpoint_timeoutдо30min: 288 → 48 чекпойнтов в сутки, шестикратно реже. Full-page image пишется на первую запись в страницу после чекпойнта, а FPI сейчас 55–86 % всего объёма WAL — то есть выигрыш идёт напрямую в объём WAL.Значения
Подобраны под текущий сервер, все внутри
mem_limit=3g:shared_bufferseffective_cache_sizework_memmaintenance_work_memlistingsидёт 193 раза в суткиcheckpoint_timeoutmax_wal_sizepg_walрастёт до этого значенияwal_compressionrandom_page_costeffective_io_concurrencyshared_preload_librariesshm_sizeПро mem_limit
Оставлен
3g— акцептанс #2991 прямо говорит подниматьshared_buffersв рамках нынешнего лимита.В комментарии зафиксирована ловушка переезда:
mem_limitподнимать ДО правкиshared_buffers, а не после. Лимит контейнера срабатывает раньшеpostgresql.conf, иshared_buffers=16GBприmem_limit=3gдаёт OOM-kill на старте. Целевое на 64 ГБ — 40–48g, а не 64g: нужен запас под page cache вне контейнера.Порядок применения
Issue настаивает: конфиг правится первым, до любых изменений схемы, иначе эффект спишут на разделение таблиц. Этот PR и есть первый шаг.
Замер до/после (
pg_stat_bgwriter, объёмpg_wal, hit ratio изpg_stat_database) снимается вокруг рестарта — до мержа его сделать негде.Не вошло
synchronous_commit = offчерезALTER ROLEдля скраперной роли — это SQL-миграция и отдельный scope, глобальноsynchronous_commitостаётсяon(в базе платежи).Refs #2991, #2989