Name what actually kills the heavy runs: a per-run cgroup ceiling, not the machine, and say why narrowing the run to fit is the one forbidden cure

This commit is contained in:
heaven 2026-09-11 15:23:17 +03:00
parent d291e7766d
commit 524b2e2808

View file

@ -64,6 +64,19 @@ Go-бэкенд издательского художественного пер
## Гардрейлы (жёсткие)
- **Греп по ЖИВОМУ дереву — с исключением отработанного архива:** `--exclude-dir=prompts --exclude-dir=reports` (либо `grep -rn … docs/ --exclude-dir=prompts --exclude-dir=reports`). Замер 02.09: греп `feed_cap` даёт 4 живых файла и 8 архивных, `bank-stop` — 12 и 14, то есть истории в выдаче больше, чем настоящего. ⚠ **`archive/architecture/` НЕ исключать** — там тела закрытых эр журнала решений, и канон велит грепать «живой файл → слайсы».
- ⛔ **ТЯЖЁЛЫЙ ПРОГОН УБИВАЕТ НЕ НЕХВАТКА ПАМЯТИ НА МАШИНЕ, А ПОТОЛОК ЕГО СОБСТВЕННОГО CGROUP** (замерено
11.09 после ЧЕТЫРЁХ убийств подряд у одной сессии). `dmesg` показывает **26** убийств, и все с
`constraint=CONSTRAINT_MEMCG`, каждое в СВОЁМ транзиентном юните
`tm.slice/tm-runs.slice/tm-test-<тег>-<pid>.service`. Сами слайсы при этом `memory.max = max` — лимита
на них НЕТ. ⇒ **гасить чужие процессы бесполезно: машина в этот момент имела 5.7 ГБ доступных.**
⚠ И потолок НЕ у всех одинаковый: прогон, запущенный одной сессией, попадал в capped-юнит, а тот же
прогон из другой шёл в `/init.scope` с `memory.max = max` и доходил до конца. ⇒ **прежде чем объяснять
падение нагрузкой, спроси `cat /proc/self/cgroup` и `memory.max` этого cgroup** — и если потолок есть,
перенеси прогон, а не режь его.
⛔ **И чего делать НЕЛЬЗЯ, даже когда убило четыре раза подряд: сужать мутационный прогон через `-run`,
чтобы влезть в память.** Подмножество `-run` не есть пакет: базовый прогон перестаёт быть базовым, и
вердикт «поймана» становится утверждением о другом предмете. **Лучше не измерить, чем измерить не то**
формулировка зоны, выбравшей честную сторону при максимальном соблазне.
- ⛔ **ДВА СВОЙСТВА ЭТОЙ СРЕДЫ, каждое даёт ТИХИЙ ЛОЖНЫЙ НОЛЬ** (замерено 11.09, поймано двумя ролями независимо).
**(а) `grep` здесь — не GNU grep, а shell-обёртка над ugrep с `--ignore-files`: она чтит `.gitignore` и
НЕ ВИДИТ каталог `books/`,** то есть всё платное сырьё проекта. Замер: `grep -rl '^terms:' .` → **13**