Repository navigation
perf(db): close panel database connections after a minute idle - #120
Merged
Merged
Conversation
Что: - Пул postgres.js панели закрывает соединение, которое простояло без запросов 60 секунд (`idle_timeout: 60`). Раньше соединение жило 30–60 минут (`max_lifetime` по умолчанию), даже если запросов не было. - Тест `__test__/db/pool-options.test.ts` проверяет, что пул создаётся с этим параметром. Зачем: - Каждое соединение — отдельный процесс Postgres со своей памятью, 2–10 МБ. Панель почти всё время простаивает, а после любой пачки запросов пул держал до 20 таких процессов. - На изолированном стенде память процессов Postgres после двух минут простоя упала со 107 до 14 МБ, соединений осталось одно вместо двадцати. Риски: - Первый запрос после минуты простоя открывает соединение заново (TCP и вход по SCRAM, единицы миллисекунд) и заново готовит свои запросы. Healthcheck образа раз в 30 секунд держит одно соединение открытым. Проверки: - Команды и результаты: `vitest run __test__/db/pool-options.test.ts` проходит, на коде без правки падает; полный `vitest run`: 4294 прошли, 5 упали в `vector-validate.test.ts` (на Mac Colima не монтирует временную папку `docker run`, без правки так же); `tsc --noEmit` в `apps/dokploy` и `packages/server` без ошибок; `biome check` без замечаний. Стенд: нативные arm64-образы `AgentHits-Dev` в Docker-in-Docker, сценарий из входа, страниц, нагрузки на API, деплоев, логов и терминалов, по 2–3 прогона на вариант вперемешку. - Ограничения: стенд на Mac, а не на сервере; по скорости разница между прогонами одного варианта (±15%) больше, чем между вариантами. What: - The panel's postgres.js pool closes a connection after 60 seconds without queries (`idle_timeout: 60`). Before, a connection lived 30–60 minutes (the default `max_lifetime`) even with no queries. - The test `__test__/db/pool-options.test.ts` checks that the pool is created with this option. Why: - Every connection is a separate Postgres process with its own memory, 2–10 MB. The panel is idle most of the time, yet after any burst of queries the pool kept up to 20 such processes. - On the isolated bench, Postgres process memory after two idle minutes fell from 107 to 14 MB, with one connection left instead of twenty. Risks: - The first query after a minute idle opens a connection again (TCP and SCRAM login, a few milliseconds) and prepares its statements again. The image healthcheck every 30 seconds keeps one connection open. Checks: - Commands and results: `vitest run __test__/db/pool-options.test.ts` passes and fails without the change; full `vitest run`: 4294 passed, 5 failed in `vector-validate.test.ts` (Colima on the Mac does not mount the `docker run` temp folder, same without the change); `tsc --noEmit` in `apps/dokploy` and `packages/server` clean; `biome check` clean. Bench: native arm64 images of `AgentHits-Dev` in Docker-in-Docker, a scenario of sign-in, pages, API load, deploys, logs and terminals, 2–3 interleaved runs per variant. - Limitations: the bench runs on a Mac, not the server; for speed, runs of one variant differ more (±15%) than variants do. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Зачем
Каждое соединение с базой — отдельный процесс Postgres со своей памятью, 2–10 МБ. Пул postgres.js держит открытое соединение 30–60 минут (
max_lifetimeпо умолчанию), даже если запросов нет. Панель почти всё время простаивает, но после любой пачки запросов (открыли список проектов, прошёл деплой) Postgres держал до 20 таких процессов. На рабочей панели в простое было 10 соединений, около 45 МБ памяти Postgres.Что изменилось
packages/server/src/db/index.ts: пул создаётся сidle_timeout: 60. Соединение, которое минуту простояло без запросов, закрывается.apps/dokploy/__test__/db/pool-options.test.tsпроверяет, что пул создаётся с этим параметром.Healthcheck образа раз в 30 секунд держит одно соединение открытым, поэтому в простое остаётся одно соединение. Первый запрос после простоя открывает новое соединение заново: это TCP и вход по SCRAM, единицы миллисекунд.
Проверки
vitestнового теста: проходит, а на коде без правки падает.vitest: 4294 прошли, 5 упали вvector-validate.test.ts. Они падают и без правки: на Mac Colima не монтирует временную папку дляdocker run.tsc --noEmitвapps/dokployиpackages/serverиbiome checkпроходят без ошибок.AgentHits-DevсPGIDLE_TIMEOUT=60и без него. postgres.js читает эту переменную окружения и применяет ту же настройку, что и правка в коде.Скорость API и страниц в прогонах одного варианта гуляет на ±15%: Mac делит процессор с другой работой. Разница между вариантами меньше этого разброса.
Сценарий: вход; пять страниц панели; 10 запросов
project.allподряд; 1000 запросов к API по 10 одновременно и 200 к странице проектов по 5; проект; деплой Compose со сборкой и живым логом; логи и терминал контейнера; деплой из образа; добавление сервера и SSH-терминал.С соседним PR про общий пул соединений эффекты складываются: под нагрузкой 10 соединений и 88 МиБ, после простоя одно соединение и 15 МиБ.
Что проверить вручную на dev
🤖 Generated with Claude Code