From 6ab359a1275ac858e236b91f17a234355b746b91 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Mon, 10 Aug 2026 15:30:06 +0500 Subject: [PATCH] =?UTF-8?q?fix(db):=20/dev/shm=20=D0=B1=D0=BE=D0=B5=D0=B2?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20postgres=20=E2=80=94=2064=20=D0=9C=D0=91?= =?UTF-8?q?=20=D1=83=D0=BC=D0=BE=D0=BB=D1=87=D0=B0=D0=BD=D0=B8=D1=8F=20Doc?= =?UTF-8?q?ker=20=D0=BD=D0=B0=201=20=D0=93=D0=B8=D0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Параллельные планы Постгреса размещают DSM-сегменты в /dev/shm (dynamic_shared_memory_type=posix). Контейнеру БД никто не задавал shm_size, поэтому там держалось умолчание Docker — 64 МБ, и запросы Объектива падали с psycopg.errors.DiskFull «could not resize shared memory segment». Текст ошибки называет НЕ тот ресурс: на разделе 28 ГБ свободно, кончался именно /dev/shm. Замеры на проде 2026-08-10 (не рекомендация из интернета): постоянный расход ~9.8 МиБ (DSA кумулятивной статистики pgstat) один параллельный ~15.4 МиБ (3 одновременных → 55.9 МиБ из 64) → 4-й одновременный запрос не влезает; ровно это и наблюдалось (6 отказов за 1.2 с из двух backend-процессов) Нижняя граница: 128 МиБ покрывают лишь ~7-8 одновременных, а потолок celery (--concurrency=8) плюс request-path даёт ~12 → минимум 256 МиБ. Верхняя: /dev/shm это tmpfs, страницы выделяются по факту, поэтому значение — потолок, а не резерв; на хосте 11 ГиБ RAM (свободно ~6), 2 ГиБ я бы не переходил. 1 ГиБ = ~65 таких запросов, ~5x запаса. Локальная проверка A/B (postgres:16, GUC как на проде, различается только --shm-size): 6 одновременных параллельных запросов 64m → 4 отказа, пик 57.3 МиБ (упёрлись в лимит) 1g → 0 отказов, пик 113.3 МиБ (реальный спрос вдвое выше 64 МиБ) Refs #2812 --- docker-compose.prod.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 9e04bd6b..f12276f2 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -78,6 +78,16 @@ services: image: postgis/postgis:16-3.4 logging: *default-logging restart: unless-stopped + # #2812: /dev/shm под dynamic_shared_memory_type=posix. Умолчание Docker — 64 МБ, + # и параллельные планы кладут туда свои DSM-сегменты. Прод-замер 2026-08-10: + # база постоянно держит ~9.8 МиБ (DSA кумулятивной статистики pgstat), один + # параллельный запрос Объектива берёт ~15.4 МиБ → 4-й одновременный не влезает + # в 64 МиБ и падает `DiskFull: could not resize shared memory segment`. Ровно это + # и случилось: 6 отказов за 1.2 с (market_metrics / sales_series / special_indices). + # 1 ГиБ = ~65 таких запросов; потолок celery (--concurrency=8) + request-path ≈ 12. + # tmpfs выделяется ПО ФАКТУ: значение — потолок, не резерв (0 Б до первого запроса). + # Rollback = убрать строку (снова 64 МиБ) + пересоздать контейнер. + shm_size: 1gb environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} -- 2.45.3