gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1436Shell 145Markdown 88Rust 852991 Sutichaykuna

⎇ 8c4e1a6b24489d5c9ac3d1c32a6aafe20ed16404 scripts/farm/hammer-farm.service 38 siq'ikuna · 2.0 KB Ñawpa willay ch'uya

granja: freno al crashloop del worker — 30 h de OOM y reinicio en bucle 588fedebc · Sergio ·

1[Unit]
2Description=hammer build farm worker (loop autónomo)
3After=network-online.target
4Wants=network-online.target
5# ── FRENO AL CRASHLOOP (2026-08-31) ──────────────────────────────────────────────────────────────
6# Sin esto, `Restart=always` + una receta que no entra en RAM = bucle infinito. Medido en el LXC
7# dev.gioser.net: `clang18` disparó el OOM killer, systemd relanzó a los 30 s, el loop volvió a la
8# misma receta (build-farm recorre la cola por glob alfabético y clang18 sale primera), OOM otra vez.
9# **30 HORAS así**: la caja quedó con presión de I/O `full avg300=43` —todo bloqueado en disco casi
10# la mitad del tiempo— y sshd sin poder ni completar el banner, o sea imposible de diagnosticar
11# desde fuera. Dos `oom-kill` en el journal fue todo lo que quedó como rastro.
12#
13# 3 arranques en 1 h ⇒ systemd se rinde y deja la unidad en `failed`, VISIBLE en `systemctl status`.
14# Un worker parado y diagnosticable vale más que uno que se reinicia para siempre: el hub ya tolera
15# workers ausentes (cosecha-cron avisa "siembra falló" y sigue), así que rendirse no pierde nada.
16StartLimitIntervalSec=3600
17StartLimitBurst=3
18
19[Service]
20Type=simple
21WorkingDirectory=/opt/hammer
22Environment=HOME=/root
23Environment=HAMMER_DIR=/opt/hammer
24# JOBS no se fija: el loop usa nproc por defecto (cada build usa 1 core por codegen-units=1).
25# Así, al REPOTENCIAR la caja (CCX13→CCX23/33), el worker auto-escala los slots sin tocar config.
26# La línea CCX da ~4GB RAM/core ⇒ nproc slots quedan con margen para builds Rust + swap.
27ExecStart=/opt/hammer/scripts/farm/farm-worker-loop.sh
28Restart=always
29RestartSec=30
30# El OOM del worker NO se reintenta como si fuera un fallo transitorio: si la receta no entra en la
31# caja, no va a entrar en 30 segundos. `stop` deja la unidad detenida y contable por StartLimitBurst.
32OOMPolicy=stop
33# deja respirar al sistema en una caja chica
34Nice=10
35IOSchedulingClass=idle
36
37[Install]
38WantedBy=multi-user.target