diff --git a/docs/25-tasas-del-kernel.md b/docs/25-tasas-del-kernel.md index 5cb52330..999ce225 100644 --- a/docs/25-tasas-del-kernel.md +++ b/docs/25-tasas-del-kernel.md @@ -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. diff --git a/docs/evidencia/tasas-kernel-2026-08-29/contrato-h1-pagado.txt b/docs/evidencia/tasas-kernel-2026-08-29/contrato-h1-pagado.txt new file mode 100644 index 00000000..4ba1afb9 --- /dev/null +++ b/docs/evidencia/tasas-kernel-2026-08-29/contrato-h1-pagado.txt @@ -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 diff --git a/docs/state/kernel-contract.toml b/docs/state/kernel-contract.toml index 504916cd..bdfe6f12 100644 --- a/docs/state/kernel-contract.toml +++ b/docs/state/kernel-contract.toml @@ -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"