From c8ce91042e40b38162f47c77db273a90059016d0 Mon Sep 17 00:00:00 2001 From: merge-check <140916359+agentHits@users.noreply.github.com> Date: Wed, 28 Oct 2026 14:16:48 -0400 Subject: [PATCH] perf(image): cap the panel's Node young generation at 16 MB semi-spaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Что: - В образе панели `ENV NODE_OPTIONS=--max-semi-space-size=16`. Полупространство молодого поколения кучи V8 ограничено 16 МБ, молодое поколение под нагрузкой растёт до 32 МБ вместо ~60. Зачем: - Node 26 выбирает размер молодого поколения по RAM хоста. На сервере с 4 ГБ оно под нагрузкой растёт до ~60 МБ, а короткоживущий мусор запросов панели помещается в меньший объём. - На изолированном стенде пик памяти сервера панели под нагрузкой ниже на 19–22 МБ (около 4%), скорость и процессорное время не изменились. Риски: - Сборки молодого поколения идут чаще; на стенде это не видно ни по процессорному времени, ни по скорости. В простое V8 и без флага сжимает молодое поколение, поэтому память в простое не меняется. - `NODE_OPTIONS`, заданный у сервиса, заменяет значение из образа. Проверки: - Команды и результаты: на сервере с 4 ГБ `node -e` в контейнере панели: молодое поколение без флага 59 МБ, с `--max-semi-space-size=16` 32 МБ. Стенд: нативный arm64-образ `AgentHits-Dev` в Docker-in-Docker с `NODE_OPTIONS` и без него, лимит памяти сервиса 3915 МБ как на сервере; три прохода сценария по 3 прогона и отдельная проверка скорости из 4 пар прогонов вперемешку. - Ограничения: стенд на Mac, а не на сервере; образ этой ветки целиком не собирался, флаг проверен переменной окружения на образе базовой ветки. What: - The panel image sets `ENV NODE_OPTIONS=--max-semi-space-size=16`. The V8 young-generation semi-space is capped at 16 MB, so under load the young generation grows to 32 MB instead of ~60. Why: - Node 26 sizes the young generation from the host's RAM. On a 4 GB server it grows to ~60 MB under load, while the panel's short-lived request garbage fits in less. - On the isolated bench, the panel server's peak memory under load is 19–22 MB lower (about 4%), with unchanged speed and CPU time. Risks: - Young-generation collections run more often; the bench shows no difference in CPU time or speed. When idle, V8 shrinks the young generation even without the flag, so idle memory does not change. - A `NODE_OPTIONS` set on the service replaces the image value. Checks: - Commands and results: on a 4 GB server, `node -e` in the panel container: young generation 59 MB without the flag, 32 MB with `--max-semi-space-size=16`. Bench: a native arm64 `AgentHits-Dev` image in Docker-in-Docker with and without `NODE_OPTIONS`, service memory limit 3915 MB as on the server; three scenario passes of 3 runs and a separate speed check of 4 interleaved run pairs. - Limitations: the bench runs on a Mac, not the server; the image of this branch was not built as a whole, the flag was checked through the environment variable on the base branch image. Co-Authored-By: Claude Opus 5.5 --- Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Dockerfile b/Dockerfile index 52ea42ac3d3..b51ad69be32 100644 --- a/Dockerfile +++ b/Dockerfile @@ -64,6 +64,10 @@ ARG DOKPLOY_FORK_VERSION=off_v0.29.8/Fork_local ENV NODE_ENV=production ENV DOKPLOY_OFFICIAL_VERSION=$DOKPLOY_OFFICIAL_VERSION ENV DOKPLOY_FORK_VERSION=$DOKPLOY_FORK_VERSION +# Node sizes the young generation from the host's RAM: on a 4 GB server it +# grows to ~60 MB under load, while the panel's short-lived request garbage +# fits in far less. A service-level NODE_OPTIONS replaces this value. +ENV NODE_OPTIONS=--max-semi-space-size=16 # Recommends would add systemd, dbus and X11 libraries; the packages the panel # calls are listed instead: openssh-client for git over SSH and ssh-keyscan,