tasas: H1 PAGADO — los cuatro kernels de Cards ya traen MEMCG y PSI
hammer kernel contract --sealed: 5 de 5 vigentes cumplen su perfil, exit 0. Antes eran 2 de 11. Una Card que pide memory.max ahora encuentra el fichero en vez de dejar un warn! y correr sin tope. Lo medido, no lo supuesto: - el x86_64_defconfig de 7.1 ya NO trae MEMCG=y ⇒ había que pedirlo explícito; - MEMCG no tiene ningún depends on, así que el olddefconfig no podía tragárselo — comprobado igual contra el .config producido, que es la regla del guardián; - precio: +80 KiB en linux-generic (+0,49%), +84 en linux-metal, +88 en linux-metal-dual, +80 en linux-gioser (+0,71%). Medio punto de kernel por contabilidad por unidad y presión. Evidencia cruda en docs/evidencia/tasas-kernel-2026-08-29/contrato-h1-pagado.txt, con el diff-back del plan de gioser sobre su config nuevo (35 cumplidos, 0 incumplidos). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ACUcwo9mZsE5ocYVE9npih
This commit is contained in:
+34
-13
@@ -26,10 +26,12 @@ El espejo de este documento para el lado tawasuyu es
|
||||
`cgroup` v2 agregado, `posix_spawn`, `getdents64`, `close_range`, `openat2`. Cero código
|
||||
de kernel, ganancias de 3× a 17× medidas abajo.
|
||||
3. **La medición encontró un bug cruzado que no se buscaba**: los kernels de hammer se
|
||||
construyen **sin `CONFIG_MEMCG`**, y arje/sandokan escriben `memory.max` ignorando el
|
||||
error. Un límite de memoria pedido por una Card **no se aplica y nadie se entera**. §4.
|
||||
Confirmado después sobre los **11 `.config` sellados**, no deducido del defconfig (§4.bis), y
|
||||
ya vigilado por `hammer kernel contract` (§4.ter): 2 de 11 cumplen su perfil.
|
||||
construían **sin `CONFIG_MEMCG`**, y arje/sandokan escriben `memory.max` ignorando el
|
||||
error. Un límite de memoria pedido por una Card **no se aplicaba y nadie se enteraba**. §4.
|
||||
Confirmado sobre los **11 `.config` sellados**, no deducido del defconfig (§4.bis), vigilado
|
||||
por `hammer kernel contract` (§4.ter) y **PAGADO el 2026-08-30**: los cuatro kernels que
|
||||
hospedan Cards se reconstruyeron con `MEMCG` y `PSI` y el barrido sale **5 de 5 vigentes en
|
||||
verde** (§7-H1).
|
||||
4. **Sondear `/proc` no es lento, es ciego** (§9.1): de 200 procesos de vida mínima, un sondeo
|
||||
cada 100 ms vio **cero**; el proc connector, los 200. Y **el «copiar en O(1)» existe pero no en
|
||||
ext4**: en xfs/btrfs un reflink de 512 MiB tarda 0,020 ms contra 512,7 ms de `read+write`
|
||||
@@ -339,8 +341,10 @@ Tres decisiones que valen la pena nombrar:
|
||||
qué, y **cero vigentes con superados a la vista sale ≠0**, no verde — el vacío leído como
|
||||
presencia (CLAUDE.md §3) es justo el fallo que este guardián vino a arreglar.
|
||||
|
||||
Estado medido hoy: **2 de 11 configs sellados cumplen su perfil** (los dos `linux`), los 9 de
|
||||
perfil `anfitrion-cards` fallan por `MEMCG`. El kernel vivo de esta máquina pasa las 11 exigidas.
|
||||
Estado al escribirlo: **2 de 11 configs sellados cumplían su perfil** (los dos `linux`), los 9 de
|
||||
perfil `anfitrion-cards` fallaban por `MEMCG`. **Estado tras pagar H1 (2026-08-30): 5 de 5 vigentes
|
||||
cumplen**, y los 10 sellados que quedaron atrás salen listados como superados. El kernel vivo de
|
||||
esta máquina pasa las 11 exigidas.
|
||||
|
||||
Lo que **sí** funciona en un kernel hammer: `cpu.weight` (CGROUP_SCHED), `pids.max`
|
||||
(CGROUP_PIDS), `cpu.stat` (rstat del core) y `cgroup.freeze` — este último porque el freezer
|
||||
@@ -392,13 +396,25 @@ Su precio, concreto:
|
||||
|
||||
## 7. Propuestas — lado hammer
|
||||
|
||||
- **H1 · `-e MEMCG -e PSI` en las cuatro recetas de kernel.** Cierra §4 y habilita
|
||||
`memory.current` (T4) y las señales de presión. **Precio declarado**: re-hashea todos los
|
||||
artefactos de kernel ⇒ hacerlo en la misma tanda que cualquier otro cambio de kernel, nunca
|
||||
suelto. **Sigue PENDIENTE a propósito** — pero ya no puede olvidarse: desde §4.ter
|
||||
`hammer kernel contract --sealed` sale distinto de cero mientras falte. Cuando se pague, el
|
||||
mismo comando es la prueba de que se pagó. Nota de alcance: en `linux.toml` (perfil
|
||||
`qemu-serial`) NO corre — su hash es el baseline del selfhost-verify y ahí no hay Cards.
|
||||
- **H1 · `-e MEMCG -e PSI` en los kernels que hospedan Cards. PAGADO 2026-08-30.** Cierra §4 y
|
||||
habilita `memory.current` (T4) y las señales de presión. Se hizo en **una sola tanda** —el precio
|
||||
era el re-hasheo de todos los artefactos de kernel— sobre `linux-generic`, `linux-metal`,
|
||||
`linux-metal-dual` y la derivada `linux-gioser`, que hubo que **regenerar**: una receta derivada
|
||||
inlinea la fase `configure` de su base y sin regenerarla se queda con la vieja. En `linux.toml`
|
||||
(perfil `qemu-serial`) NO corre: su hash es el baseline del selfhost-verify y ahí no hay Cards.
|
||||
|
||||
Tres cosas que valen para la próxima:
|
||||
|
||||
1. **El `x86_64_defconfig` de 7.1 ya no trae `MEMCG=y`** — de ahí que hiciera falta pedirlo. Y
|
||||
`MEMCG` no tiene un solo `depends on` (sólo `select`s), así que el `olddefconfig` no se lo
|
||||
podía tragar; se comprobó igual **contra el `.config` producido**, que es la regla.
|
||||
2. **Precio en bytes, medido**: bzImage `linux-generic` 16 856 064 → 16 937 984 (**+80 KiB,
|
||||
+0,49%**), `linux-metal` +84 KiB (+0,57%), `linux-metal-dual` +88 KiB (+0,53%), `linux-gioser`
|
||||
+80 KiB (+0,71%). Contabilidad por unidad y presión, por medio punto porcentual de kernel.
|
||||
3. **La prueba de que se pagó es el mismo comando**: `hammer kernel contract --sealed` sale 0 y
|
||||
dice `5 de 5 config(s) VIGENTES cumplen su perfil`. La salida cruda quedó en
|
||||
`docs/evidencia/tasas-kernel-2026-08-29/contrato-h1-pagado.txt`, junto con el `diff-back` del
|
||||
plan de gioser sobre el config nuevo (35 cumplidos, 0 incumplidos).
|
||||
- **H2 · `MODULES=n` se queda.** Si algún día hace falta código de kernel, es built-in y
|
||||
parcheado en la receta. Queda escrito para no rediscutirlo.
|
||||
- **H3 · `harkaq` usa `openat2 RESOLVE_BENEATH|RESOLVE_NO_SYMLINKS`** donde hoy valida rutas
|
||||
@@ -565,3 +581,8 @@ Se compilan igual que los otros (`bench_sqpoll` pide `-luring`) y los tres prime
|
||||
**Contrato de capacidades**: `docs/state/kernel-contract.toml` (el dato) y
|
||||
`hammer kernel contract --list` (la vista). Los ficheros de esta carpeta no cambian; el contrato sí
|
||||
—cada vez que un consumidor nuevo usa el kernel por nombre.
|
||||
|
||||
**El pago de H1** (2026-08-30): `contrato-h1-pagado.txt` — el barrido entero con los cuatro kernels
|
||||
reconstruidos (5 de 5 vigentes en verde, 10 superados listados) y el `diff-back` del plan de gioser
|
||||
contra su `.config` nuevo. Es la única salida de esta carpeta que sí cambia si se vuelve a correr:
|
||||
las demás son mediciones de un momento, ésta es un veredicto de hoy.
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
contrato docs/state/kernel-contract.toml
|
||||
|
||||
✓ linux · ./store/d2a03c29930b72c3d13a8b2931c25bbe80af289689db7fbcd029e11a9cc786cc-linux/boot/config-6.16.12
|
||||
perfil qemu-serial (9 capacidad(es) miradas)
|
||||
kernel Linux/x86_64 6.16.12 Kernel Configuration
|
||||
· falta (no bloquea) limite-memoria — Tope de memoria por unidad [MEMCG]
|
||||
✓ las 5 capacidades exigidas están
|
||||
|
||||
✓ linux-generic · ./store/23f1cc43ac85e0b26763ca3444258ace8d93008c6c3ec442051c4dd9a662a189-linux-generic/boot/config-7.1.2-generic
|
||||
perfil anfitrion-cards (13 capacidad(es) miradas)
|
||||
kernel Linux/x86_64 7.1.2 Kernel Configuration
|
||||
✓ las 11 capacidades exigidas están
|
||||
|
||||
✓ linux-gioser · ./store/b026fe145235181614b6797b697e9ae26f680b6d04596c55e9afee155d68baa0-linux-gioser/boot/config-6.16.12-metal
|
||||
perfil anfitrion-cards (13 capacidad(es) miradas)
|
||||
kernel Linux/x86_64 6.16.12 Kernel Configuration
|
||||
✓ las 11 capacidades exigidas están
|
||||
|
||||
✓ linux-metal · ./store/2ed8f54aa64e1a1db8c5a6291568e21a0f8cb9757d0d17cfe9810b369a48ab08-linux-metal/boot/config-6.16.12-metal
|
||||
perfil anfitrion-cards (13 capacidad(es) miradas)
|
||||
kernel Linux/x86_64 6.16.12 Kernel Configuration
|
||||
✓ las 11 capacidades exigidas están
|
||||
|
||||
✓ linux-metal-dual · ./store/714f46d63736414b2e08816e5a08249e175d5b9eac4fe653af50fc6ab4c2eee1-linux-metal-dual/boot/config-7.1.2-metal-dual
|
||||
perfil anfitrion-cards (13 capacidad(es) miradas)
|
||||
kernel Linux/x86_64 7.1.2 Kernel Configuration
|
||||
✓ las 11 capacidades exigidas están
|
||||
|
||||
· 10 sellado(s) SUPERADO(s) por la receta de hoy — no bloquean, 9 con faltas:
|
||||
linux · ./store/fda2ec4a245fd97df56b0db5c66856fe9de51970af5690b02f995a6dacd2cc40-linux/boot/config-6.16.12 cumplía
|
||||
linux-generic · ./store/16ac6e5e299f9200585b0c28f3b76a59e16eaaf91fb154edd6ae07a5b1821734-linux-generic/boot/config-7.1.2-generic le falta: limite-memoria
|
||||
linux-generic · ./store/1c8625f7d2fe6fc574533b1f44dfd1f5fd2716fe164d8bf015a87d376e63e631-linux-generic/boot/config-7.1.2-generic le falta: limite-memoria
|
||||
linux-generic · ./store/9a79714519324f72c60c367969c5d0a24b1ce7dfd602ccc179b97c5b294269b2-linux-generic/boot/config-7.1.2-generic le falta: limite-memoria
|
||||
linux-gioser · ./store/8ffd57109a2f7102c1bbbbc91cf0e729047312eee1a4e3fdb8b178680cc94264-linux-gioser/boot/config-6.16.12-metal le falta: limite-memoria
|
||||
linux-metal · ./store/5cb11c344347caf0f136af249e3ad8141264a0d8756a7bc3392854eea6dc23cd-linux-metal/boot/config-6.16.12-metal le falta: limite-memoria
|
||||
linux-metal · ./store/bc995714b06984ae7d053af9d8263287a024afbe979565482dacbe192a5899c3-linux-metal/boot/config-6.16.12-metal le falta: limite-memoria
|
||||
linux-metal · ./store/e057bf40b11cd766e4ec834e96c794ded7702cc7fc8ee4112abfc8ae5dcf4487-linux-metal/boot/config-6.16.12-metal le falta: limite-memoria
|
||||
linux-metal-dual · ./store/e6e8fec7f22ab1784a7c2881350a36cb5a8c7b6f8ed99061d5bc5a7f45f8a4ae-linux-metal-dual/boot/config-7.1.2-metal-dual le falta: limite-memoria
|
||||
linux-metal-dual · ./store/ef4f220225e8490fbbaa2f0736252fa7619da7ed79dd601ba9b17f9cc619c423-linux-metal-dual/boot/config-7.1.2-metal-dual le falta: limite-memoria
|
||||
Siguen siendo ciertos: si una máquina arranca uno de éstos, sus Cards corren con lo que ese kernel traiga. Se reconstruyen o se podan (`scripts/store-gc.sh`).
|
||||
|
||||
resumen 5 de 5 config(s) VIGENTES cumplen su perfil · 10 superado(s)
|
||||
|
||||
|
||||
--- diff-back del plan de gioser sobre el config sellado nuevo ---
|
||||
plan linux-gioser (docs/state/kernel-plans/gioser-plan.json)
|
||||
config ./store/b026fe145235181614b6797b697e9ae26f680b6d04596c55e9afee155d68baa0-linux-gioser/boot/config-6.16.12-metal
|
||||
cumplidos 35
|
||||
apagados por dependencia 4 (no aparecen porque cayeron con su raíz)
|
||||
INCUMPLIDOS 0
|
||||
@@ -38,7 +38,11 @@ Sin MEMCG los ficheros NO EXISTEN. `apply_rlimits_to_cgroup` sólo emite `warn!(
|
||||
failed)` y sigue: la Card corre sin tope y el resto del sistema se entera cuando el OOM killer \
|
||||
elige a otro. Es el fallo de CLAUDE.md §3 — un ausente falla ruidosamente, un vacío llega hasta \
|
||||
el final diciendo que todo fue bien."""
|
||||
notes = "Arreglo: `-e MEMCG` en la fase configure. Re-hashea el kernel (SDD 22 §1) ⇒ va en tanda."
|
||||
notes = """
|
||||
PAGADO 2026-08-30 (SDD 25 §7-H1): `-e MEMCG` en la fase configure de linux-generic, linux-metal, \
|
||||
linux-metal-dual y la derivada linux-gioser, en una sola tanda porque re-hashea el kernel \
|
||||
(SDD 22 §1). Costó +80/84/88/80 KiB de bzImage. `linux.toml` queda fuera a propósito: perfil \
|
||||
qemu-serial, sin Cards, y su hash es el baseline del selfhost-verify."""
|
||||
|
||||
[[capability]]
|
||||
id = "peso-cpu"
|
||||
|
||||
Reference in New Issue
Block a user